删除名称为TABLE_REPO _%_ <sysdate-2>,TABLE_REPO _%_ <sysdate-3>,TABLE_REPO _%_ <sysdate-4>等所有表格。

时间:2017-03-28 21:26:02

标签: sql oracle

作为我脚本的一部分,我创建表来每天备份数据并创建名为sysdate -1的表。但我不想用这样的表加载我的数据库,所以我一旦他们2天的时候我也放弃这些表。这有助于我将数据保留1天。表名将如下:     TABLE_REPO_CR_SYSDATE-1     TABLE_REPO_DRP_SYSDATE-1     TABLE_REPO_UPD_SYSDATE-1

所以假设今天是3月28日,我运行我的脚本,备份表将创建为:

TABLE_REPO_CR_20170327
TABLE_REPO_DRP_20170327
TABLE_REPO_UPD_20170327 

明天(3月29日),当我从今天和明天开始工作时,桌子将是:     TABLE_REPO_CR_20170328     TABLE_REPO_DRP_20170328     TABLE_REPO_UPD_20170328 3月30日,当我运行脚本时,将会:     TABLE_REPO_CR_20170329     TABLE_REPO_DRP_20170329     TABLE_REPO_UPD_20170329

现在我的问题是我要删除名称类似于TABLE_REPO _%_(SYSDATE-2和更少)的所有表格,例如TABLE_REPO _%_(sysdate-1)以外的所有表格

个人我可以删除,但如何删除所有?

 BEGIN

  FOR t in (SELECT tname FROM tab  WHERE tname like 'TABLE_REPO_%' || to_char(sysdate-2,'yyyymmdd'))
  LOOP
    EXECUTE immediate 'drop table ' || t.tname;
  END LOOP;
  EXCEPTION  WHEN OTHERS THEN
        IF SQLCODE != -942 THEN
             RAISE;
        END IF;
  END;
  /
 COMMIT;

谢谢!

1 个答案:

答案 0 :(得分:0)

你可以改变你的光标查询,找到所有匹配的表,除了今天或昨天的那些:

FOR t in (
  SELECT table_name as tname FROM user_tables
  WHERE table_name like 'TABLE_REPO_%'
  AND table_name NOT like 'TABLE_REPO_%' || to_char(sysdate-1,'yyyymmdd')
  AND table_name NOT like 'TABLE_REPO_%' || to_char(sysdate,'yyyymmdd')
)
LOOP

如果您的邮件表也以TABLE_REPO_开头,您也可以明确排除这些邮件:

  AND table_name NOT IN ('TABLE_REPO_CR', ...)

或查找任何以八个数字结尾的结尾(这是一个永远是日期的假设......):

  WHERE regexp_like(table_name, '^TABLE_REPO_.*\d{8}$')

(我也转而寻找user_tables.table_name而不是tab.tname,因为这是更常用的。在文档中它说&#34;包含TAB是为了兼容性.Oracle建议您不要使用此视图。&#34;)

快速演示以显示可以找到(和删除)的内容:

with user_tables (table_name) as (
  select 'TABLE_REPO_CR' from dual
  union all select 'TABLE_REPO_CR_' || to_char(sysdate - 3, 'yyyymmdd') from dual
  union all select 'TABLE_REPO_CR_' || to_char(sysdate - 2, 'yyyymmdd') from dual
  union all select 'TABLE_REPO_CR_' || to_char(sysdate - 1, 'yyyymmdd') from dual
  union all select 'TABLE_REPO_CR_' || to_char(sysdate, 'yyyymmdd') from dual
)
SELECT table_name as tname FROM user_tables
WHERE regexp_like(table_name, '^TABLE_REPO_.*\d{8}$')
AND table_name NOT like 'TABLE_REPO_%' || to_char(sysdate-1,'yyyymmdd')
AND table_name NOT like 'TABLE_REPO_%' || to_char(sysdate,'yyyymmdd');

TNAME                 
----------------------
TABLE_REPO_CR_20170326
TABLE_REPO_CR_20170327

顺便提一下,您可能还想检查今天和/或昨天执行的表格,以防出现问题或延迟或任何可能导致您没有备份的情况。< / p>