我在RATOR_MONITORING
架构中有40多个表,表名从'TEMP_'
开始。我想在一个查询中一次删除所有这些表中的数据,而不是对每个表使用delete语句。我甚至不想生成语句。如果需要,我可以创建匿名块,但不知道如何做到这一点。我尝试了下面的查询,但它不起作用。
Delete from RATOR_MONITORING_CONFIGURATION.'%TEMP_';
答案 0 :(得分:1)
如果要删除所有行,请更好地使用 TRUNCATE ,它会重置高位水印。但请记住,truncate是一个 DDL 语句,因此会有一个隐式提交;使用 DELETE ,您可以在验证后手动提交。
虽然,我不会在生产环境中这样做。如果您正在测试环境中进行构建测试数据,那么您可以(ab)使用 EXECUTE IMMEDIATE 。
例如,以RATOR_MONITORING
user:
DECLARE
v_sql VARCHAR2(100);
BEGIN
FOR i IN
(SELECT table_name FROM user_tables where table_name like 'TEMP%'
)
LOOP
v_sql := 'TRUNCATE TABLE '||i.table_name;
EXECUTE immediate v_sql;
END LOOP;
END;
/
顺便说一句,使用一个好的文本编辑器,构建DELETE / TRUNCATE语句并在纯SQL 中执行它不会超过一分钟。