【发布时间】:2017-03-28 21:26:01
【问题描述】:
作为脚本的一部分,我创建表以每天备份数据并创建名称为 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;
谢谢!
【问题讨论】:
-
sysdate, EXECUTE immediate ----- 我认为你使用的是 Oracle
-
你发帖的方式有什么问题?遍历表并执行 DROP 应该可以工作,为什么需要不同的解决方案?
-
也许你的意思是如何一次做 -2、-3、-4 等 - 你可以用另一个循环来做;或更简单地更改您的光标查询以排除您要保留的日期。但这不是一次性清理吗?如果您每天都运行此程序,您将只有一天的价值可以正常清除?