oracle ORA-00933: SQL 命令未正确结束

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/4820183/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-18 22:34:05  来源:igfitidea点击:

ORA-00933: SQL command not properly ended

sqloracleora-00933

提问by CodeRocker

I'm getting this error in Oracle:

我在 Oracle 中收到此错误:

ORA-00933: SQL command not properly ended
for
DROP SEQUENCE IF EXISTS ownername.seq_name;

ORA-00933:
对于
DROP SEQUENCE IF EXISTS ownername.seq_name,SQL 命令没有正确结束;

Why am I seeing this?

为什么我会看到这个?

回答by Vincent Malgrat

the IF EXISTSclause doesn't exist in the DROP SEQUENCEcommand in Oracle.

OracleIF EXISTS中的DROP SEQUENCE命令中不存在该子句。

You could use a PLSQL block to ignore the error:

您可以使用 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

回答by OMG Ponies

As others mentioned, the IF EXISTS doesn't work on the DROP SEQUENCE command.

正如其他人提到的,IF EXISTS 不适用于 DROP SEQUENCE 命令。

To test for the existence of a sequence, you need to check the appropriate view:

要测试序列是否存在,您需要检查相应的视图:

USER_SEQUENCES

USER_SEQUENCES

SELECT * 
  FROM USER_SEQUENCES
 WHERE sequence_name = ?

DBA_SEQUENCES

DBA_SEQUENCES

SELECT * 
  FROM DBA_SEQUENCES
 WHERE sequence_name = ?

ALL_SEQUENCES

ALL_SEQUENCES

SELECT * 
  FROM ALL_SEQUENCES
 WHERE sequence_name = ?

Example:

例子:

BEGIN
   FOR i IN (SELECT sequence_name 
               FROM USER_SEQUENCES
              WHERE sequence_name = ?) 
   LOOP
     EXECUTE IMMEDIATE ('DROP SEQUENCE '|| i.sequence_name);
   END LOOP;
END;

回答by Chandu

Try this:

尝试这个:

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;

回答by Pablo Santa Cruz

The problem is "if exists" does not work in Oracle. Use:

问题是“如果存在”在 Oracle 中不起作用。用:

drop sequence ownername.seq_name;