仅当表存在时才删除具有名称的表:<table_name>_(sysdate-1)

Posted

技术标签:

【中文标题】仅当表存在时才删除具有名称的表:<table_name>_(sysdate-1)【英文标题】:Drop table having name: <table_name>_(sysdate-1) only if the table exist 【发布时间】: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 删除所有此类表。 我该怎么做?

【问题讨论】:

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

在你的过程中

【讨论】:

以上是关于仅当表存在时才删除具有名称的表:<table_name>_(sysdate-1)的主要内容,如果未能解决你的问题,请参考以下文章

仅当表存在时如何删除 Amazon Redshift 中的表

仅当表中不存在两个 id 的组合时才将值插入表中

仅当它不存在时才在 SQLite 中创建表

仅当列存在时才适用于数据框列表

MongoDB + Mongoose:仅当给定键不存在或具有虚假值时才设置

MySQL 操作已存在的表(ALTER TABLE)