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 取得する行の数または順序 (あるいはその両方) を制限するために指定するオプション。

説明:

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

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