INCLUDE ステートメント
INCLUDE ステートメントは、宣言やステートメントなどのアプリケーション・コードを SQL ルーチン本体に挿入します。 インクルードされるコードには、ルーチン定義に即時に追加される SQL コード、 または SQL プロシージャー、SQL 関数、または SQL トリガーの作成時に追加される ILE C コードのいずれかが可能です。
権限
このステートメントの権限 ID は、メンバーを含むファイルについて、 *OBJOPR および *READ のシステム権限を持つ必要があります。
構文
>>-INCLUDE--+-SQL--+-member-name---------------------------------------+-+->< | | .-*LIBL--/--------. | | | +-+-----------------+--file-name--(--member-name--)-+ | | | +-*CURLIB--/------+ | | | | '-library-name--/-' | | | '-'string'------------------------------------------' | '-+-library-name--/--file-name--(--member-name--)-+----------' '-'string'--------------------------------------'
説明
INCLUDE ステートメントは、 ソースの中で、インクルードされるソース・ステートメントが構文的に受け入れられる場所に指定しなければなりません。 INCLUDE ステートメントのどちらの形式も、複合ステートメント の本体内の SQL プロシージャー・ステートメント として指定できます。 INCLUDE SQL ステートメントは、複合ステートメント の宣言およびハンドラー内でも指定可能です。 1 つのステートメントで指定できるインクルードの数に制限はありませんが、 インクルードされるソースが、埋め込みのインクルードを含むことはできません。- SQL
インクルードされるソースには、SQL ルーチン本体 または SQL トリガー本体 に使用できる SQL 構文のみが含まれます。 これらのステートメントは、SQL ルーチン本体 または SQL トリガー本体 の一部としてインラインで展開されます。 これらは、ステートメントのステートメント・テキストに直接含まれるかのように処理されます。 SQL プロシージャー、関数、またはトリガー用に保管されたステートメント・テキストは、このインクルードされたソースを含みます。 QSYS2.GENERATE_SQL プロシージャーが使用されると、生成ソースでは、INCLUDE SQL が使用されたところで、展開された SQL ステートメントが表示されます。
- member-name
- SQL プロシージャー、SQL 関数、または SQL トリガーの中にインクルードするメンバーを識別します。 ソース・ファイルとライブラリーは、SET OPTION ステートメントの INCFILE オプションを使用して判別されます。 詳しくは、SET OPTIONを参照してください。
- file-name ( member-name )
- SQL プロシージャー、SQL 関数、または SQL トリガーの中にインクルードするソース・ファイルおよびメンバーを識別します。
ソース・ファイルを含むライブラリーは、以下のいずれかの方法で指定します。
- *LIBL
- そのジョブのライブラリー・リストのすべてのライブラリーが検索され、見つかった最初の表が使用されます。これはデフォルトです。
- *CURLIB
- ジョブ用の現行ライブラリーが検索されます。 ジョブ用の現行ライブラリーとして指定されたライブラリーがない場合は、QGPL が使用されます。
- library-name
- ライブラリーの名前を識別します。
- 'string'
- インクルードされるソース・ストリーム・ファイルを識別します。 ストリングは、標準 SQL ストリング・リテラルとして処理されます。エスケープ文字に対するソース・ストリーム・ファイル規則には従いません。 接尾部は、ストリングに付加されません。
- SQL を指定しない場合
- インクルードされるソースは、EXEC SQL が前に付いた ILE C 言語ステートメントまたは 組み込み SQL ステートメントのみを含みます。
対応する EXEC SQL INCLUDE ステートメントは、この SQL プロシージャー、SQL 関数、または SQL トリガーに生成されるプログラム・ソースの一部として生成されます。
プロシージャー、関数、またはトリガーの作成中に追加のサービス・プログラムをバインドすることがインクルードで要求される場合は、 SET OPTION ステートメントで BINDOPT オプションを使用して、 他のサービス・プログラムにあるエクスポートを参照するために BNDSRVPGM パラメーターを追加することができます。 詳しくは、SET OPTIONを参照してください。
- library-name / file-name ( member-name )
- SQL プロシージャー、SQL 関数、または SQL トリガーの作成時にインクルードする ILE C 言語ステートメントを含む完全修飾ソース・ファイルおよびメンバーを指定します。
- 'string'
- SQL プロシージャー、SQL 関数、または SQL トリガーの作成時にインクルードする ILE C 言語ステートメントを含むソース・ストリーム・ファイルの完全パスを指定します。
注
CCSID に関する考慮事項: SQL ステートメントの CCSID が INCLUDE ステートメントのソースの CCSID と異なる場合、INCLUDE ソースは、SQL ステートメントの CCSID に変換されます。
ソースに関する考慮事項: C インクルードのソースは、160 ソース列を超えてはなりません。 それより先は切り捨てられます。
SQL インクルードのストリング・リテラルは、組み込んでいるソースの幅より長くてはなりません。
SQL インクルードのソースは、完全な SQL ステートメントを含む必要があります。 これは強制ではありませんが、この規則に違反すると予測不能な結果が発生する可能性があります。
SQL トリガーに関する考慮事項: SQL トリガーが INCLUDE ステートメントを使用して ILE C をインクルードする場合、 トリガー・プログラムの再作成を要求する操作はすべて、インクルード・ファイルへのランタイム依存関係を持ちます。 トリガー・プログラムが見つからない場合は、トリガーが起動されたとき、表がコピーされたとき、または表が復元されたときに、 データベースによってそれを自動的に再作成することができます。 インクルード・ファイルが使用可能でない場合は、トリガーは作成されず、トリガーを要求する関数は失敗します。
例
- INCLUDE ステートメントを使用して、SQL 関数に共通の条件ハンドラーを埋め込みます。
ライブラリー・リスト内のファイル SQLINCLUDE の COMMONCOND には、以下が含まれます。 この条件ハンドラーは、特定の not found 条件に対して SQL プロシージャー ERR_PROC を呼び出します。 メッセージ処理の中で、ROUTINE_SCHEMA および ROUTINE_SPECIFIC_NAME の組み込みグローバル変数を使用して、エラーのソースを示します。CREATE FUNCTION H1 () RETURNS INT DETERMINISTIC NO EXTERNAL ACTION NOT FENCED BEGIN DECLARE RES INT; INCLUDE SQL SQLINCLUDE(COMMONCOND); SET RES = AFUNCTION(); RETURN RES; END;
DECLARE NO_FUNC CONDITION FOR SQLSTATE '42704'; DECLARE CONTINUE HANDLER FOR NO_FUNC BEGIN CALL ERR_PROC(SYSIBM.ROUTINE_SCHEMA CONCAT '.' CONCAT SYSIBM.ROUTINE_SPECIFIC_NAME CONCAT ': Function not found'); END;
- INCLUDE ステートメントを使用して、C 関数の呼び出しを埋め込みます。
これは、Qp0zLprintf インターフェースを使用して入力パラメーターをプリントします。
ライブラリー QGPL のファイル CINCLUDE 内のメンバー MYLPRINTF は、以下のコードを含みます。 このインクルードは、関数の入力パラメーターへの参照を含みます。 生成された C コードを調べて名前を判別する必要があります。CREATE PROCEDURE LPRINTF(P1 VARCHAR(1000)) BEGIN IF P1 IS NOT NULL THEN INCLUDE QGPL/CINCLUDE(MYLPRINTF); END IF; END;
{ /* declare prototype for Qp0zLprintf */ extern int Qp0zLprintf (char *format, ...); /* print input parameter to job log */ Qp0zLprintf("%.*s\n", LPRINTF.P1.LEN, LPRINTF.P1.DAT); }