ここでは、プロシジャルーチン内での処理結果の確認方法と、プロシジャルーチンの呼出し元のアプリケーションでの処理結果の確認方法について説明します。
プロシジャルーチン内のSQL手続き文の実行中に、例外コード40の例外(ロールバック例外)が発生した場合は、トランザクションをロールバックし、呼出し元のアプリケーションに無条件に復帰します。このときの例外事象は呼出し元のSQLSTATEおよびSQLMSGに通知されます。
プロシジャルーチン内のSQL手続き文の実行中に、例外コード40以外の例外が発生した場合は、処理結果はプロシジャルーチン内のSQLSTATEとSQLMSGに通知されます。利用者は、プロシジャルーチン内にSQLSTATEおよびSQLMSGをSQL変数として宣言しておき、その内容を参照することによって例外事象を知ることができます。
プロシジャルーチン内ではハンドラを使用することができます。ハンドラとは、プロシジャルーチン実行中に例外が発生した際に実行されるサブルーチンです。ハンドラ宣言はどのような例外が発生した場合にどのような動作を行うかを指定します。プロシジャルーチン実行中に例外コード40以外の例外が発生した際、該当するハンドラが呼び出され、特定の処理を行い、プロシジャルーチンの処理を回復することができます。ハンドラ宣言が1つ以上指定されている状態で、かつ、該当するハンドラが存在しなかった場合は、ハンドラで処理されなかったとして、発生した例外のSQLSTATEおよびSQLMSGが呼び出し元に返却されます。
注意
ハンドラ宣言が1つも指定されていない状態で、プロシジャルーチン実行中に例外コード40以外の例外が発生した場合は、発生した例外のSQLSTATEおよびSQLMSGは呼び出し元に返却されません。この場合は、プロシジャルーチン内のSQLSTATEとSQLMSGに通知された内容を参照することにより、例外事象を確認します。
また、ハンドラ動作内で新たに例外が発生した場合、ハンドラ動作は終了して、新たに発生した例外のSQLSTATEおよびSQLMSGが呼び出し元に返却されます。
CALL文を実行して、プロシジャルーチンに記述された一連の処理が中断なく実行された場合、呼出し元のSQLSTATEおよびSQLMSGには正常終了が通知されます。例外によってプロシジャルーチンが実行されない、またはプロシジャルーチン内で例外が発生して処理が中断された場合は、その例外事象が呼出し元のSQLSTATEおよびSQLMSGに通知されます。プロシジャルーチンが実行されない場合とは、アクセス規則違反や、CALL文引数とプロシジャルーチンのパラメタ間の代入エラーが発生した場合などがあります。プロシジャルーチンの処理が中断される場合とは、プロシジャルーチン内のSQL手続き文で例外コード40の例外(ロールバック例外)が発生した場合、発生した例外がハンドラで処理されない場合、またはハンドラ動作中に新たに例外が発生した場合です。
プロシジャルーチンの呼出し元での処理結果の確認(RDO)および図4.3 プロシジャルーチン内の処理結果の通知方法に、具体例を示します。
Dim Env As rdoEnvironment Dim Con As rdoConnection Dim Qry As rdoQuery Dim msgstr As String Set Env = rdoEngine.rdoEnvironments(0) '(1)エラー処理ルーチンの設定 On Error GoTo ErrorProc 'コネクション接続 Set Con = Env.OpenConnection("DSN01", rdDriverNoPrompt, _ False, "UID=USER01;PWD=PASS01;") '(2)プロシジャルーチンの呼び出し Set Qry = Con.CreateQuery("", "CALL スキーマ00.PCALL000(?,?,?)") Qry.rdoParameters(0).Value = 1 Qry.rdoParameters(1).Value = 1 Qry.rdoParameters(2).Value = "顧客1" Qry.Execute Con.Close Set Qry = Nothing Set Con = Nothing Set Env = Nothing Exit Sub '(3) エラー処理 ErrorProc: Err_Count = rdoEngine.rdoErrors.Count If Err_Count > 0 Then msgstr = "プロシジャルーチン実行で異常発生" & Chr(10) For i = 0 To Err_Count - 1 msgstr = msgstr & " エラーコード ===> " & _ rdoEngine.rdoErrors(i).SQLState & Chr(10) msgstr = msgstr & " エラーメッセージ ===> " & _ rdoEngine.rdoErrors(i).Description & Chr(10) Next rdoEngine.rdoErrors.Clear End If MsgBox msgstr, vbOKOnly, "Error" Con.Close Set Qry = Nothing Set Con = Nothing Set Env = Nothing
(1) エラー処理のルーチンをErrorProcに設定します。
(2) プロシジャルーチンPCALL000を呼び出します。
(3) CALL文の結果がエラーだった場合、SQLSTATEおよびSQLMSGを表示して終了します。
RDOおよびRDO以外を利用したエラー処理の詳細は、それぞれ以下を参照してください。
RDO連携時:C.2.9 エラー処理
ADO連携時:C.3.11 エラー処理
ADO.NET連携時:C.5.10 エラー処理