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

时间:2017-02-07 17:59:57

标签: sql oracle plsql oracle11g oracle-sqldeveloper

我只需要在表存在时删除表,可以使用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删除所有这些表。 我怎么能这样做?

2 个答案:

答案 0 :(得分: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。您应该明确处理错误。

答案 1 :(得分:0)

动态sql将帮助您使用

execute immediate 'drop table ' || table_name;

在您的程序中