作为我脚本的一部分,我创建表来每天备份数据并创建名为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;
谢谢!
答案 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
,因为这是更常用的。在文档中它说"包含TAB是为了兼容性.Oracle建议您不要使用此视图。")
快速演示以显示可以找到(和删除)的内容:
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>