ホスト変数とは、COBOL プログラムに定義されたデータ項目です。データベースとの値の受け渡しに使用されます。 ホスト変数は、COBOL プログラムの FILE SECTION、 LOCAL-STRAGE SECTION または LINKAG SECTION で定義されるものであり、 1 から 48 までの間のレベル番号を持ちます。 レベル 49 は VARCHAR データ項目に予約されています。
ホスト変数名を埋め込み SQL 文で使用する場合は、 コンパイラが同じ名前のホスト変数と表または列を区別できるように、 データ項目名の先頭にコロン (:) を付ける必要があります。
ホスト変数は、次の 2 つの方法のどちらかで使用されます。
COBOL プログラムからデータベースへ転送されるデータを指定するために使用します。
データベースから COBOL プログラムへ返されるデータを保持するために使用します。
たとえば、以下の文の :book-id
は、
検索する本の ID を保持する入力ホスト変数であり、
:book-title
は、検索結果を返す出力ホスト変数です。
EXEC SQL SELECT title INTO :book-title FROM titles WHERE title_id=:book-id END-EXEC
ホスト変数は、埋め込み SQL 文で使用する前に、宣言する必要があります。 ホスト変数の宣言は、SQL 文の BEGIN DECLARE SECTION および END DECLARE SECTION で囲みます。 たとえば、次のように記述します。
EXEC SQL BEGIN DECLARE SECTION END-EXEC 01 id pic x(4). 01 name pic x(30). EXEC SQL END DECLARE SECTION END-EXEC display "Type your identification number: " accept id. * 次の文は、ID がホスト変数 "id" の内容と同じ従業員の * 名前を取り出します。 * その名前は、ホスト変数 "name" に返されます。 EXEC SQL SELECT emp_name INTO :name FROM employees WHERE emp_id=:id END-EXEC display "Hello " name.
注:
ホスト変数が BEGIN DECLARE SECTION および END DECLARE SECTION を使用して宣言されていない場合でも、 ホスト変数としてデータ項目を使用することができます。
ホスト変数を宣言するには、次のことに留意する必要があります。
配列とは、1 つの変数名に関連付けられたデータ項目の集まりです。 ホスト変数の配列 (ホスト配列と呼ばれます) を定義し、 1 つの SQL でそれらを操作することができます。
ホスト配列は INSERT、UPDATE、DELETE 文の中で入力変数として使用したり、 SELECT および FETCH 文の INTO 句の中の出力変数として使用することができます。 このことは、SELECT、FETCH、DELETE、INSERT および UPDATE 文で配列を使用すると、 ボリュームの大きいデータを操作できることを意味します。
注:
OpenESQL および DB2 (
OESQL ECM を使用)
COBSQL
ホスト配列は、単純なホスト変数と同様に BEGIN DECLARE SECTION および END DECLARE SECTION を使用して宣言しますが、配列の次元を設定するには、 OCCURS 句を使用する必要があります。たとえば、次のように記述します。
EXEC SQL BEGIN DECLARE SECTION END-EXEC 01 AUTH-REC-TABLES 05 Auth-id OCCURS 25 TIMES PIC X(12). 05 Auth-Lname OCCURS 25 TIMES PIC X(40). EXEC SQL END DECLARE SECTION END-EXEC. . . . EXEC SQL CONNECT USERID 'user' IDENTIFIED BY 'pwd' USING 'db_alias' END-EXEC EXEC SQL SELECT au_id, au_lname INTO :Auth_id, :Auth_Lname FROM authors END-EXEC display sqlerrd(3)
この例では、25 行 (配列のサイズ) まで SELECT 文によって返されます。 SELECT 文が 25 より多い行を返す場合は、 25 行までが返されて、SQLCODE が設定され、25 より多い行が実行可能であっても、 返されないことを示します。
選択される最大行数がわかっている場合は、SELECT 文のみ使用されます。 返される行数がわかっている場合は、FETCH 文が使用されます。 配列を使用する場合は、バッチでデータをフェッチすることができます。 これは、 情報のスクロールリストを作成する場合に役立ちます。
1 つの SQL 文で複数のホスト配列を使用する場合は、 その次元数を同じにする必要があります。
デフォルトでは、配列全体は SQL 文によって処理されますが、 オプションの FOR 句を使用すると、 処理する配列の要素数を必要に応じて制限することができます。 これは、とくに 配列全体を使用しない UPDATE、INSERT および DELETE 文で役に立ちます。
FOR 句は整数のホスト変数を使用する必要があります。次はその例です。
EXEC SQL BEGIN DECLARE SECTION END-EXEC 01 AUTH-REC-TABLES 05 Auth-id OCCURS 25 TIMES PIC X(12). 05 Auth-Lname OCCURS 25 TIMES PIC X(40). 01 maxitems PIC S9(4) COMP-5 VALUE 10. EXEC SQL END DECLARE SECTION END-EXEC. . . . EXEC SQL CONNECT USERID 'user' IDENTIFIED BY 'pwd' USING 'db_alias' END-EXEC EXEC SQL FOR :maxitems UPDATE authors SET au_lname = :Auth_Lname WHERE au_id = :Auth_id END-EXEC display sqlerrd(3)
この例では、10 行 (:maxitems
の値) は
UPDATE 文によって修正されます。
処理される配列要素の数は、ホスト配列の次元数と FOR 句の変数を比較して決まります。 少ない数のほうが使用されます。
FOR 句の変数値が 0 以下の場合は、 行は処理されません。
注:
COBSQL
COBSQL を使用している場合は、FOR 句に関するこの情報が、Oracle
データベースを使用している場合にかぎり適用されます。Sybase または Informix
データベースのいずれかを使用している場合は、適用されません。
SQLCA の SQLERRD
の三番目の要素、SQLERRD(3)
は、INSERT、 UPDATE、DELETE、 SELECT INTO の各文で処理された行数を記録します。
OpenESQL プリプロセッサ
FETCH 文の場合、SQLERRD(3) は常に最後の FETCH 文でフェッチされた行数となります。
COBSQL および DB2 プリプロセッサ
FETCH 文の場合、処理された行数の累積合計を記録します。
SQLERRD(3) の内容は次のとおりです。
SQLERRD(4) の内容は次のとおりです。
SQLERRD(5) の値は次のようになります。
埋め込み SQL では、インジケータ変数を使用することによって、 データベースから NULL 値を格納したり、取り出すことができます。 インジケータ変数は、つねに次のように定義されます。
pic S9(4) comp-5.
COBOL とは異なり、SQL は NULL 値を含む変数をサポートしています。 NULL 値は入力が行われなかったことを意味し、 一般的には、値が未知または未定義であることを示します。 NULL 値によって、0 (数値の列の場合) または空白 (文字の列の場合) の意図的な入力と、未知または不適用の入力を区別することができます。 たとえば、価格の列の NULL 値は、 その項目が無料であることを意味するのではなく、 価格が未知または未設定であることを意味します。
ホスト変数と対のインジケータ変数のどちらも SQL 値を 1 つ指定します。 どちらの変数も先頭にコロン (:) が付きます。 ホスト変数が NULL の場合は、そのインジケータ変数に -1 という値が設定されます。 ホスト変数が NULL 以外の場合は、 インジケータ変数に -1 以外の値が設定されます。
埋め込み SQL 文では、インジケータ変数は対応するホスト変数の直後に配置する必要があります。
たとえば、次のように埋め込まれた UPDATE 文は、
対のインジケータ変数、saleprice-null:
を持つ
saleprice
ホスト変数を使用します。
EXEC SQL UPDATE closeoutsale SET temp_price = :saleprice:saleprice-null, listprice = :oldprice END-EXEC
この例では、saleprice-null
の値が -1 の場合に
UPDATE 文が実行されると、文は次のように読み取られます。
EXEC SQL UPDATE closeoutsale SET temp_price = null, listprice = :oldprice END-EXEC
検索条件には、インジケータ変数を使用できません。NULL 値を検索するには、
is null
構成体を使用してください。
たとえば、次のコードが使用できます。
if saleprice-null equal -1 EXEC SQL DELETE FROM closeoutsale WHERE temp_price is null END-EXEC else EXEC SQL DELETE FROM closeoutsale WHERE temp_price = :saleprice END-EXEC end-if
データがデータベースからホスト変数に取り出されたときに、
切り捨てが実行される場合は、インジケータ変数が別の用途で役に立ちます。
ホスト変数がデータベースから返されるデータを保持できるほど大きくない場合は、
SQLCA データ構造体に警告フラグ、sqlwarn1
が設定され、
インジケータ変数はデータベースのデータのサイズに設定されます。
インジケータ変数と同じ方法で、インジケータ配列を使用することができます。 つまり、以下のことを行えます。
次の例では、インジケータ配列を使用して NULL 値を列に挿入できるようにするため、 インジケータ配列に -1 が設定されます。
EXEC SQL BEGIN DECLARE SECTION END-EXEC 01 sales-id OCCURS 25 TIMES PIC X(12). 01 sales-name OCCURS 25 TIMES PIC X(40). 01 sales-comm OCCURS 25 TIMES PIC S9(9) COMP-5. 01 ind-comm OCCURS 25 TIMES PIC S9(4) COMP-5. EXEC SQL END DECLARE SECTION END-EXEC. . . . MOVE -1 TO ind-comm. . . . EXEC SQL INSERT INTO SALES (ID, NAME, COMM) VALUES (:sales_id, :sales_name, :sales_comm:ind-comm) END-EXEC
注: COBSQL を使用している場合は、このインジケータ配列に関する情報が、 Oracle データベースを使用している場合にかぎり適用されます。 Sybase データベースを使用している場合は適用されません。
Copyright © 2006 Micro Focus International Limited. All rights reserved.