SET SCROLLOPTION

カーソルのスクロール オプションを設定できるようになります。

構文:

>>--EXEC SQL--SET SCROLLOPTION--.-KEYSET----.--END-EXEC-><
                                +-DYNAMIC------+
                                +-FORWARD------+
                                +-STATIC-------+
                                +-FASTFORWARD--+
                                +-FAST FORWARD-+

パラメーター:

KEYSET キーセット カーソルでは、カーソルの結果集合内の行のメンバーシップおよび順序は、カーソルを開いた時点で決まります。行が削除されている場合、または行が更新されていて WHERE 句の条件を満たさなくなっている場合、行は取得されません。1 つのテーブルに基づいてカーソルを使用して行を挿入した場合に限り、カーソルの結果セットに行が含まれます。結果セットの任意の行に対して行われた、カーソル所有者による更新、および他のユーザーによってコミットされた変更は表示可能です。
DYNAMIC 動的カーソルでは、カーソルの結果集合内の行のメンバーシップが取得時に決まるため、メンバーシップが取得ごとに変わる場合があります。行が削除されている場合、または行が更新されていて WHERE 句の条件を満たさなくなっている場合、カーソルの結果セットから行が消去されます。行が挿入されている場合、または行が更新されていて WHERE 句の条件を満たしている場合、結果セットに行が含まれます。結果セットの任意の行に対して行われた、カーソル所有者による更新、および他のユーザーによってコミットされた変更は表示可能です。
FORWARD DYNAMIC と同じですが、アプリケーションは結果集合の前方にのみ移動できます。
STATIC 静的カーソルでは、結果集合は静的になります。カーソルを開いた後に行われた、メンバーシップ、結果セットの順序、または結果セットの値への変更は、常に検出されるとは限りません。
FASTFORWARD

および

FAST FORWARD
FAST FORWARD および FASTFORWARD は同義です。これは、FORWARD および READ-ONLY カーソルにのみ適用されるパフォーマンス最適化パラメーターです。また、AUTOFETCH 指令を使用してプログラムをコンパイルすると、パフォーマンスをさらに向上させることができます。この方法は、アプリケーションに結果セットを取り込む最も効率的な方法です。AUTOFETCH 指令を使用すると、ネットワーク トラフィックを大幅に減少できる 2 つの最適化が有効になります。パフォーマンスが最も向上するのは、アプリケーションのメモリにキャッシュできるサイズの比較的小さい結果セットを使用してカーソルを処理する場合です。FASTFORWARD カーソルは、Microsoft SQL Server 2000 以降のサーバーでのみ使用できます。

依存関係:

BEHAVIOR コンパイラ指令オプションは、UNOPTIMIZED に設定する必要があります。

説明:

SET SCROLLOPTION 文は、すべての ODBC ドライバーでサポートされているわけではありません。

接続を確立してから、SET SCROLLOPTION を使用する必要があります。

次の場合を除いて、デフォルトは DYNAMIC です。

  • SQL コンパイラ指令の ESQLVERSION オプションを 2.0 に設定する場合。この場合のデフォルト値は KEYSET です。
  • ODBC ドライバーが DYNAMIC をサポートしていない場合。この場合は、SET SCROLLOPTION が FORWARD に設定されます (この設定はすべての ODBC ドライバーでサポートされます)。
  • FAST FORWARD は Microsoft SQL Server データ ソースでのみ機能します。

ODBC ドライバーがサポートしていないオプションを設定しようとすると、エラー (-19512) が発生します。

例:

 PROGRAM-ID. progname.
 WORKING-STORAGE SECTION.
 EXEC SQL INCLUDE SQLCA END-EXEC
 01      buffer      PIC x(32).
 01      cnt         PIC 9 COMP-5.

 PROCEDURE DIVISION.
     EXEC SQL CONNECT TO 'srv1' USER 'sa' END-EXEC
     IF SQLCODE NOT = ZERO
        DISPLAY 'Error: Could not connect to database.'
        DISPLAY SQLERRMC
        DISPLAY SQLERRML
     END-IF
