前へはじめに データ型次へ

第 2 章 ホスト変数

ホスト変数とは、COBOL プログラムに定義されたデータ項目です。データベースとの値の受け渡しに使用されます。 ホスト変数は、COBOL プログラムの FILE SECTION、 LOCAL-STRAGE SECTION または LINKAG SECTION で定義されるものであり、 1 から 48 までの間のレベル番号を持ちます。 レベル 49 は VARCHAR データ項目に予約されています。

ホスト変数名を埋め込み SQL 文で使用する場合は、 コンパイラが同じ名前のホスト変数と表または列を区別できるように、 データ項目名の先頭にコロン (:) を付ける必要があります。

ホスト変数は、次の 2 つの方法のどちらかで使用されます。

たとえば、以下の文の :book-id は、 検索する本の ID を保持する入力ホスト変数であり、 :book-title は、検索結果を返す出力ホスト変数です。

EXEC SQL
   SELECT title INTO :book-title FROM titles
      WHERE title_id=:book-id
END-EXEC

2.1 ホスト変数の宣言

ホスト変数は、埋め込み 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.

注:


2.1.1 OpenESQL および DB2 プリプロセッサ

ホスト変数が BEGIN DECLARE SECTION および END DECLARE SECTION を使用して宣言されていない場合でも、 ホスト変数としてデータ項目を使用することができます。

ホスト変数を宣言するには、次のことに留意する必要があります。

2.2 ホスト配列

配列とは、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 文で複数のホスト配列を使用する場合は、 その次元数を同じにする必要があります。

2.2.1 FOR 句

デフォルトでは、配列全体は 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 データベースのいずれかを使用している場合は、適用されません。


2.3 インジケータ変数

埋め込み SQL では、インジケータ変数を使用することによって、 データベースから NULL 値を格納したり、取り出すことができます。 インジケータ変数は、つねに次のように定義されます。

pic S9(4) comp-5.

2.3.1 NULL 値

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

2.3.2 データの切り捨て

データがデータベースからホスト変数に取り出されたときに、 切り捨てが実行される場合は、インジケータ変数が別の用途で役に立ちます。 ホスト変数がデータベースから返されるデータを保持できるほど大きくない場合は、 SQLCA データ構造体に警告フラグ、sqlwarn1 が設定され、 インジケータ変数はデータベースのデータのサイズに設定されます。

2.3.3 インジケータ配列

インジケータ変数と同じ方法で、インジケータ配列を使用することができます。 つまり、以下のことを行えます。

次の例では、インジケータ配列を使用して 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 © 2002 Micro Focus International Limited. All rights reserved.
本書ならびに使用されている固有の商標と商品名 は国際法で保護されています。

前へはじめに データ型次へ