注:
>>--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.