Symfoware Parallel Server RDBユーザーズガイド 応用プログラム開発編 |
目次
索引
![]() ![]() |
第3章 プロシジャを利用する応用プログラムの作成方法 |
ここでは、プロシジャルーチン内での処理結果の確認方法と、プロシジャルーチンの呼出し元の応用プログラムでの処理結果の確認方法について説明します。
プロシジャルーチン内の処理結果は、応用プログラムの場合と同様に、SQLSTATEとSQLMSGに通知されます。利用者は、SQLSTATEおよびSQLMSGをSQL変数として宣言しておき、その内容を参照することによって処理の切り分けを行うことができます。また、WHENEVER文により、SQL文の処理にエラーがあった場合または検索データが見つからなかった場合の処理を指定することができます。
ただし、SQLSTATE値の例外コードの先頭が4または7の場合、および例外コードが2Fの場合は、呼出し元の応用プログラムに無条件に復帰します。
プロシジャルーチンを呼び出した応用プログラムのSQLSTATEおよびSQLMSGには、以下の実行結果がプロシジャルーチンから通知されます。
SQLSTATE値の例外コードの先頭が4または7の場合および例外コードが2Fの例外事象
SQLSTATE値が00000の実行結果
これら以外のメッセージまたは実行結果を呼出し元に通知する場合は、プロシジャルーチンのパラメタ変数に設定して実行結果を通知します。
図:プロシジャルーチンの呼出し元での処理結果の確認および図:プロシジャルーチン内での処理結果の設定に、呼出し元とプロシジャルーチン内での処理結果の確認の具体例を示します。
#include <stdio.h> EXEC SQL BEGIN DECLARE SECTION; char BUF[256]; char SQLSTATE[6]; * char SQLMSG[256]; * (1) char PROCSTATE[6] ; | char PROCMSG[256] ; * EXEC SQL END DECLARE SECTION; main() { memset( SQLMSG, 0xff, 256 ); memset( SQLSTATE, '0', 5 ); strcpy( BUF, "CALL スキーマ00.PCALL000(?,?)"); EXEC SQL WHENEVER SQLERROR GOTO :ERR_SQL; 〜 EXEC SQL PREPARE 識別子 FROM :BUF ; EXEC SQL EXECUTE 識別子 INTO :PROCSTATE,:PROCMSG ; (2) 〜 if(memcmp(PROCSTATE ,"00000",5) != 0) { (3) printf("PCALL000内で異常発生\n"); printf(" エラーコード ===> %s\n", PROCSTATE); printf(" エラーメッセージ ===> %s\n", PROCMSG); goto ERR_EXIT; } 〜 EXEC SQL COMMIT WORK ; return(0); ERR_SQL: printf("異常発生\n"); (4) printf(" エラーコード ===> %s\n", SQLSTATE); printf(" エラーメッセージ ===> %s\n", SQLMSG); ERR_EXIT: EXEC SQL ROLLBACK ; return(1); } |
(1) SQLSTATE、SQLMSGおよびプロシジャルーチンのパラメタをホスト変数として宣言します。
(2) プロシジャルーチンPCAL000を呼び出します。
(3) プロシジャルーチンのパラメタPROCSTATEが“00000”以外の場合は、プロシジャルーチン内で異常が起きたとみなし、エラーコードとメッセージを表示して終了します。
(4) 応用プログラムでエラーが起きた場合の処理を行います。
EXEC SQL CREATE PROCEDURE スキーマ00.PCALL000( OUT PROCSTATE CHAR(5), OUT PROCMSG CHAR(256) ) (1) BEGIN DECLARE SQLSTATE CHAR(5) ; (2) DECLARE SQLMSG CHAR(256) ; DECLARE VDDEC DEC(18,0) DEFAULT 1 ; 〜 DECLARE CUR1 CURSOR FOR SELECT 製品番号, … 〜 WHENEVER SQLERROR GOTO 異常1; (3) 〜 OPEN CUR1; 〜 FETCH CUR1 INTO … 〜 異常1: -- 結果をプロシジャルーチンのパラメタに設定する. SET PROCSTATE = SQLSTATE ; (4) SET PROCMSG = SQLMSG ; END END-EXEC; |
(1) CREATE PROCEDURE文にパラメタを定義します。
(2) SQLSTATEとSQLMSGをSQL変数として宣言します。
(3) SQL文で異常が起きた場合は、異常1に進みます。
(4) 呼出し元の応用プログラムに通知するため、SQLSTATEおよびSQLMSGの内容を、プロシジャルーチンのパラメタに設定します。
目次
索引
![]() ![]() |