Rational Developer for System z
Enterprise PL/I for z/OS, Version 3.8, プログラミング・ガイド

PL/I アプリケーション内での SQL ステートメントのコーディング

DB2 Universal Database for z/OS SQL 解説書」に定義されている言語を使用して、PL/I アプリケーション内で SQL ステートメントをコーディングできます。 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 ステートメントのスコープがすべて含まれている必要があります。

図 5. SQLCA の PL/I 宣言
  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 */

SQL 記述子域の定義

次のステートメントは SQLDA を必要とします。

SQLCA とは異なり、1 つのプログラム内に複数の SQLDA が存在でき、 任意の有効な名前を SQLDA に付けることができます。SQLDA をインクルードするには、 次のように EXEC SQL INCLUDE ステートメントを使用する必要があります。

  exec sql include sqlda;

SQLDA は、SQL 宣言セクション内で定義してはなりません。

図 6. SQL 記述子域の PL/I 宣言
  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(' ');

SQL ステートメントの組み込み

プログラムの最初のステートメントは、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 ステートメントの継続

SQL ステートメントの行継続規則は、他の PL/I ステートメントと同じです。

コードの組み込み

SQL ステートメントまたは PL/I ホスト変数の宣言ステートメント を組み込むには、ソース・コード内でステートメントを組み込む場所に、 次の SQL ステートメントを配置します。

  exec sql include member;
マージン

SQL ステートメントは、列 m から n までに コーディングする必要があります。ただし mn は、MARGINS(m,n) コンパイラー・オプションで 指定されます。

名前

ホスト変数には、任意の有効な PL/I 変数名を使用することができます。 ホスト変数名の長さは、LIMITS(NAME(n)) コンパイラー・オプションに指定した値 n を超えてはなりません。

ステートメント・ラベル

END DECLARE SECTION ステートメント、および INCLUDE text-file-name ステートメント を例外として、実行可能 SQL ステートメントには PL/I ステートメントと 同様にラベル接頭部を付けることができます。

WHENEVER ステートメント

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---- ; -------><
 
LOB 変数およびロケーター

次の図は、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 ファイル参照および LOB 変数

次の図は、新しい「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

次の図は、ROWID 変数の有効な宣言の構文を示しています。

構文図を読む構文図をスキップする>>-+-DECLARE-+--+-variable-name---------+----------------------->
   '-DCL-----'  |   .-,-------------.   |
                |   V               |   |
                '-(---variable-name-+-)-'
 
>----SQL TYPE IS ROWID---- ; ----------------------------------><
 

SQL および PL/I の同等なデータ・タイプの判別

ホスト変数の基本 SQLTYPE および SQLLEN は、 次の表のとおりに決定されます。 ホスト変数が標識変数とともに指定される場合、SQLTYPE は基本 SQLTYPE に 1 を 加えた値です。

表 7. PL/I 宣言から生成される SQL データ・タイプ
    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
表 8. メタ PL/I 宣言から生成される SQL データ・タイプ
    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)
注:
  1. このデータ・タイプを列タイプとして使用しないでください。
  2. n は 2 バイト文字の数です。

次の表を使用して、特定の SQL データ・タイプと同等な PL/I データ・タイプ を判別できます。

表 9. 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
表 10. SQL データ・タイプとメタ PL/I 宣言の対応
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 を記述するのに使用します。

Terms of use | Feedback

This information center is powered by Eclipse technology. (http://www.eclipse.org)