ホスト変数は、SQL ステートメント内で参照される COBOL の言語変数です。これにより、アプリケーションは入力データをデータベース・マネージャーに渡し、またデータベース・マネージャーから出力データを受け取ることができます。アプリケーションがプリコンパイルされると、コンパイラーはホスト変数を他の COBOL 変数と同様に使用します。ホスト変数を命名、宣言、および使用する際には、以下に示す規則に従ってください。
SQL プリコンパイラーは、宣言された名前によってホスト変数を識別します。以下の規則が適用されます。
SQL は、スペースで囲まれたハイフンを減算演算子として解釈します。ハイフンをホスト変数名として使用する場合は、スペースを入れないでください。
ホスト変数宣言の識別には、SQL の宣言セクションを使用しなければなりません。これは、それ以降の SQL ステートメントで参照が可能なホスト変数をプリコンパイラーに知らせます。
構造型にホスト変数を宣言する方法について詳しくは、 構造型ホスト変数の宣言を参照してください。
COBOL プリコンパイラーは、有効な COBOL 宣言のサブセットのみを認識します。
COBOL における数値ホスト変数の構文は、数値ホスト変数の構文を示します。
COBOL における数値ホスト変数の構文 .-IS-. >>-+-01-+--variable-name---+-PICTURE-+--+----+--picture-string--> '-77-' '-PIC-----' >-----+------------------------------------------+--------------> | (1) | '-+---------------+---+-COMP-3----------+--' | .-IS-. | +-COMPUTATIONAL-3-+ '-USAGE-+----+--' +-COMP-5----------+ '-COMPUTATIONAL-5-' >----+----------------------+---.------------------------------>< | .-IS-. | '-VALUE-+----+--value--'
注:
浮動小数点
>>-+-01-+--variable-name----+---------------+-------------------> '-77-' | .-IS-. | '-USAGE-+----+--' (1) >-----+--+-COMPUTATIONAL-1-+--------+---------------------------> | '-COMP-1----------' | | (2) | '--+-COMPUTATIONAL-2-+--------' '-COMP-2----------' >-----+----------------------+--.------------------------------>< | .-IS-. | '-VALUE-+----+--value--'
注:
数値ホスト変数に関する考慮事項:
COBOL における文字ホスト変数の構文: 固定長は、文字ホスト変数の構文を示します。
COBOL における文字ホスト変数の構文: 固定長 .-IS-. >>-+-01-+--variable-name---+-PICTURE-+--+----+--picture-string--> '-77-' '-PIC-----' >-----+----------------------+--.------------------------------>< | .-IS-. | '-VALUE-+----+--value--'
可変長
>>-01--variable-name-.-----------------------------------------><
.-IS-. >>-49--identifier-1---+-PICTURE-+--+----+--S9(4)----------------> '-PIC-----' >-----+------------------------------------------+--------------> '-+---------------+---+-COMP-5----------+--' | .-IS-. | '-COMPUTATIONAL-5-' '-USAGE-+----+--' >-----+----------------------+--.------------------------------>< | .-IS-. | '-VALUE-+----+--value--'
.-IS-. >>-49--identifier-2---+-PICTURE-+--+----+--picture-string-------> '-PIC-----' >-----+----------------------+--.------------------------------>< | .-IS-. | '-VALUE-+----+--value--'
文字ホスト変数に関する考慮事項:
EXEC SQL CONNECT TO :dbname USER :userid USING :p-word END-EXEC.
ただし、パスワードではブランクが有効なため、 p-word ホスト変数を VARCHAR データ項目として宣言する必要があります。こうすることにより、アプリケーションは CONNECT ステートメントのパスワードの有効な長さを明示的に指示することができます。以下はその例です。
EXEC SQL BEGIN DECLARE SECTION END-EXEC. 01 dbname PIC X(8). 01 userid PIC X(8). 01 p-word. 49 L PIC S9(4) COMP-5. 49 D PIC X(18). EXEC SQL END DECLARE SECTION END-EXEC. PROCEDURE DIVISION. MOVE "sample" TO dbname. MOVE "userid" TO userid. MOVE "password" TO D OF p-word. MOVE 8 TO L of p-word. EXEC SQL CONNECT TO :dbname USER :userid USING :p-word END-EXEC.
COBOL における図形ホスト変数の構文: 固定長は、図形ホスト変数の構文を示します。
COBOL における図形ホスト変数の構文: 固定長 >>-+-01-+--variable-name---+-PICTURE-+--------------------------> '-77-' '-PIC-----' .-IS-. .-IS-. >----+----+--picture-string-USAGE---+----+--DISPLAY-1-----------> >-----+----------------------+--.------------------------------>< | .-IS-. | '-VALUE-+----+--value--'
可変長
>>-01--variable-name-.-----------------------------------------><
.-IS-. >>-49--identifier-1---+-PICTURE-+--+----+--S9(4)----------------> '-PIC-----' >-----+------------------------------------------+--------------> '-+---------------+---+-COMP-5----------+--' | .-IS-. | '-COMPUTATIONAL-5-' '-USAGE-+----+--' >-----+----------------------+--.------------------------------>< | .-IS-. | '-VALUE-+----+--value--'
>>-49--identifier-2---+-PICTURE-+-------------------------------> '-PIC-----' .-IS-. .-IS-. >----+----+--picture-string-USAGE---+----+--DISPLAY-1-----------> >-----+----------------------+--.------------------------------>< | .-IS-. | '-VALUE-+----+--value--'
グラフィック・ホスト変数に関する考慮事項:
標識変数のデータ・タイプは、PIC S9(4) COMP-5 と宣言してください。
COBOL における LOB ホスト変数の構文は、COBOL におけるラージ・オブジェクト (LOB) ホスト変数の宣言構文を示します。
COBOL における LOB ホスト変数の構文 >>-01--variable-name----+--------------+--SQL TYPE IS-----------> '-USAGE-+----+-' '-IS-' >-----+-BLOB---+--(--length--+---+---)--.---------------------->< +-CLOB---+ +-K-+ '-DBCLOB-' +-M-+ '-G-'
LOB ホスト変数に関する考慮事項:
BLOB の例:
宣言:
01 MY-BLOB USAGE IS SQL TYPE IS BLOB(2M).
この結果、以下の構造が生成されます。
01 MY-BLOB. 49 MY-BLOB-LENGTH PIC S9(9) COMP-5. 49 MY-BLOB-DATA PIC X(2097152).
CLOB の例:
宣言:
01 MY-CLOB USAGE IS SQL TYPE IS CLOB(125M).
この結果、以下の構造が生成されます。
01 MY-CLOB. 49 MY-CLOB-LENGTH PIC S9(9) COMP-5. 49 MY-CLOB-DATA PIC X(131072000).
DBCLOB の例:
宣言:
01 MY-DBCLOB USAGE IS SQL TYPE IS DBCLOB(30000).
この結果、以下の構造が生成されます。
01 MY-DBCLOB. 49 MY-DBCLOB-LENGTH PIC S9(9) COMP-5. 49 MY-DBCLOB-DATA PIC G(30000) DISPLAY-1.
COBOL における LOB ロケーター・ホスト変数の構文は、COBOL におけるラージ・オブジェクト (LOB) ロケーター・ホスト変数の宣言の構文を示します。
COBOL における LOB ロケーター・ホスト変数の構文 >>-01--variable-name----+--------------+--SQL TYPE IS-----------> '-USAGE-+----+-' '-IS-' >-----+-BLOB-LOCATOR---+--.------------------------------------>< +-CLOB-LOCATOR---+ '-DBCLOB-LOCATOR-'
LOB ロケーター・ホスト変数に関する考慮事項:
BLOB ロケーターの例 (他のタイプの LOB ロケーターの場合も同様):
宣言:
01 MY-LOCATOR USAGE SQL TYPE IS BLOB-LOCATOR.
この結果、以下の宣言が生成されます。
01 MY-LOCATOR PIC S9(9) COMP-5.
COBOL におけるファイル参照ホスト変数の構文は、COBOL におけるファイル参照ホスト変数の宣言構文を示します。
COBOL におけるファイル参照ホスト変数の構文 >>-01--variable-name----+--------------+--SQL TYPE IS-----------> '-USAGE-+----+-' '-IS-' >-----+-BLOB-FILE---+--.--------------------------------------->< +-CLOB-FILE---+ '-DBCLOB-FILE-'
BLOB ファイル参照の例 (他のタイプの LOB の場合も同様):
宣言:
01 MY-FILE USAGE IS SQL TYPE IS BLOB-FILE.
この結果、以下の宣言が生成されます。
01 MY-FILE. 49 MY-FILE-NAME-LENGTH PIC S9(9) COMP-5. 49 MY-FILE-DATA-LENGTH PIC S9(9) COMP-5. 49 MY-FILE-FILE-OPTIONS PIC S9(9) COMP-5. 49 MY-FILE-NAME PIC X(255).
COBOL プリコンパイラーは、ホスト変数宣言セクション内のグループ・データ項目をサポートします。グループ・データ項目は特に、 SQL ステートメント内の基本データ項目の集合を手早く参照する方法を提供します。たとえば、以下のグループ・データ項目は、 SAMPLE データベースの STAFF 表にある列にアクセスするために使用することができます。
01 staff-record. 05 staff-id pic s9(4) comp-5. 05 staff-name. 49 l pic s9(4) comp-5. 49 d pic x(9). 05 staff-info. 10 staff-dept pic s9(4) comp-5. 10 staff-job pic x(5).
宣言セクション内のグループ・データ項目は、上記のホスト変数のタイプを従属データ項目として含むことができます。これには、すべてのタイプのラージ・オブジェクトの他に、数値および文字のすべてのタイプが含まれます。グループ・データ項目は、最高 10 レベルまでネストさせることができます。 上の例のように、レベル 49 の従属項目には VARCHAR 文字タイプを宣言しなければならないことに注意してください。レベルが 49 でない場合は、VARCHAR は 2 つの従属項目を持つグループ・データ項目とみなされ、グループ・データ項目の宣言および使用の規則に従います。上記の例では、staff-info はグループ・データ項目であり、 staff-name は VARCHAR です。同じ原則は、LONG VARCHAR、VARGRAPHIC および LONG VARGRAPHIC にも当てはまります。グループ・データ項目は、02 〜 49 の範囲のどのレベルにおいても宣言することができます。
グループ・データ項目とその従属項目には、以下の 4 とおりの使用法があります。
使用法 1
グループ全体を SQL ステートメント内の単一のホスト変数として参照します。
EXEC SQL SELECT id, name, dept, job INTO :staff-record FROM staff WHERE id = 10 END-EXEC.
プリコンパイラーは staff-record の参照を、 staff-record 内で宣言されたすべての従属項目をコンマで区切ったリストへと変換します。名前の重複を避けるために、各基本項目はグループ名により修飾されます。これは以下の使用法と同じです。
使用法 2
グループ・データ項目の 2 番目の使用法です。
EXEC SQL SELECT id, name, dept, job INTO :staff-record.staff-id, :staff-record.staff-name, :staff-record.staff-info.staff-dept, :staff-record.staff-info.staff-job FROM staff WHERE id = 10 END-EXEC.
注: | staff-id への参照は、接頭部 staff-record. を使ったグループ名で修飾されており、ピュアな COBOL の場合のように staff-record の staff-id によってではありません。 |
staff-record の従属項目と同じ名前を持つホスト変数がその他にない場合は、上記のステートメントは使用法 3 と同様に、明示的なグループ修飾を取り除いてコーディングできます。
使用法 3
ここでは、特定のグループ項目を修飾しない、通常の COBOL の方式で従属項目が参照されています。
EXEC SQL SELECT id, name, dept, job INTO :staff-id, :staff-name, :staff-dept, :staff-job FROM staff WHERE id = 10 END-EXEC.
純粋な COBOL と同様に、特定の従属項目が固有に識別できれば、プリコンパイラーに受け入れられます。たとえば、staff-job が複数のグループに現れるとすると、プリコンパイラーはあいまいな参照であることを示すエラーを出します。
SQL0088N Host variable "staff-job" is ambiguous.
使用法 4
あいまい参照を解決するために、従属項目の部分修飾を使用することができます。たとえば、以下のようにします。
EXEC SQL SELECT id, name, dept, job INTO :staff-id, :staff-name, :staff-info.staff-dept, :staff-info.staff-job FROM staff WHERE id = 10 END-EXEC.
使用法 1 のような単一のグループ項目のみの参照は、コンマで区切った従属項目のリストに対応するため、このタイプの参照はエラーとなる場合があります。以下はその例です。
EXEC SQL CONNECT TO :staff-record END-EXEC.
ここでの CONNECT ステートメントは、1 バイト文字ベースの変数を予期しています。 staff-record グループ・データ項目を与えると、このホスト変数は以下のようなプリコンパイル・エラーとなります。
SQL0087N Host variable "staff-record" is a structure used where structure references are not permitted.
この他に SQL0087N を引き起こすグループ項目の使用法には、 PREPARE、 EXECUTE IMMEDIATE、 CALL、標識変数、および SQLDA 参照を含むものがあります。このような状態では、前述の使用法 2、3 および 4 での個々の従属項目の参照がそうであるように、従属項目を 1 つしか持たないグループを使用することができます。
COBOL プリコンパイラーは、グループ・データ項目での使用に便利な標識変数の表の定義をサポートします。以下のように宣言します。
01 <indicator-table-name>. 05 <indicator-name> pic s9(4) comp-5 occurs <table-size> times.
以下はその例です。
01 staff-indicator-table. 05 staff-indicator pic s9(4) comp-5 occurs 7 times.
このインディケーター表は、上記のグループ項目の最初の形式で効率的に使用できます。
EXEC SQL SELECT id, name, dept, job INTO :staff-record :staff-indicator FROM staff WHERE id = 10 END-EXEC.
ここでは、プリコンパイラーが staff-indicator はインディケーター表として宣言されていることを検出し、 SQL ステートメントの処理の際に、これを個々のインディケーターの参照に拡張します。 staff-indicator(1) は staff-record の staff-id、 staff-indicator(2) は staff-record の staff-name、というように関連付けられます。
注: | データ項目内の従属項目よりも k 個多いインディケーター項目がインディケーター表に存在する場合 (たとえば、staff-indicator に項目が 10 個ある場合は、 k=6 となります)、インディケーター表の終端の k 個の余分な項目は無視されます。同様に、インディケーター項目が従属項目よりも k 個少ない場合は、グループ項目内の最後の k 個の項目は、対応するインディケーターを持ちません。 SQL ステートメント内のインディケーター表の要素は、個別に参照できることに注意してください。 |
ホスト変数の宣言に、REDEFINES 文節を使用することができます。 REDEFINES 文節を使っていくつかのグループ・データ項目を宣言し、そのグループ・データ項目が SQL ステートメント内で全体として参照される場合、 REDEFINES 文節を含む従属項目は展開されません。以下はその例です。
01 foo. 10 a pic s9(4) comp-5. 10 a1 redefines a pic x(2). 10 b pic x(10).
SQL ステートメント内での foo の参照は、次のようになります。
... INTO :foo ...
上のステートメントは、次のステートメントと等価です。
... INTO :foo.a, :foo.b ...
つまり、従属項目 a1 は、REDEFINES 文節で宣言されていますが、そのような状況では自動的に展開されません。 a1 があいまいでない場合は、次のように、SQL ステートメント内の REDEFINES 文節で明示的に従属項目を参照することができます。
... INTO :foo.a1 ...
または
... INTO :a1 ...
DB2 COBOL プリコンパイラーは、整数ホスト変数および標識が許可されているときには常に、BINARY、COMP、および COMP-4 データ・タイプの使用をサポートします。ただしそれは、ターゲット COBOL コンパイラーが BINARY、 COMP、または COMP-4 データ・タイプを、COMP-5 データ・タイプと等しくみなす (または等しくみなすようにできる) 場合に限ります。本書では、そのようなホスト変数および標識を、タイプ COMP-5 と示します。 COMP、COMP-4、BINARY COMP および COMP-5 を等価として扱う、 DB2 のサポートするターゲット・コンパイラーは、次のとおりです。