カーソルの使用によって最後にフェッチされた行を削除します。
構文:
>>---EXEC SQL---DELETE---FROM---table_name--------------->
>----WHERE CURRENT OF---cursor_name---END-EXEC---><
パラメーター:
| table_name |
SELECT FROM オプションで使用するものと同じテーブル名 (「DECLARE CURSOR」を参照)。 |
| cursor_name |
宣言後に開かれ、取り込まれたカーソル。 |
例:
* 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
コメント:
ODBC は位置指定削除をサポートします。位置指定削除は、拡張構文でカーソルを使って最後にフェッチされた行を削除します (ODBC 1.0 では主要構文で更新されていましたが、ODBC 2.0では拡張構文に移行しました)。すべてのドライバーが位置指定削除をサポートしているわけではありません。 ただし、OpenESQL では、位置指定更新および位置指定削除が容易にできるように、ODBC カーソル名を COBOL カーソル名と同じ名前に設定します。
ODBC ドライバーによっては、カーソルで使用する SELECT 文に、位置指定削除を可能にする FOR UPDATE 句を指定する必要があります。
位置指定削除ではホスト配列を使用できません。
標準 SQL 文で使用されるもう 1 つの形式 DELETE は、検索削除と呼ばれます。
ほとんどのデータソースでは、特定の組み合わせの SCROLLOPTION と CONCURRENCY を SET 文または DECLARE CURSOR 文で指定する必要があります。
ODBC カーソルのライブラリにより、位置指定削除の制限付き実装が提供されます。 SQL(USECURLIB=YES) でコンパイルし、SCROLLOPTION STATIC および CONCURRENCY OPTCCVAL (または OPTIMISTIC) を使用することによって、その削除を行うことができます。