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 に関する特殊な考慮事項
以下の考慮事項が、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 = '123abc'; 
    HVWC1 は WIDECHAR タイプのホスト変数として定義されます。
  • 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 はパラメーター・マーカーには影響しません。

SQL エラー・コードの処理
PLI/I アプリケーションは、 Db2からの SQL エラーに関する詳細情報を請求できます。 詳細については、 PL/I アプリケーションでの SQL エラーコードの処理を参照してください。