SET SCROLLOPTION

注:

  1. SET SCROLLOPTION 文は、すべての ODBC ドライバでサポートされているわけではありません。
  2. 接続を確立してから、SET SCROLLOPTION を使用する必要があります。
構文
>>--EXEC SQL--SET SCROLLOPTION--.-KEYSET----.--END-EXEC-><
                                +-DYNAMIC------+
                                +-FORWARD------+
                                +-STATIC-------+
                                +-FASTFORWARD--+
                                +-FAST FORWARD-+
パラメーター
KEYSET キー設定カーソルでは、カーソルの結果集合にある行のメンバーシップと順序は、カーソルが開いたときに決定されます。 行を削除する場合、または WHERE 句の条件を満たさないように行を更新する場合は、行が取り込まれません。 1 つのテーブルに基づいたカーソルを使用して行が挿入された場合に限り、カーソルの結果集合に行が表示されます。 結果集合の任意の行に対して行われた、カーソルのオーナーによる更新、および他のユーザーによってコミットされた変更は表示できます。
DYNAMIC 動的カーソルでは、カーソルの結果集合内の行のメンバーシップが取り込み時に決定されます。そのため、このメンバーシップは取り込む度に異なることがあります。 行を削除する場合、または WHERE 句の条件を満たさないように行を更新する場合は、カーソルの結果集合から行が削除されます。 行を挿入する場合、または WHERE 句の条件を満たすように更新する場合は、行が結果集合に表示されます。 結果集合の行に対して行われた、カーソルのオーナーによる更新、および他のユーザーによってコミットされた変更は表示できます。
FORWARD DYNAMIC と同じですが、アプリケーションは結果集合の前方のみに移動できます。
STATIC 静的カーソルでは、結果集合は静的になります。 カーソルを開いた後に結果集合のメンバーシップ、順序、または、値を変更した場合は、これらの変更が検出されないことがあります。
FAST FORWARD FAST FORWARD と FASTFORWARD は同義です。 これは、FORWARD、READ-ONLY カーソルにのみ適用されるパフォーマンス最適化パラメーターです。 AUTOFETCH 指令を使用してプログラムをコンパイルする方法でも、パフォーマンスを向上させることができます。この方法は、アプリケーションに結果集合を取り入む最も効率のよい方法です。 AUTOFETCH 指令で 2 つの最適化を有効にすると、ネットワークトラフィックを大幅に減少させることができます。 パフォーマンスを最も向上させることができるのは、アプリケーションのメモリにキャッシュできる大きさの比較的小さい結果集合を使用してカーソルを処理する場合です。 FASTFORWARD カーソルは、Microsoft SQL Server 2000 以上のサーバーでのみ使用できます。
注釈

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

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.