カーソルのスクロール オプションを設定できるようになります。
構文:
>>--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 に設定する必要があります。
例:
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.
説明:
SET SCROLLOPTION 文は、すべての ODBC ドライバーでサポートされているわけではありません。
接続を確立してから、SET SCROLLOPTION を使用する必要があります。
次の場合を除いて、デフォルトは DYNAMIC です。
ODBC ドライバーがサポートしていないオプションを設定しようとすると、エラー (-19512) が発生します。