ホスト配列

配列とは、1 つの変数名に関連付けられた複数のデータ項目の集まりです。複数のホスト変数を配列 (ホスト配列) として定義すると、これらの変数を単一の SQL 文で処理できます。

ホスト配列は、INSERT 文、UPDATE 文、および DELETE 文の入力変数として使用したり、SELECT 文や FETCH 文の INTO 句で出力変数として使用したりできます。配列を SELECT 文、FETCH 文、DELETE 文、INSERT 文、および UPDATE 文で使用して、大量のデータを扱うことができます。

ホスト配列を使用するいくつかの利点を次に示します。
  • 1 つの SQL 文を実行するだけで CALL、EXECUTE、INSERT、または UPDATE の複数操作を実行できます。これにより、アプリケーションとデータベースが異なるシステム上にある場合は特に、パフォーマンスを大幅に向上させることができます。
  • バッチでデータをフェッチすることができます。これは、情報のスクロール リストを作成する際に便利です。

通常のホスト変数と同様に、ホスト配列はプログラムで宣言してから SQL 文でそれらを参照する必要があります。

ホスト配列の宣言

ホスト配列は、通常のホスト変数とほぼ同様に BEGIN DECLARE SECTION と END DECLARE SECTION を使用して宣言します。ただし、配列の次元を OCCURS 句で指定する必要があります。

ホスト配列の参照

組み込み SQL 文へのホスト配列のコーディングには次のルールが適用されます。
  • 通常のホスト変数と同様に、ホスト配列名の前にはコロン (;) を配置する必要があります。
  • 利用可能な行の数が、配列で定義された行の数よりも多い場合、SELECT 文は配列で定義された行数を返し、追加の行を返せなかったことを示すために SQLCODE メッセージが発行されます。
  • SELECT 文は、選択する行の最大数が分かっている場合に使用してください。返される行数が不明の場合は、FETCH 文を使用してください。
  • 単一の SQL 文内で複数のホスト配列を使用する場合は、各配列の次元を同一にする必要があります。
  • OpenESQL は、単一の SQL 文内でのホスト配列と通常のホスト変数の併用をサポートしません。それらは、通常のホスト変数か、ホスト配列でなければなりません。
  • OpenESQL の場合、ホスト配列内のホスト変数の発生回数は、すべて同一数で定義する必要があります。1 つの変数の発生回数が 25 である場合は、そのホスト配列内のすべての変数の発生回数が 25 である必要があります。
  • Oracle で COBSQL を使用している場合、ホスト配列を参照する SELECT 文の WHERE 句で通常のホスト変数をコーディングできます。これは、通常のホスト変数とホスト配列の混合を可能にする唯一のシナリオです。
  • 必要に応じて、FOR 句を使用して、必要なものに対してのみ処理される配列の要素数を制限できます。これは、UPDATE 文、INSERT 文、および DELETE 文で配列の一部のみを処理する場合に特に便利です。次の規則が適用されます。
    • FOR 句の変数の値が 0 以下の場合、行は処理されません。
    • 処理される配列の要素数は、ホスト配列の次元数と 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).
 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)

次の例は FOR 句を使用して、UPDATE 文によって変更された 10 行 (:maxitems の値) を示しています。

 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)