* Any cursors declared hereafter can be updated dynamically
     EXEC SQL SET SCROLLOPTION DYNAMIC END-EXEC
     IF SQLCODE NOT = ZERO
        DISPLAY 'Error: Could not set scroll option.'
        DISPLAY SQLERRMC
        DISPLAY SQLERRML
        EXEC SQL DISCONNECT ALL END-EXEC
        STOP RUN
     END-IF

* Ensure multiple tables are not created ...
     EXEC SQL DROP TABLE phil1 END-EXEC

* Create a table...
     EXEC SQL
        CREATE TABLE phil1
             (ident      char(3)
             ,textbit    char(3))
     END-EXEC

     IF SQLCODE NOT = ZERO
        DISPLAY 'Error: Could not create table.'
        DISPLAY SQLERRMC
        DISPLAY SQLERRML
        EXEC SQL DISCONNECT ALL END-EXEC
        STOP RUN
     END-IF

* Insert some values into it...
     EXEC SQL
        INSERT INTO phil1
            (ident
            ,textbit)
        VALUES
            ('AAA'
            ,'BBB')
     END-EXEC

     IF SQLCODE NOT = ZERO
        DISPLAY 'Error: Could not insert values.'
        DISPLAY SQLERRMC
        DISPLAY SQLERRML
        EXEC SQL DISCONNECT ALL END-EXEC
        STOP RUN
     END-IF

     EXEC SQL
        INSERT INTO phil1
            (ident
           ,textbit)
         VALUES
           ('CCC'
            ,'DDD')
    END-EXEC

     IF SQLCODE NOT = ZERO
        DISPLAY 'Error: Could not insert values.'
        DISPLAY SQLERRMC
        DISPLAY SQLERRML
        EXEC SQL DISCONNECT ALL END-EXEC
        STOP RUN
     END-IF

* Declare a cursor...
     EXEC SQL
        DECLARE C1 CURSOR FOR
           SELECT ident
           FROM phil1
           WHERE textbit = 'BBB'
     END-EXEC

     IF SQLCODE NOT = ZERO
        DISPLAY 'Error: Could not declare cursor.'
        DISPLAY SQLERRMC
        DISPLAY SQLERRML
        EXEC SQL DISCONNECT ALL END-EXEC
        STOP RUN
     END-IF

* Open it...
     EXEC SQL
        OPEN C1
     END-EXEC
     IF SQLCODE NOT = ZERO
        DISPLAY 'Error: Could not open cursor.'
        DISPLAY SQLERRMC
        DISPLAY SQLERRML
        EXEC SQL DISCONNECT ALL END-EXEC
        STOP RUN
     END-IF

* Update one of the rows in the table such that it now meets the
* cursor requirements...
     EXEC SQL
        UPDATE phil1
        SET textbit = 'BBB'
        WHERE ident = 'CCC'
     END-EXEC

     IF SQLCODE NOT = ZERO
        DISPLAY 'Error: Could not update row.'
        DISPLAY SQLERRMC
        DISPLAY SQLERRML
        EXEC SQL DISCONNECT ALL END-EXEC
        STOP RUN
     END-IF

* Despite the row being updated to meet cursor requirement after
* the cursor was opened, SET SCROLLOPTION DYNAMIC should ensure
* that it is pointed to by the cursor. Check the displayed output
* to be sure...
    MOVE 0 TO cnt
    PERFORM UNTIL SQLCODE NOT = ZERO
       EXEC SQL
          FETCH C1 INTO :buffer
       END-EXEC
       IF SQLCODE = ZERO
          DISPLAY buffer
       END-IF
    END-PERFORM

    EXEC SQL
       CLOSE C1
    END-EXEC

    IF SQLCODE NOT = ZERO
       DISPLAY 'Error: Could not close cursor.'
       DISPLAY SQLERRMC
       DISPLAY SQLERRML
       EXEC SQL DISCONNECT ALL END-EXEC
       STOP RUN
    END-IF

    EXEC SQL DROP TABLE phil1 END-EXEC

    IF SQLCODE NOT = ZERO
       DISPLAY 'Error: Could not drop table.'
       DISPLAY SQLERRMC
       DISPLAY SQLERRML
       EXEC SQL DISCONNECT ALL END-EXEC
       STOP RUN
    END-IF

    EXEC SQL DISCONNECT CURRENT END-EXEC
    STOP RUN.