ホスト変数への単一行データの取り出し

照会からただ 1 つの行が戻されることが分かっていれば、取り出した行の列値を格納する 1 つ以上のホスト変数を指定できます。

このタスクについて

制限事項Db2 が返す行数が不明である場合、または Db2 が複数の行を返すことが予想される場合は、これらの指示は適用されません。 これらの場合はカーソルを使用してください。 カーソルを使用すると、 アプリケーションが 1 セットの行を戻して、結果表から一度に 1 行ずつ取り出すことも、 一度に 1 行セットずつ取り出すこともできます。

プロシージャー

ホスト変数に単一行データを取り出すには、以下の手順で行います。

SELECT ステートメントで、取り出された値を入れるための 1 つ以上のホスト変数の名前とともに INTO 文節を指定します。 取り出される値ごとに 1 つの変数を指定します。 取り出される値は、列値、ホスト変数の値、式の結果、または集約関数の結果です。
推奨 :1行のみが返されるようにしたい場合は、FETCH FIRST 1 ROW ONLY句を指定します。 ORDER BY 文節を使用して、戻される行を制御することを検討してください。 ORDER BY 文節と FETCH FIRST 文節の両方を指定すると、 結果セット全体でソートが行われた後に、その最初の行が戻されます。

Db2 結果行の最初の値をリストの最初の変数に割り当て、2番目の値を2番目の変数に割り当てます。

SELECTステートメントが複数の行を返し、Db2エラーを返し、返されるデータが未定義で予測できない場合。

例: 1つの行をホスト変数に入れる
特定の従業員の DSN8C10. EMP テーブルから LASTNAME 列と WORKDEPT 列の値を取得するとします。 各列値を収容するためのホスト変数をプログラム内に定義してから、そのホスト変数名を SELECT ステートメントの INTO 文節で指定できます。以下の COBOL の例を参照してください。
MOVE '000110' TO CBLEMPNO.  
EXEC SQL
  SELECT LASTNAME, WORKDEPT
    INTO :CBLNAME, :CBLDEPT
    FROM DSN8C10.EMP
    WHERE EMPNO = :CBLEMPNO
END-EXEC.

この例で、SQL ステートメントではホスト変数 CBLEMPNO の前にコロン (:) が付きますが、COBOL の MOVE ステートメントではコロンは付きません。

この例では、検索条件で値を指定する際にホスト変数も使用します。 ホスト変数 CBLEMPNO は従業員番号に対して定義済みです。このため、ホスト変数 CBLEMPNO の値 (この例では 000110) と同じ従業員番号を持つ従業員の 名前と作業部門を取り出せます。

COBOLプログラムのDATA DIVISIONセクションでは、 DSN8C10.EMPテーブルの EMPNO、LASTNAME、およびWORKDEPT列のデータタイプと互換性のあるホスト変数CBLEMPNO、CBLNAME、およびCBLDEPTを宣言する必要があります。

例:クエリが単一の行のみを返すようにします。
SELECT ステートメントに FETCH FIRST 1 ROW ONLY 文節を使用して、 必ず 1 行のみが戻されるようにできます。 このアクションにより、SELECT ステートメントの INTO 文節を指定したときに、不確実で予測不能なデータが戻されないようになります。 次の例の SELECT ステートメントは、 DSN8C10. EMP テーブルの 1 行のみが返されることを保証します。
EXEC SQL
  SELECT LASTNAME, WORKDEPT
    INTO :CBLNAME, :CBLDEPT
    FROM DSN8C10.EMP
    FETCH FIRST 1 ROW ONLY
END-EXEC.

前の例に ORDER BY 文節を組み込んで、戻される行を制御することができます。 次の例の SELECT ステートメントでは、アルファベット順で最初になる姓を持つ行のみが確実に戻ります。

EXEC SQL
   SELECT LASTNAME, WORKDEPT
     INTO :CBLNAME, :CBLDEPT
     FROM DSN8810.EMP
     ORDER BY LASTNAME
     FETCH FIRST 1 ROW ONLY
END-EXEC.
例:ホスト変数の値と式の結果をホスト変数に取得します。
SELECT 文節で項目リストを指定する場合、そのリストに表およびビューの列名以外も含めることができます。 すなわち、ホスト変数値と定数が混ざった 1 組の列値を要求することが可能です。 例えば、次の照会では、複数の列 (EMPNO、LASTNAME、および SALARY) の値、ホスト変数 (RAISE) の値、および列とホスト変数 (SALARY と RAISE) の合計値を要求します。 SELECT リスト内のこれらの 5 つの項目ごとに、ホスト変数が INTO 文節にリストされています。
MOVE 4476 TO RAISE.
MOVE '000220' TO PERSON.
EXEC SQL
  SELECT EMPNO, LASTNAME, SALARY, :RAISE, SALARY + :RAISE
    INTO :EMP-NUM, :PERSON-NAME, :EMP-SAL, :EMP-RAISE, :EMP-TTL
    FROM DSN8C10.EMP
    WHERE EMPNO = :PERSON
END-EXEC.

前の SELECT ステートメントでは、次の結果が戻されます。 列見出しはホスト変数の名前を表します。

EMP-NUM    PERSON-NAME    EMP-SAL      EMP-RAISE    EMP-TTL
=======    ===========    =======      =========    =======
 000220    LUTZ             29840           4476      34316
例:集計関数の結果をホスト変数に取得
照会では、集約関数からサマリー値が戻されるように要求し、それらの値をホスト変数に格納できます。 例えば、次の照会では、AVG 関数の結果を AVG-SALARY ホスト変数に格納するよう要求します。
MOVE 'D11' TO DEPTID.
EXEC SQL
  SELECT WORKDEPT, AVG(SALARY)
    INTO :WORK-DEPT, :AVG-SALARY
    FROM DSN8C10.EMP
    WHERE WORKDEPT = :DEPTID
END-EXEC.