ページの先頭行へ戻る
Symfoware Server V10.0.0/V10.0.1 アプリケーション開発ガイド(埋込みSQL編)

5.1.3 プロシジャルーチンの処理結果

ここでは、プロシジャルーチン内での処理結果の確認方法と、プロシジャルーチンの呼出し元のアプリケーションでの処理結果の確認方法について説明します。

プロシジャルーチン内での処理結果の確認

プロシジャルーチン内の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の例外(ロールバック例外)が発生した場合、発生した例外がハンドラで処理されない場合、またはハンドラ動作中に新たに例外が発生した場合です。

以下に具体例を示します。

#include <stdio.h>
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR BUF[256];
char    SQLSTATE[6];                                         …… (1)
char    SQLMSG[256];
long    DENPYO;
long    DCODE;
char    CNAME[41];
EXEC SQL END DECLARE SECTION;

main()
{
    memset( SQLSTATE, 0x00, sizeof(SQLSTATE) );
    memset( SQLMSG,   0x00, sizeof(SQLMSG) );
    strcpy( BUF.sqlvar, "CALL スキーマ00.PCALL000(?,?,?)" );
    BUF.sqllen = strlen( BUF.sqlvar );

    EXEC SQL WHENEVER SQLERROR GOTO :ERR_SQL;
      :
    EXEC SQL PREPARE 識別子 FROM :BUF;
    EXEC SQL EXECUTE 識別子 USING :DENPYO,:DCODE,:CNAME;      …… (2)
      :
    EXEC SQL COMMIT WORK ;
    return(0);

ERR_SQL:
    printf("プロシジャルーチン実行で異常発生\n");             …… (3)
    printf("    エラーコード     ===> %s\n", SQLSTATE);
    printf("    エラーメッセージ ===> %s\n", SQLMSG);

ERR_EXIT:
    EXEC SQL ROLLBACK ;
    return(1);
}

(1) SQLSTATE、SQLMSGおよびプロシジャルーチンのパラメタをホスト変数として宣言します。

(2) プロシジャルーチンPCALL000を呼び出します。

(3) CALL文の結果がエラーだった場合、SQLSTATEおよびSQLMSGを表示して終了します。

図5.3 プロシジャルーチン内の処理結果の通知方法