Sql 我不知道';我不想在删除表时出错,尽管该表没有';不存在

Sql 我不知道';我不想在删除表时出错,尽管该表没有';不存在,sql,oracle,sqlplus,Sql,Oracle,Sqlplus,我正在使用Oracle12c,如果我的表“Continental”不存在,我就不想在删除它时出错 是我干的 set echo on set serveroutput on alter session set current_schema=WORK_ODI; set verify off set pause off -- WHENEVER SQLERROR CONTINUE drop table CONTINENT; COMMIT; EXIT; 但是当表不存在时,它不能跳过错误,我如

我正在使用Oracle12c,如果我的表“Continental”不存在,我就不想在删除它时出错

是我干的

set echo on
set serveroutput on
alter session set current_schema=WORK_ODI;
set verify off
set pause off
--
WHENEVER SQLERROR CONTINUE  

drop table  CONTINENT;

COMMIT;

EXIT;

但是当表不存在时,它不能跳过错误,我如何解决这个问题请动态删除创建表是个坏主意。无论如何,如果您真的想这样做,那么您需要(ab)使用executeimmediatePL/SQL中执行此操作

例如,您可以编写一个匿名块:

BEGIN
   EXECUTE IMMEDIATE 'DROP TABLE table_name';
EXCEPTION
   WHEN OTHERS THEN
      IF SQLCODE != -942 THEN
         RAISE;
      END IF;
END;
/

另一方面,DROP是一个DDL语句,它将隐式提交,因此不需要显式地提到commit

动态地DROP创建表是个坏主意。无论如何,如果您真的想这样做,那么您需要(ab)使用executeimmediatePL/SQL中执行此操作

例如,您可以编写一个匿名块:

BEGIN
   EXECUTE IMMEDIATE 'DROP TABLE table_name';
EXCEPTION
   WHEN OTHERS THEN
      IF SQLCODE != -942 THEN
         RAISE;
      END IF;
END;
/

另一方面,DROP是一个DDL语句,它将隐式提交,因此没有必要明确提及commit

不相关,但是:在Oracle中,DDL之后不需要提交。我不太理解你的意思,你的意思是我必须删除commit,如果是,我做了,但错误仍然在这里,你会得到一个错误,但它不会阻止脚本继续,那么你的问题是什么?它到底输出了什么?这看起来像是您想要的解决方案:不相关,但是:在Oracle中DDL之后不需要提交。我不太理解您的意思,您的意思是我必须删除提交,如果是,我这样做了,但错误仍然存在。您得到一个错误,但它不会阻止脚本继续,那么您的问题是什么?它到底输出了什么?这看起来像是您想要的解决方案:为了减少脚本长度(如果您要删除多个表),您可以将其放在一个过程中,“因此需要显式地提到提交”,或者更确切地说,不需要提交need@Kamil谢谢,这是一个打字错误。我认为如果没有桌子,跳过桌子是没有问题的。但我认为脚本的问题在于,如果删除了表或没有表,则无法在日志文件中看到。有时,从日志文件中提取这些信息可能会对您有所帮助。@173这就是OP的要求。在测试/开发环境中,它确实有帮助,您可以时不时地删除和重新创建对象。此外,有时您需要在创建之前放置DROP,以使脚本重新可执行。然后,当您第一次知道该表不存在时,您故意希望跳过该表。要减少脚本长度(如果要删除多个表),您可以将其放入一个过程中,“因此需要显式地提及提交”,或者更确切地说,没有need@Kamil谢谢这是一个打字错误。我不认为如果没有桌子就跳过桌子是一个问题。但我认为脚本的问题在于,如果删除了表或没有表,则无法在日志文件中看到。有时,从日志文件中提取这些信息可能会对您有所帮助。@173这就是OP的要求。在测试/开发环境中,它确实有帮助,您可以时不时地删除和重新创建对象。此外,有时您需要在创建之前放置DROP,以使脚本重新可执行。然后,当您第一次知道该表不存在时,就故意希望跳过它。