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