【问题标题】:I don't want to have the error when I drop a table although the table doesn't exist [duplicate]尽管该表不存在,但我不想在删除表时出现错误[重复]
【发布时间】:2016-05-09 19:23:18
【问题描述】:

我正在使用 Oracle 12c,我不想在删除表“CONTINENT”时出错,以防万一它不存在。

我这样做了

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;

但是当表不存在时它不能跳过错误,请问我该如何解决这个问题

【问题讨论】:

  • 不相关,但是:在 Oracle 中 DDL 之后不需要提交。
  • 我不太明白你的意思,你的意思是我必须删除提交,如果是的话我做了但错误仍然存​​在
  • 您收到一个错误,但它不会阻止脚本继续运行,那么您的问题是什么?它输出它的事实? pastebin.com/YaK1Bv2j这看起来像你想要的解决方案:stackoverflow.com/questions/3851246/…

标签: sql oracle sqlplus


【解决方案1】:

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

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

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

附带说明,DROP 是一个将隐式提交的 DDL 语句,因此无需明确提及 COMMIT。 p>

【讨论】:

  • 为了减少脚本长度(如果你要删除几个表)你可以把它放在一个过程中,
  • "所以需要明确提及 COMMIT" 或者说没有必要
  • @Kamil 谢谢,这是一个错字。
  • 如果没有表,我认为跳过表的删除不是问题。但是我认为您的脚本的问题是,如果删除了表或没有表,则在日志文件中看不到。有时,从日志文件中提取此信息可能对您有用。
  • @miracle173 这就是 OP 的要求。好吧,它在测试/开发环境中确实有帮助,在这些环境中,您不时地删除和重新创建对象。此外,有时您需要将 DROP 放在 CREATE 之前以使脚本可重新执行。然后,您第一次知道该表不存在,因此您故意希望它被跳过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-08
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
  • 2014-09-10
  • 1970-01-01
  • 2016-05-27
相关资源
最近更新 更多