PL/I アプリケーションでの SQL ステートメントは、「SQL Reference, Volume 1 and Volume 2」(SBOF-8923) に定義されている言語を使用してコーディングできます。 SQL コード特有の要件について、以下に説明します。
SQL ステートメントを含む PL/I プログラムには、連絡域 (SQLCA) を組み込む必要があります。 図 1に示すように、SQLCA の一部は、SQLCODE 変数と SQLSTATE 変数から構成されています。
SQLCA をインクルードするには、次のように SQL INCLUDE ステートメントを 使用する必要があります。
exec sql include sqlca;
SQLCA 構造体は、SQL 宣言セクション内で定義してはなりません。 SQLCODE と SQLSTATE の宣言の有効範囲には、プログラム内の SQL ステートメントの有効範囲がすべて含まれている必要があります。
Dcl
1 Sqlca,
2 sqlcaid char(8), /* Eyecatcher = 'SQLCA '*/
2 sqlcabc fixed binary(31), /* SQLCA size in bytes = 136 */
2 sqlcode fixed binary(31), /* SQL return code */
2 sqlerrm char(70) var, /* Error message tokens */
2 sqlerrp char(8), /* Diagnostic information */
2 sqlerrd(6) fixed binary(31), /* Diagnostic information */
2 sqlwarn, /* Warning flags */
3 sqlwarn0 char(1),
3 sqlwarn1 char(1),
3 sqlwarn2 char(1),
3 sqlwarn3 char(1),
3 sqlwarn4 char(1),
3 sqlwarn5 char(1),
3 sqlwarn6 char(1),
3 sqlwarn7 char(1),
2 sqlext,
3 sqlwarn8 char(1),
3 sqlwarn9 char(1),
3 sqlwarna char(1),
3 sqlstate char(5); /* State corresponding to SQLCODE */次のステートメントは SQLDA を必要とします。
SQLCA とは異なり、1 つのプログラム内に複数の SQLDA が存在でき、任意の有効な名前を SQLDA に付けることができます。SQLDA をインクルードするには、次のように SQL INCLUDE ステートメントを 使用する必要があります。
exec sql include sqlda;
SQLDA は、SQL 宣言セクション内で定義してはなりません。
Dcl
1 Sqlda based(Sqldaptr),
2 sqldaid char(8), /* Eye catcher = 'SQLDA ' */
2 sqldabc fixed binary(31), /* SQLDA size in bytes=16+44*SQLN*/
2 sqln fixed binary(15), /* Number of SQLVAR elements*/
2 sqld fixed binary(15), /* # of used SQLVAR elements*/
2 sqlvar(Sqlsize refer(sqln)), /* Variable Description */
3 sqltype fixed binary(15), /* Variable data type */
3 sqllen fixed binary(15), /* Variable data length */
3 sqldata pointer, /* Pointer to variable data value*/
3 sqlind pointer, /* Pointer to Null indicator*/
3 sqlname char(30) var ; /* Variable Name */
dcl Sqlsize fixed binary(15); /* number of sqlvars (sqln) */
dcl Sqldaptr pointer;PL/I プログラムの最初のステートメントは、PROCEDURE または PACKAGE ステートメントでなければなりません。 実行可能ステートメントを置くことができる任意の場所で、プログラムに SQL ステートメントを追加できます。 それぞれの SQL ステートメントは EXEC (または EXECUTE) SQL で始まり、セミコロン (;) で終わる必要があります。
例えば、UPDATE ステートメントは次のようにコーディングされます。
exec sql update Department
export Mgrno = :Mgr_Num
where Deptno = :Int_Dept;
SQL ステートメントのほかに、ブランクを入力できる場所では 組み込み SQL ステートメントに PL/I コメントを組み込むことができます。
SQL ステートメントの行継続規則は、他の PL/I ステートメントと同じです。
SQL ステートメントまたは PL/I ホスト変数の宣言ステートメント を組み込むには、ソース・コード内でステートメントを組み込む場所に、次の SQL ステートメントを配置します。
exec sql include member;
SQL ステートメントは、m と n が MARGINS(m,n) コンパイル時オプションで指定される場所で、列 m から n にコーディングする必要があります。
ホスト変数に対しては任意の有効な PL/I 変数名を使用できますが、制限として、「SQL」、「DSN」、または「IBM」で始まるホスト変数名、外部入り口名、またはアクセス計画名は使用しないでください。これらの名前は、データベース・マネージャーおよび PL/I 用に予約済みです。ホスト変数名の長さは、100 文字を超えてはなりません。
END DECLARE SECTION ステートメント、および INCLUDE text-file-name ステートメント を例外として、実行可能 SQL ステートメントには PL/I ステートメントと 同様にラベル接頭部を付けることができます。
SQL WHENEVER ステートメントの GOTO 文節のターゲットは、PL/I ソース・コード内のラベルでなければならず、WHENEVER ステートメントによって影響を受ける SQL ステートメント すべての有効範囲内になければなりません。
SQL ステートメント内で使用するホスト変数は、すべて明示的に宣言する必要があります。ONEPASS が有効な場合は、SQL ステートメント内で使用するホスト変数は、SQL ステートメント内のホスト変数が最初に使用される前に宣言する必要があります。さらに、次の制限があります。
ホスト変数の宣言は、通常の PL/I 変数宣言と同じ場所で行うことができます。
有効な PL/I 宣言のサブセットだけが、有効なホスト変数宣言として 認識されます。プリプロセッサーは、PL/I DEFAULT ステートメントに指定された データ属性デフォルトを使用しません。変数の宣言が認識されない場合は、ステートメントがその変数を参照すると、「The host variable token ID is not valid」というメッセージが出されることがあります。
変数の名前とデータ属性だけがプリプロセッサーによって使用され、位置合わせ、有効範囲、およびストレージの属性は無視されます。
次の図は、有効な数値ホスト変数宣言の構文を示しています。
>>-+-DECLARE-+--+-variable-name---------+-----------------------> '-DCL-----' | .-,-------------. | | V | | '-(---variable-name-+-)-' >----+---------+-+-FIXED--+-------------------------+-+---------> +-BINARY--+ | '-(precision-+--------+-)-' | +-BIN-----+ | '-,scale-' | +-DECIMAL-+ '-FLOAT-+-----------------+----------' '-DEC-----' '-(--precision--)-' >--+---------------------------------------+-- ; -------------->< '-Alignment and/or Scope and/or Storage-'
注
次の図は、有効な文字ホスト変数の構文を示しています。
>>-+-DECLARE-+--+-variable-name---------+-----------------------> '-DCL-----' | .-,-------------. | | V | | '-(---variable-name-+-)-' >--+-CHARACTER-+--+----------+--+---------+---------------------> '-CHAR------' '-(length)-' +-VARYING-+ '-VAR-----' >--+---------------------------------------+-- ; -------------->< '-Alignment and/or Scope and/or Storage-'
注
次の図は、有効なグラフィック・ホスト変数の構文を示しています。
>>-+-DECLARE-+--+-variable-name---------+-----------------------> '-DCL-----' | .-,-------------. | | V | | '-(---variable-name-+-)-' >--GRAPHIC--+----------+--+---------+---------------------------> '-(length)-' +-VARYING-+ '-VAR-----' >--+---------------------------------------+-- ; -------------->< '-Alignment and/or Scope and/or Storage-'
注