「DB2 Universal Database for z/OS SQL 解説書」に定義されている言語を使用して、PL/I アプリケーション内で SQL ステートメントをコーディングできます。 SQL コード特有の要件について、以下に説明します。
SQL ステートメントを含む PL/I プログラムには、SQLCODE 変数 (STDSQL(86) プリプロセッサー・オプションを使用する 場合)、または SQL 連絡域 (SQLCA) を組み込む必要があります。 図 5 に示すように、SQLCA の一部は SQLCODE 変数 と SQLSTATE 変数です。
SQLCA 宣言をインクルードするには、次のように EXEC 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 sqlerrmc char(70) var, /* Error message tokens */
2 sqlerrp char(8), /* Diagnostic information */
2 sqlerrd(0:5) 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 をインクルードするには、 次のように EXEC 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
1 Sqlda2 based(Sqldaptr),
2 sqldaid2 char(8), /* Eye catcher = 'SQLDA ' */
2 sqldabc2 fixed binary(31), /* SQLDA size in bytes=16+44*SQLN*/
2 sqln2 fixed binary(15), /* Number of SQLVAR elements*/
2 sqld2 fixed binary(15), /* # of used SQLVAR elements*/
2 sqlvar2(Sqlsize refer(sqln2)), /* Variable Description */
3 sqlbiglen,
4 sqllongl fixed binary(31),
4 sqlrsvdl fixed binary(31),
3 sqldatal pointer,
3 sqltname char(30) var;
dcl Sqlsize fixed binary(15); /* number of sqlvars (sqln) */
dcl Sqldaptr pointer;
dcl Sqltripled char(1) initial('3');
dcl Sqldoubled char(1) initial('2');
dcl Sqlsingled char(1) initial(' ');
プログラムの最初のステートメントは、PROCEDURE または PACKAGE ステートメント でなければなりません。 実行可能ステートメントを置くことができる任意の場所で、 プログラムに SQL ステートメントを追加できます。 それぞれの SQL ステートメントは EXEC (または EXECUTE) SQL で 始まり、セミコロン (;) で終わる必要があります。
例えば、UPDATE ステートメントは次のようにコーディングされます。
exec sql update DSN8710.DEPT
set Mgrno = :Mgr_Num
where Deptno = :Int_Dept;
SQL ステートメントのほかに、ブランクを入力できる場所では 組み込み SQL ステートメントにコメントを組み込むことができます。
Enterprise PL/I V3R6 から、SQL ステートメントに組み込まれた SQL スタイルのコメント ('--') がサポートされています。
SQL ステートメントの行継続規則は、他の PL/I ステートメントと同じです。
SQL ステートメントまたは PL/I ホスト変数の宣言ステートメント を組み込むには、ソース・コード内でステートメントを組み込む場所に、 次の SQL ステートメントを配置します。
exec sql include member;
SQL ステートメントは、列 m から n までに コーディングする必要があります。ただし m と n は、MARGINS(m,n) コンパイラー・オプションで 指定されます。
ホスト変数には、任意の有効な PL/I 変数名を使用することができます。 ホスト変数名の長さは、LIMITS(NAME(n)) コンパイラー・オプションに指定した値 n を超えてはなりません。
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-'
注
次の図は、有効な結果セット・ロケーターの宣言の構文を示しています。
>>-+-DECLARE-+--+-variable-name---------+-----------------------> '-DCL-----' | .-,-------------. | | V | | '-(---variable-name-+-)-' >----SQL TYPE IS RESULT_SET_LOCATOR----+---------+--------------> +-VARYING-+ '-VAR-----' >--+---------------------------------------+-- ; -------------->< '-Alignment and/or Scope and/or Storage-'
次の図は、有効なテーブル・ロケーターの構文を示しています。
>>-+-DECLARE-+--+-variable-name---------+-----------------------> '-DCL-----' | .-,-------------. | | V | | '-(---variable-name-+-)-' >----SQL TYPE IS TABLE LIKE table-name AS LOCATOR---- ; -------><
次の図は、BLOB、CLOB、および DBCLOB の各ホスト変数および ロケーターを宣言するための構文を示しています。
>>-+-Declare-+--PL/I host identifier--SQL TYPE IS---------------> '-Dcl-----' >--| PL/I LOB type |--| PL/I LOB type: |------------------------> >--+-+-+-Binary Large Object-+----+--(--length--+---+--)-+----->< | | '-BLOB----------------' | +-K-+ | | +-+-Character Large Object-+-+ +-M-+ | | | +-Char Large Object------+ | '-G-' | | | '-CLOB-------------------' | | | '-DBCLOB---------------------' | '-+-BLOB_LOCATOR---+----------------------------------' +-CLOB_LOCATOR---+ +-DBCLOB_LOCATOR-+ +-BLOB_FILE------+ +-CLOB_FILE------+ '-DBCLOB_FILE----'
次の図は、新しい「XML AS」ファイル参照と LOB 変数タイプの宣言の構文を示しています。
>>-+-Declare-+--PL/I host identifier--SQL TYPE IS XML AS--------> '-Dcl-----' >--| PL/I LOB type |--| PL/I LOB type: |------------------------> >--+-+-+-Binary Large Object-+----+--(--length--+---+--)-+----->< | | '-BLOB----------------' | +-K-+ | | +-+-Character Large Object-+-+ +-M-+ | | | +-Char Large Object------+ | '-G-' | | | '-CLOB-------------------' | | | '-DBCLOB---------------------' | '-+-BLOB_FILE---+-------------------------------------' +-CLOB_FILE---+ '-DBCLOB_FILE-'
以下の定数宣言が SQL プリプロセッサーによって生成されます。これらの宣言は、ファイル参照ホスト変数を使用する場合に、ファイル・オプション変数を設定するときに利用できます。
DCL SQL_FILE_READ FIXED BIN(31) VALUE(2); DCL SQL_FILE_CREATE FIXED BIN(31) VALUE(8); DCL SQL_FILE_OVERWRITE FIXED BIN(31) VALUE(16); DCL SQL_FILE_APPEND FIXED BIN(31) VALUE(32);
次の図は、ROWID 変数の有効な宣言の構文を示しています。
>>-+-DECLARE-+--+-variable-name---------+-----------------------> '-DCL-----' | .-,-------------. | | V | | '-(---variable-name-+-)-' >----SQL TYPE IS ROWID---- ; ----------------------------------><
ホスト変数の基本 SQLTYPE および SQLLEN は、 次の表のとおりに決定されます。 ホスト変数が標識変数とともに指定される場合、SQLTYPE は基本 SQLTYPE に 1 を 加えた値です。
| PL/I データ・タイプ | ホスト変数の SQLTYPE | ホスト変数の SQLLEN | SQL データ・タイプ |
|---|---|---|---|
| BIN FIXED(n)、n < 16 | 500 | 2 | SMALLINT |
| BIN FIXED(n)、n の範囲は 16 から 31 まで | 496 | 4 | INTEGER |
| BIN FIXED(n)、n の範囲は 32 から 63 まで | 492 | 8 | BIGINT |
| DEC FIXED(p,s) 0<=p<=15 および 0<=s<=p | 484 | p (バイト 1) s (バイト 2) | DECIMAL(p,s) |
| BIN FLOAT(p)、1 <= p <= 21 | 480 | 4 | REAL または FLOAT(n) 1<=n<=21 |
| BIN FLOAT(p)、22 <= p <= 53 | 480 | 8 | DOUBLE PRECISION または FLOAT(n) 22<=n<=53 |
| DEC FLOAT(m), 1 <= m <= 6 | 480 | 4 | FLOAT (単精度) |
| DEC FLOAT(m)、7 <= m <= 16 | 480 | 8 | FLOAT (倍精度) |
| CHAR(n)、 | 452 | n | CHAR(n) |
| CHAR(n) VARYING、1 <= n <= 255 | 448 | n | VARCHAR(n) |
| CHAR(n) VARYING、n > 255 | 456 | n | VARCHAR(n) |
| GRAPHIC(n)、1 <= n <= 127 | 468 | n | GRAPHIC(n) |
| GRAPHIC(n) VARYING、1 <= n <= 2000 | 464 | n | VARGRAPHIC(n) |
| GRAPHIC(n) VARYING、n > 2000 | 472 | n | LONG VARGRAPHIC |
| PL/I データ・タイプ | ホスト変数の SQLTYPE | ホスト変数の SQLLEN | SQL データ・タイプ |
|---|---|---|---|
| SQL TYPE IS BLOB(n) 1<n<2147483647 | 404 | n | BLOB(n) |
| SQL TYPE IS CLOB(n) 1<n<2147483647 | 408 | n | CLOB(n) |
| SQL TYPE IS DBCLOB(n) 1<n<1073741823 (2) | 412 | n | DBCLOB(n) (2) |
| SQL TYPE IS ROWID | 904 | 40 | ROWID |
| SQL TYPE IS VARBINARY(n) 1<n<32704 | 908 | n | VARBINARY(n) |
| SQL TYPE IS BINARY(n) 1<n<255 | 912 | n | BINARY(n) |
| SQL TYPE IS BLOB_FILE | 916 | 267 | BLOB ファイル参照 (1) |
| SQL TYPE IS CLOB_FILE | 920 | 267 | CLOB ファイル参照 (1) |
| SQL TYPE IS DBCLOB_FILE | 924 | 267 | DBCLOB ファイル参照 (1) |
| SQL TYPE IS BLOB_LOCATOR | 960 | 4 | BLOB ロケーター (1) |
| SQL TYPE IS CLOB_LOCATOR | 964 | 4 | CLOB ロケーター (1) |
| SQL TYPE IS DBCLOB_LOCATOR | 968 | 4 | DBCLOB ロケーター (1) |
| SQL TYPE IS RESULT_SET_LOCATOR | 972 | 4 | 結果セット・ロケーター |
| SQL TYPE IS TABLE LIKE table-name AS LOCATOR | 976 | 4 | テーブル・ロケーター (1) |
|
注:
|
|||
次の表を使用して、特定の SQL データ・タイプと同等な PL/I データ・タイプ を判別できます。
| SQL データ・タイプ | 同等な PL/I 宣言 | 注 |
|---|---|---|
| SMALLINT | BIN FIXED(15) | |
| INTEGER | BIN FIXED(31) | |
| BIGINT | BIN FIXED(63) | |
| DECIMAL(p,s) | DEC FIXED(p) または DEC FIXED(p,s) | p = precision および s = scale; 1 <= p <= 31 および 0 <= s <= p |
| REAL または FLOAT(n) | BIN FLOAT(p) または DEC FLOAT(m) | 1 <= n <= 21、1 <= p <= 21 および 1 <= m <= 6 |
| DOUBLE PRECISION、DOUBLE、または FLOAT(n) | BIN FLOAT(p) または DEC FLOAT(m) | 22 <= n <= 53、22 <= p <= 53 および 7 <= m <= 16 |
| CHAR(n) | CHAR(n) | 1 <= n <= 32767 |
| VARCHAR(n) | CHAR(n) VAR | |
| GRAPHIC(n) | GRAPHIC(n) | n は、2 バイト文字の数を示す (バイト数ではない) 1 から 127 までの正整数 |
| VARGRAPHIC(n) | GRAPHIC(n) VAR | n は、2 バイト文字の数を示す (バイト数ではない) 正整数。1 <= n <= 2000 |
| LONG VARGRAPHIC | GRAPHIC(n) VAR | n > 2000 |
| DATE | CHAR(n) | n の最小値は 10 |
| TIME | CHAR(n) | n の最小値は 8 |
| TIMESTAMP | CHAR(n) | n の最小値は 26 |
| SQL データ・タイプ | 同等な PL/I 宣言 | 注 |
|---|---|---|
| 結果セット・ロケーター | SQL TYPE IS RESULT_SET_LOCATOR | このデータ・タイプは、結果セットの受け取りにだけ使用します。 このデータ・タイプを列タイプとして使用しないでください。 |
| テーブル・ロケーター | SQL TYPE IS TABLE LIKE table-name AS LOCATOR | このデータ・タイプは、ユーザー定義の関数または ストアード・プロシージャー内だけで、変位テーブルの行を受け取るために 使用します。このデータ・タイプを列タイプとして使用しないでください。 |
| BLOB ロケーター | SQL TYPE IS BLOB_LOCATOR | このデータ・タイプは、BLOB 列のデータを操作するためにだけ使用します。 このデータ・タイプを列タイプとして使用しないでください。 |
| CLOB ロケーター | SQL TYPE IS CLOB_LOCATOR | このデータ・タイプは、CLOB 列のデータを操作するためにだけ使用します。 このデータ・タイプを列タイプとして使用しないでください。 |
| DBCLOB ロケーター | SQL TYPE IS DBCLOB_LOCATOR | このデータ・タイプは、DBCLOB 列のデータを操作するためにだけ使用します。 このデータ・タイプを列タイプとして使用しないでください。 |
| BLOB ファイル参照 | SQL TYPE IS BLOB_FILE | このデータ・タイプは、BLOB ファイルの参照としてのみ使用します。 このデータ・タイプを列タイプとして使用しないでください。 |
| CLOB ファイル参照 | SQL TYPE IS CLOB_FILE | このデータ・タイプは、CLOB ファイルの参照としてのみ使用します。 このデータ・タイプを列タイプとして使用しないでください。 |
| DBCLOB ファイル参照 | SQL TYPE IS DBCLOB_FILE | このデータ・タイプは、DBCLOB ファイルの参照としてのみ使用します。 このデータ・タイプを列タイプとして使用しないでください。 |
| BLOB(n) | SQL TYPE IS BLOB(n) | 1<n<2147483647 |
| CLOB(n) | SQL TYPE IS CLOB(n) | 1<n<2147483647 |
| DBCLOB(n) | SQL TYPE IS DBCLOB(n) | n は 2 バイト文字の数です。 1<n<1073741823 |
| ROWID | SQL TYPE IS ROWID | |
| XML AS | SQL TYPE IS XML AS ... | XML バージョンの BLOB、CLOB、DBCLOB、 BLOB_FILE、CLOB_FILE、または DBCLOB_FILE を記述するのに使用します。 |