【Java】SQL Serverのストアドプロシージャを実行しOUTパラメータを取得する

プロシージャ

DROP PROCEDURE [dbo].[P_TEST]
GO
CREATE PROCEDURE [dbo].[P_TEST]
(
--<引数>
    @CODE               NVARCHAR(8),                --
    @DATE               DATETIME,                   --
    @JRNL_AMT           DECIMAL(14,2),              --
    @RET                DECIMAL(5,0)    OUTPUT,     --エラー番号
    @RESULT_INFORMATION NVARCHAR(100)   OUTPUT      --結果情報
)
AS

--<オプション設定>
SET NOCOUNT ON

--<変数初期化>
SET @RET = 99999
SET @RESULT_INFORMATION = NULL

IF @CODE IS NULL
BEGIN
    SET @RET = 15634
    SET @RESULT_INFORMATION = 'ERROR:15634'
    SET @RESULT_INFORMATION = @RESULT_INFORMATION + '[仕訳金額] はオーバーフローしました。'
    GOTO ERRORHANDLER
END

IF (@@ERROR <> 0) OR ((@RET <> 0) AND (@RET <> 99999))
    BEGIN
    IF(@RESULT_INFORMATION <> NULL)
    BEGIN
        SET @RESULT_INFORMATION	=  'P_TEST'
    END
    GOTO ERRORHANDLER
END
ELSE
--***** 完了 *****--
BEGIN
    SET @RET = 0
    RETURN 0
END

--***** エラーハンドル *****--
ERRORHANDLER:

RETURN 1
GO

JAVA

package test;

import java.math.BigDecimal;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;

public class Procedure {

    public static void main(String[] args) {

        // データベース名、ユーザー名、パスワード
        String dbName = "testserver";
        String user = "test";
        String pass = "test";

        Connection con = null;
        ResultSet rs = null;
        CallableStatement cs = null;

        String sql = "{call P_TEST(?, ?, ?, ?, ?)}";

        try
        {
            // JDBCドライバを指定
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

            // 接続開始
            con = DriverManager.getConnection("jdbc:sqlserver://" + dbName + ";", user, pass);

            cs = con.prepareCall(sql);

            // INパラメータの指定
            cs.setString(1, null);
            cs.setTime(2, null);
            cs.setBigDecimal(3, BigDecimal.valueOf(100.00));

            // OUTパラメータの指定
            cs.registerOutParameter(4, Types.DECIMAL);
            cs.registerOutParameter(5, Types.NVARCHAR);

            // プロシージャの実行
            cs.execute();

            // OUTパラメータの取得
            System.out.println(cs.getBigDecimal(4));
            System.out.println(cs.getNString(5));
        }
        catch(Exception e)
        {
            // コンソールに「接続エラー内容」を表示
            System.err.println(e.getClass().getName() + ":" + e.getMessage());
        }
        finally
        {
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if (cs != null) {
                try {
                    cs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if (con != null) {
                try {
                    con.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}