仅当表存在时才删除具有名称的表:<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 中的表