ページの先頭行へ戻る
Symfoware Server V10.0.0/V10.0.1 SQLリファレンス

3.5 CALL文

機能

プロシジャルーチンの呼出しを行います。

記述形式

構文の構成

参照項番

権限

一般規則

ルーチン名
  • 呼び出すプロシジャルーチンの名前を指定します。

  • ルーチン名はスキーマ名で修飾した識別子で記述しますが、スキーマ名は省略できる場合があります。スキーマ名修飾の詳細は、“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情報について
  • 値指定に動的パラメタ指定が指定された場合のDESCRIBE情報は、対応するプロシジャルーチンのパラメタのデータ型になります。

    備考.CALL文で指定された動的パラメタ指定のDESCRIBE情報は、以下のように設定されます。

    • 対応するプロシジャルーチンのパラメタのパラメタモードがINまたはINOUTの場合は、入力DESCRIBE文でDESCRIBE情報が設定されます。

    • 対応するプロシジャルーチンのパラメタのパラメタモードがOUTまたはINOUTの場合は、出力DESCRIBE文でDESCRIBE情報が設定されます。

使用例

1

アプリケーションからスキーマ名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

2

ルーチン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