SELECT DISTINCT (DECLARE CURSOR を使用)

SELECT DISTINCT 文にカーソル名が関連付けられて、FETCH 文を使用してデータ行を取得できるようになります。

構文:

>>---EXEC SQL--.------------.------DECLARE cursor_name---->
               +-AT db_name-+

 >---CURSOR FOR------SELECT DISTINCT------select_list------>

 >---FROM----table_list--.-----------------2--END-EXEC----><
                         +-select_options--+

パラメーター:

db_name DECLARE DATABASE を使用して宣言されているデータベースの名前。
cursor_name 以後の文でカーソルを示すために使用されるカーソル名。カーソル名には、有効なファイル名の文字を 30 字まで含めることができます。最初の文字は英字でなければなりません。
select_list 検索する列の名前。
table_list select_list で指定した検索対象となる列を含むテーブルの名前。
select_options 検索する行数または検索する行の順序 (またはその両方) を制限するためのオプション。

コメント:

別々にコンパイルされたプログラムでは、同じカーソルを共有できません。特定のカーソルを参照する文はすべて、同時にコンパイルする必要があります。

SELECT DISTINCT 文は、カーソルが開いたときに実行されます。SELECT DISTINCT 文には、次の規則が適用されます。

  • INTO 句またはパラメーターマーカーを含めることはできません。
  • 前に宣言節で識別された入力ホスト変数を含めることはできません。
  • 一部の ODBC ドライバーでは、位置指定更新または位置指定削除を実行する場合、SELECT DISTINCT 文に FOR UPDATE 句を含める必要があります。
注:

行セットにある重複行を削除するには、SELECT INTO ではなく SELECT DISTINCT を使用します。

例:

 01 age-array        pic s9(09) comp-5 occurs 10 times.
 01 lname-array      pic x(32)   occurs 10 times.

    MOVE 5 TO staff-id
    EXEC SQL
       SELECT DISTINCT last_name
          INTO :lname-array
          FROM staff
          WHERE staff_id > :staff-id
    END-EXEC

    EXEC SQL
       SELECT DISTINCT age
          INTO :age-array
          FROM staff
          WHERE first_name > 'George'
    END-EXEC