機能
記述形式
参照項番
値指定 → “2.3 値指定と相手指定”
列指定 → “2.4 列指定”
権限
CALL文を実行できるのは、そのプロシジャルーチンのEXECUTE権の保持者です。
一般規則
呼び出すプロシジャルーチンの名前を指定します。
ルーチン名はスキーマ名で修飾した識別子で記述しますが、スキーマ名は省略できる場合があります。スキーマ名修飾の詳細は、“D.2 名前に関する注意事項”を参照してください。
引数は、プロシジャルーチン定義時のパラメタのデータ型に対して代入できることが必要です。
引数の値指定には定数、USER、SQL変数、パラメタ変数、埋込み変数または動的パラメタ指定のいずれかを指定します。
プロシジャルーチン定義のパラメタモードにOUT、またはINOUTを指定した場合、引数の値指定にはSQL変数名、パラメタ変数名、埋込み変数名、動的パラメタ指定以外を指定することはできません。
CALL文を被トリガSQL文に指定する場合のみ、引数に列指定を指定することができます。
指定する引数の個数は、プロシジャルーチン定義で指定したパラメタ宣言の個数に一致していることが必要です。
プロシジャルーチン定義時のパラメタの順番に引数を指定することが必要です。
CALL文が異常終了する場合、パラメタモードがOUTまたはINOUTのパラメタの値は呼出し元に返却されません。
CALL文を実行することによってトランザクション区間が区切れることはなく、プロシジャルーチン内に記述されているSQL手続き文はCALL文の直前のトランザクションの状態で実行されます。
プロシジャルーチン内でCOMMIT文またはROLLBACK文が実行されると、CALL文以前から継続しているトランザクションは完了します。
トリガから実行されるプロシジャルーチンでは、COMMIT文またはROLLBACK文は実行できません。
プロシジャルーチン内のSQL文の実行でエラーが起きた場合は、エラーを起こしたSQL文が無効となります。ただし、SQLSTATE値の例外コードが40の場合は、トランザクションはロールバックされます。
プロシジャルーチン内でのSQL文の実行時は、動作環境ファイルのTRAN_SPECの指定は無効となります。アプリケーションに復帰した後は、TRAN_SPECの指定に従って制御されます。
値指定に動的パラメタ指定が指定された場合のDESCRIBE情報は、対応するプロシジャルーチンのパラメタのデータ型になります。
備考.CALL文で指定された動的パラメタ指定のDESCRIBE情報は、以下のように設定されます。
対応するプロシジャルーチンのパラメタのパラメタモードがINまたはINOUTの場合は、入力DESCRIBE文でDESCRIBE情報が設定されます。
対応するプロシジャルーチンのパラメタのパラメタモードがOUTまたはINOUTの場合は、出力DESCRIBE文でDESCRIBE情報が設定されます。
使用例
アプリケーションからスキーマ名SCM1で修飾してルーチンPRC01を呼び出します。パラメタモードがINのパラメタに対して埋込み変数名を指定します。
アプリケーションの記述内容
EXEC SQL BEGIN DECLARE SECTION; char SQLSTATE[6]; Long H1; char H2[21]; EXEC SQL END DECLARE SECTION; H1 = 1000000; strcpy(H2,"Shinkansen"); EXEC SQL CALL SCM1.PRC01(:H1,:H2); ・・・
ルーチンPRC01の定義内容
CREATE PROCEDURE SCM1.PRC01( IN P1 INTEGER, IN P2 CHAR(20) ) BEGIN DECLARE SQLSTATE CHAR(5); DECLARE SQLMSG CHAR(255); INSERT INTO SCM1.TBL1(CLM_INT,CLM_CHAR) VALUES(P1,P2); END
ルーチンPRC02からスキーマ名“在庫管理”で修飾してルーチン“テレビ在庫確認”を呼び出します。パラメタモードがINおよびOUTのパラメタに対してパラメタ名およびSQL変数名を指定します。
ルーチンPRC02の定義内容
CREATE PROCEDURE SCM1.PRC02( IN P倉庫番号 SMALLINT, OUT P在庫数量 INTEGER ) BEGIN DECLARE SQLSTATE CHAR(5); DECLARE SQLMSG CHAR(255); DECLARE V製品番号 SMALLINT DEFAULT 100; DECLARE V製品名 NCHAR(10) DEFAULT N'テレビ'; CALL 在庫管理.テレビ在庫確認( V製品番号,V製品名,P倉庫番号,P在庫数量); END
ルーチン“テレビ在庫確認”の定義内容
CREATE PROCEDURE 在庫管理.テレビ在庫確認( IN 検索番号 SMALLINT, IN 検索製品名 NCHAR(10), IN 検索倉庫 SMALLINT, OUT 結果数量 INTEGER ) BEGIN DECLARE SQLSTATE CHAR(5); DECLARE SQLMSG CHAR(255); SELECT 在庫数量 INTO 結果数量 FROM S1.在庫表 WHERE 製品番号 = 検索番号 AND 製品名 = 検索製品名 AND 倉庫番号 = 検索倉庫; IF SQLSTATE <> '00000' THEN SET 結果数量 = NULL;-- 検索できなかった場合はNULL値を返却 END IF; END