>>---EXEC SQL---DELETE---FROM---table_name---------------> >----WHERE CURRENT OF---cursor_name---END-EXEC---><
table_name | SELECT FROM オプションで使用するものと同じテーブル名 (DECLARE CURSOR を参照) を指定します。 |
cursor_name | 前に宣言された開いているフェッチされたカーソルを指定します。 |
ODBC は位置付け削除をサポートします。位置付け削除は、拡張構文でカーソルを使って最後にフェッチされた行を削除します (ODBC 1.0 では主要構文で更新されていましたが、ODBC 2.0では拡張構文に移行しました)。 すべてのドライバが位置付け削除をサポートしているわけではありません。ただし、OpenESQL では、位置付け更新および位置付け削除が容易にできるように、ODBC カーソル名を COBOL カーソル名と同じ名前に設定します。
ODBC ドライバによっては、カーソルが使用する SELECT 文は、位置付け削除を可能にするために FOR UPDATE 句を含む必要があります。
位置付け削除ではホスト配列を使用できません。
標準 SQL 文で使用されるもう 1 つの形式 DELETE は、検索削除と呼ばれます。
ほとんどのデータソースでは、SET 文によって指定される、または DECLARE CURSOR 文で指定される SCROLLOPTION と CONCURRENCY の特定の組み合わせが必要です。
ODBC カーソルのライブラリにより、位置付け削除の制限付き実装が提供されます。SQL(USECURLIB=YES) でコンパイルし、SCROLLOPTION STATIC および CONCURRENCY OPTCCVAL (または OPTIMISTIC) を使用することによって、その削除を行うことができます。
* Declare a cursor for update EXEC SQL DECLARE C1 CURSOR FOR SELECT staff_id, last_name FROM staff FOR UPDATE END-EXEC IF SQLCODE NOT = ZERO DISPLAY 'Error: Could not declare cursor for update.' DISPLAY SQLERRMC DISPLAY SQLERRML EXEC SQL DISCONNECT ALL END-EXEC STOP RUN END-IF * Open the cursor EXEC SQL OPEN C1 END-EXEC IF SQLCODE NOT = ZERO DISPLAY 'Error: Could not open cursor for update.' DISPLAY SQLERRMC DISPLAY SQLERRML EXEC SQL DISCONNECT ALL END-EXEC STOP RUN END-IF * Display staff member's details and give user the opportunity * to delete particular members. PERFORM UNTIL SQLCODE NOT = ZERO EXEC SQL FETCH C1 INTO :staff-id,:last-name END-EXEC IF SQLCODE = ZERO DISPLAY 'Staff ID: ' staff-id DISPLAY 'Last name: ' last-name DISPLAY 'Delete <y/n>? ' WITH NO ADVANCING ACCEPT usr-input IF usr-input = 'y' EXEC SQL DELETE FROM staff WHERE CURRENT OF C1 END-EXEC IF SQLCODE NOT = ZERO DISPLAY 'Error: Could not delete record.' DISPLAY SQLERRMC DISPLAY SQLERRML END-IF END-IF END-IF END-PERFORM