【问题标题】:Drop table having name: <table_name>_(sysdate-1) only if the table exist仅当表存在时才删除具有名称的表:<table_name>_(sysdate-1)
【发布时间】:2017-02-07 17:59:57
【问题描述】:

只有在表存在时才需要删除表,可以使用 plsql 块来完成

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

但在我的情况下,表名具有 sysdate (02062017) 例如 table001_02072017,我需要使用 sysdate-1 删除所有此类表。 我该怎么做?

【问题讨论】:

  • 为什么只有存在的表才需要删除它?如果你删除了一个不存在的表,你认为会发生什么?
  • 我需要删除表,如果它存在。
  • 这不能回答我的问题。为什么只有当它存在时才需要删除它?如果你删除一个不存在的表,你认为会发生什么坏事?
  • 如果我删除一个不存在的表,它会报错。我只是在避免这种错误处理。
  • 那个错误不需要处理!您的所有处理都可以继续进行而不会产生任何不良影响。这就是我一直想告诉你的。

标签: sql oracle plsql oracle11g oracle-sqldeveloper


【解决方案1】:

您可以从user_tables 字典表中找到具有给定模式的表,然后循环遍历结果以逐个删除。

begin
  for t in (select table_name from user_tables
            where table_name like '%\_'||to_char(sysdate-1,'mmddyyyy') escape '\') 
  loop
    execute immediate 'drop table ' || t.table_name;
  end loop;
exception
  /* Handle your exceptions here. */
end;
/

不鼓励在异常处理中使用WHEN OTHERS。您应该明确处理错误。

【讨论】:

  • exception when others then...?请不要鼓励不良做法!
  • @mathguy,好吧,您可以使用exception when others then... 以更易于理解的格式显示错误消息,然后重新引发错误。我认为 AskTom 上有一篇关于此的文章。
【解决方案2】:

动态 sql 将帮助您在这里使用

execute immediate 'drop table ' || table_name;

在你的过程中

【讨论】:

    猜你喜欢
    • 2019-07-28
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多