SQL ステートメントを発行する PL/I アプリケーション
SQL ステートメントは、実行可能なステートメントを使用できる個所であれば、PL/I プログラムのどこにでもコーディングできます。
PL/I プログラムの最初のステートメントは、プログラムがストアード・プロシージャー でない限り、OPTIONS(MAIN) を指定した PROCEDURE ステートメントでなければなりません。 ストアード・プロシージャー・アプリケーションは、サブルーチンとして実行することが できます。
PL / Iプログラムの各SQLステートメントは、EXEC SQLで始まり、セミコロン(;)で終わる必要があります。 EXECおよびSQLキーワードは1行に表示される必要がありますが、ステートメントの残りの部分は後続の行に表示される可能性があります。
PL/I プログラム内で、以下のように UPDATE ステートメントを コーディングすることができます。
EXEC SQL UPDATE DSN8C10.DEPT
SET MGRNO = :MGR_NUM
WHERE DEPTNO = :INT_DEPT ; - コメント
- PL/I のコメントは、ブランクが使用できる個所であれば、キーワード EXEC と SQL の間を除き、組み込み SQL ステートメント内のどこにでも入れることができます。 SQL コメントは、任意の SQL ステートメントに組み込むこともできます。 詳細は、 SQLコメントをご覧ください。
コメントに DBCS 文字を含めるには、シフトアウトおよび シフトイン制御文字で文字を区切らなければなりません。 DBCS ストリング内の最初のシフトイン文字は、DBCS ストリングの終わりを示します。
- SQL ステートメントの継続
- SQL文の行継続ルールは他の PL/I ステートメントと同じですが、
EXEC SQLを1行で指定しなければならない点が異なります。 - SQL ステートメントの区切り文字
- PL/I プログラム内の SQL ステートメントは、開始キーワード
EXEC SQLとセミコロン (;) で区切ります。 - 表およびビューの宣言
- PL/I プログラムには、そのプログラムがアクセスする各表および各ビューについて記述する DECLARE TABLE ステートメントを組み込む必要があります。 Db2 宣言生成プログラム (DCLGEN) を使って、 DECLARE TABLE ステートメントを生成できます。
- コードの組み込み
- 区分データ・セットのメンバー
から SQL ステートメントまたは PL/I ホスト変数宣言を組み込むには、ソース・コードの中の
それらのステートメントを入れたい個所に、以下の SQL ステートメントを入れてください。
EXEC SQL INCLUDE member-name;SQL INCLUDE ステートメントはネストできません。 PL/I %INCLUDE ステートメントは、SQL ステートメントまたはホスト変数 DCL ステートメントを組み込む場合には使用しないでください。 Db2プリコンパイラーを使用する前に、すべての%INCLUDE ステートメントを解決するには、PL/I プリプロセッサーを使わなければなりません。 SQL ステートメント内では、どのような PL/I プリプロセッサー指示も許されません。
- マージン
- Db2 プリコンパイラに他のマージンを指定していない限り、2列目から72列目までのコードSQLステートメントを指定します。 指定された左マージンの前にEXECSQLが開始された場合、Db2プリコンパイラーはSQLステートメントを認識しません。
- 名称
- ホスト変数には、PL/I で有効な名前であれば、どの名前でも使用できます。 「DSN」で始まる外部入り口名またはアクセス・プラン名、および「SQL」で始まるホスト変数名は使用しないでください。 これらの名前はDb2のために予約されています。
- シーケンス番号
- Db2 プリコンパイラーに生成されるソース・ステートメントには、シーケンス番号は含まれません。 PL/I コンパイラーからの IEL0378I メッセージは、 シーケンス番号が付いていないコードの行を示します。 これらのメッセージは無視することができます。
- ステートメント・ラベル
- 実行可能 SQL ステートメントには、ステートメント・ラベルを指定することができます。 しかし、INCLUDE text-file-name と END DECLARE SECTION ステートメントには、 ステートメント・ラベルを付けることはできません。
- WHENEVER ステートメント
- SQL ステートメント WHENEVER の GOTO 文節のターゲットは、PL/I ソース・コード内のラベルでなければならず、WHENEVER の作用が及ぶ SQL ステートメントの有効範囲内になければなりません。
- 2 バイト文字セット (DBCS) 文字の使用
- SQL ステートメントを使用する PL/I プログラムで DBCS を使用する際には、以下の考慮事項が適用されます。
- PL / IソースでDBCSを使用する場合、以下の言語要素の Db2規則が適用されます。
- GRAPHIC ストリング
- グラフィック・ストリング定数
- ホスト ID
- 文字ストリングの混合データ
- MIXED DATA オプション
- PL/I プリプロセッサーは DBCS 定数の形式を変換します。 この変換を行わない場合は、 Db2 をプリコンパイラー 前 で実行してください。
- 動的に準備された SQL ステートメントでグラフィック・ストリング定数または混合データを使用し、
かつアプリケーションが PL/I 第 2 版 (以降) コンパイラーを必要とする場合、
動的に準備されたステートメントは、PL/I 混合定数形式を使用する必要があります。
- ホスト変数からステートメントを準備する場合は、PL/I 混合ストリングへの ストリング割り当てを変更してください。
- PL/I ストリングからステートメントを準備する場合は、それをホスト変数に 変更してから、PL/I 混合ストリングへのストリング割り当てを変更してください。
例:
SQLSTMT = 'SELECT <dbdb> FROM table-name'M; EXEC SQL PREPARE STMT FROM :SQLSTMT; - DBCS ID が PL/I グラフィック・ストリングに類似するようにしたい場合、区切り ID を使用する必要があります。
- コメントに DBCS 文字を組み込む場合は、シフトアウト制御文字と シフトイン制御文字を使って文字を区切らなければなりません。 最初のシフトイン文字は DBCS ストリングの終わりのシグナルとなります。
- PL/I アプリケーション・プログラムで DBCS 文字を使用するホスト変数名を宣言することができます。 PL/I に DBCS 変数名を使用するための規則は、
長さの場合を除き、DBCS SQL 通常 ID の既存の規則に従います。 ホスト変数の最大長は、 Db2 では 128 Unicodeバイトです。 DBCS SQL 通常 ID の規則については、SQL ID に関する情報を参照してください。制約事項:
- DBCS 変数名に含められるのは、DBCS 文字だけです。 DBCS 変数名で 1 バイト文字セット (SBCS) 文字 と DBCS 文字を混合すると、不測の結果が生じます。
- DBCS 変数名は、次の行まで続けられません。
- PL/I プリプロセッサーは、漢字以外の DBCS 文字を 拡張 2 進化 10 進コード (EBCDIC) SBCS 文字に変更します。 この変更を回避するには、DBCS 変数名に漢字 DBCS 文字を使用するか、または PL/I プリプロセッサーを使用せずに PL/I コンパイラーを実行します。
- PL / IソースでDBCSを使用する場合、以下の言語要素の Db2規則が適用されます。
- PL/I に関する特殊な考慮事項
- 以下の考慮事項が、PL/I で作成されるプログラムに適用されます。
- SQL ステートメントを含む PL/I プログラムをコンパイルする ときは、PL/I コンパイラー・オプションの CHARSET (60 EBCDIC) を使用しなければなりません。
- BIGINT または LOB データ・タイプを使用する PL/I プログラムをコンパイルする場合は、LIMITS(FIXEDBIN(63), FIXEDDEC(31)) コンパイラー・オプションを指定します。
- まれなケースとして、PL/I で生成されるコメントに セミコロンが含まれていることがあります。 セミコロンがあると、コンパイラー・メッセージ IEL0239I が出されますが 、これは無視して構いません。
- PL/I 宣言で生成されるコードは、可変長文字と して定義されたフィールドの ADDR 関数を含んでいることがあります。 これによって、メッセージ IBM105l l または IBM1180l W が出ますが、両方とも無視してもかまいません。
- PL/I ソース・コードの中のプリコンパイラー生成コード には、NULL() 関数を含んでいることがあります。 この結果、メッセージ IEL0533I が出されますが、NULL を PL/I 変数として使用しない限り、 無視してもかまいません。 Db2アプリケーションでPL / I変数としてNULLを使う場合、PL / Iコンパイラー・エラーを回避するために、組み込み関数(DCL NULL BUILTIN;)としてNULLを宣言しなければなりません。
- Db2 プリコンパイラーを実行する前にマクロ・プロセッサーを実行すると、 PL/I マクロ・プロセッサーは SQL ステートメントまたはホスト変数 DCL ステートメントを生成できます。
PL/I マクロ処理プログラムを使用するときは、 オプションを PL/I コンパイラーに渡すために、 ソース・コードの中で PL/I *PROCESS ステートメントを使用しないでください。 必要とするオプションは、 DSNH コマンドの COPTION パラメーターでも、DSNHPLI プロシージャーの中の EXEC ステートメントの PARM.PLI= オプション でも指定できます。
- 複数のタスクが SQL ステートメントを実行する PL/I マルチタスキング機能を使用すると、 予測不能の結果が起こります。
- PL/I WIDECHAR ホスト・データ型は、 Db2 コプロセッサーのみを介してサポートされます。
- PL/I WX ワイド文字定数を使う場合、 Db2はビッグ・エンディアン・フォーマットのみをサポートします。 したがって、PL/I でワイド文字タイプのホスト変数に定数を割り当てる際には、ビッグ・エンディアン形式が使用されていることを確認してください。 以下に例を示します。
以下と同等です。HVWC1 = '003100320033006100620063'WX;
HVWC1 は WIDECHAR タイプのホスト変数として定義されます。HVWC1 = '123abc'; - PL/I SQL プリプロセッサー・オプション、 CCSID0 と NOCCSID0、 Db2 コプロセッサーに使われた場合の使用注意点。
- CCSID0 (デフォルト) を使うと、Db2 プリコンパイラーを使った従来PL/I プログラムとの互換性が促進されます。 プログラムの準備中に、CCSID 値は WIDECHAR タイプ以外のホスト変数に関連付けられません。 WIDECHAR タイプのホスト変数の場合、PL/I SQL プリプロセッサーによって CCSID 1200 が常に割り当てられます。
BIND 中および実行時に、CCSID がホスト変数に関連付けられない場合は、BIND オプション ENCODING が使用されます。 このオプションはアプリケーション・データ用に定められています。 ENCODING BIND オプションを指定しないと、ENCODING BIND オプションのデフォルト値が使用されます。
- NOCCSID0 の使用時には、プログラムの準備中に CCSID がホスト変数に関連付けられます。 プログラムの準備中に CCSID は以下の項目から派生します。
- DECLARE :hv VARIABLE CCSID xxxx (指定されている場合)。
- ソース CCSID( DECLARE VARIABLE がない場合 ) ... ホスト変数に CCSID xxxx が指定されています。 BIND 時には、プログラムの準備中にホスト変数に割り当てられた CCSID が BIND プロセスに認識されないことに注意してください。 BIND時間のCCSID解決についての詳細は、 文字列のエンコード・スキームとCCSID ルールを参照のこと。
静的SQLで使用されるホスト変数の場合、正確で一致する CCSID が DECLARE VARIABLE に割り当て/派生されるようにします ... CCSID xxxx、ソース CCSID または ENCODING BIND オプション、またはインストール・デフォルト
動的SQLで使用されるパラメーター・マーカーの場合、対応するホスト変数の正確なCCSIDが、DECLARE VARIABLE ..を介して割り当て/派生されるようにします。 CCSID xxxx、 ENCODING BIND オプション、またはインストール・システムのデフォルト値。 ソース CCSID はパラメーター・マーカーには影響しません。
- CCSID0 (デフォルト) を使うと、Db2 プリコンパイラーを使った従来PL/I プログラムとの互換性が促進されます。 プログラムの準備中に、CCSID 値は WIDECHAR タイプ以外のホスト変数に関連付けられません。 WIDECHAR タイプのホスト変数の場合、PL/I SQL プリプロセッサーによって CCSID 1200 が常に割り当てられます。
- SQL エラー・コードの処理
- PLI/I アプリケーションは、 Db2からの SQL エラーに関する詳細情報を請求できます。 詳細については、 PL/I アプリケーションでの SQL エラーコードの処理を参照してください。