ここでは、プロシジャルーチン内での処理結果の確認方法と、プロシジャルーチンの呼出し元のアプリケーションでの処理結果の確認方法について説明します。
プロシジャルーチン内の出力パラメタの情報を、CallableStatement.getXXXメソッドで取得できます。registerOutParameterメソッドでJDBCデータ型を指定し、getXXXメソッドでデータを取得してください。
プロシジャルーチン内のSQL手続き文の実行中に、例外コード40の例外(ロールバック例外)が発生した場合は、トランザクションをロールバックし、呼出し元のアプリケーションに無条件に復帰します。このときの例外事象は、呼出し元にエラーメッセージとSQLSTATEを通知します。
プロシジャルーチン内のSQL手続き文の実行中に、例外コード40以外の例外が発生した場合は、エラーメッセージとSQLSTATEを通知します。
プロシジャルーチン内ではハンドラを使用することができます。ハンドラとは、プロシジャルーチン実行中に例外が発生した際に実行されるサブルーチンです。ハンドラ宣言はどのような例外が発生した場合にどのような動作を行うかを指定します。プロシジャルーチン実行中に例外コード40以外の例外が発生した際、該当するハンドラが呼び出され、特定の処理を行い、プロシジャルーチンの処理を回復することができます。ハンドラ宣言が1つ以上指定されている状態で、かつ、該当するハンドラが存在しなかった場合は、ハンドラで処理されなかったとして、発生した例外のSQLSTATEおよびSQLMSGが呼び出し元に返却されます。
注意
ハンドラ宣言が1つも指定されていない状態で、プロシジャルーチン実行中に例外コード40以外の例外が発生した場合は、発生した例外のSQLSTATEおよびSQLMSGは呼び出し元に返却されません。この場合は、プロシジャルーチン内のSQLSTATEとSQLMSGに通知された内容を参照することにより、例外事象を確認します。
また、ハンドラ動作内で新たに例外が発生した場合、ハンドラ動作は終了して、新たに発生した例外のSQLSTATEおよびSQLMSGが呼び出し元に返却されます。
例外によってプロシジャルーチンが実行されない、またはプロシジャルーチン内で例外が発生して処理が中断された場合は、その例外事象が呼出し元のSQLSTATEおよびSQLMSGに通知されます。プロシジャルーチンが実行されない場合とは、アクセス規則違反や、プロシジャルーチンのパラメタ間の代入エラーが発生した場合などがあります。プロシジャルーチンの処理が中断される場合とは、プロシジャルーチン内のSQL手続き文で例外コード40の例外(ロールバック例外)が発生した場合、発生した例外がハンドラで処理されない場合、またはハンドラ動作中に新たに例外が発生した場合です。
以下に、具体例を示します。
CallableStatement cstmt = con.prepareCall( "{CALL GENERAL.PROC01[?,?,?]}"); cstmt.setInt(1,7); cstmt.setString(2,"bird"); cstmt.registerOutParameter(2,java.sql.Types.CHAR); (1) cstmt.registerOutParameter(3,java.sql.Types.INTEGER); (1) cstmt.executeUpdate(); int iID = 0; String sName = null; sName = cstmt.getString(2); (2) iID = cstmt.getInt(3); (2) System.out.println("ID = " + iID); (2) System.out.println("NAME = " + sName); (2) cstmt.close(); (3)
(1)JDBCデータ型の設定
(2)出力パラメタからのデータ取得
(3)オブジェクトのクローズ