Oracleで次のエラーが発生します。
ORA-00933: DROP SEQUENCE IFEXISTSownername.seq_nameのSQLコマンドが正しく終了
していません。
なぜ私はこれを見ているのですか?
この句は、OracleIF EXISTS
のコマンドには存在しません。DROP SEQUENCE
PLSQL ブロックを使用してエラーを無視できます。
SQL> DECLARE
2 sequence_doesnt_exist EXCEPTION;
3 PRAGMA EXCEPTION_INIT(sequence_doesnt_exist, -2289);
4 BEGIN
5 EXECUTE IMMEDIATE 'DROP SEQUENCE seq_name';
6 EXCEPTION
7 WHEN sequence_doesnt_exist THEN NULL;
8 END;
9 /
PL/SQL procedure successfully completed
問題は、「存在する場合」が Oracle で機能しないことです。使用する:
drop sequence ownername.seq_name;
他の人が述べたように、IF EXISTS は DROP SEQUENCE コマンドでは機能しません。
シーケンスの存在をテストするには、適切なビューを確認する必要があります。
SELECT *
FROM USER_SEQUENCES
WHERE sequence_name = ?
SELECT *
FROM DBA_SEQUENCES
WHERE sequence_name = ?
SELECT *
FROM ALL_SEQUENCES
WHERE sequence_name = ?
例:
BEGIN
FOR i IN (SELECT sequence_name
FROM USER_SEQUENCES
WHERE sequence_name = ?)
LOOP
EXECUTE IMMEDIATE ('DROP SEQUENCE '|| i.sequence_name);
END LOOP;
END;
これを試して:
DECLARE
iNum NUMBER DEFAULT 0;
BEGIN
SELECT COUNT(1)
INTO iNum
FROM ALL_SEQUENCES
WHERE SEQUENCE_OWNER='<OWNER_NAME>'
AND SEQUENCE_NAME = '<YOUR_SEQUENCE_NAME>';
IF iNum> 0 THEN
EXECUTE IMMEDIATE 'DROP SEQUENCE <OWNER_NAME>.<YOUR_SEQUENCE_NAME>';
END IF;
END;