プロシジャルーチン内の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)オブジェクトのクローズ
4.4 プロシジャルーチン利用時のトランザクション
JDBCドライバを使用したアプリケーションでのトランザクション状態の変更は、commitメソッドまたはrollbackメソッドで行 います。
プロシジャルーチンに、SQL文のCOMMIT文やROLLBACK文が定義されていると、エラーが発生する場合があります。
プロシジャルーチンには、COMMIT文やROLLBACK文を定義しないでください。