我有RATOR_MONITORING
架构中超过40个表,其表名从'TEMP_'
开始。我想在一次查询中一次删除所有这些表中的数据,而不是使用每个表的delete语句。我甚至不想生成语句。如果需要,我可以创建匿名块,但不知道如何去做。我试过下面的查询,但它不工作。如何在oracle中一次删除指定表中的数据sql
Delete from RATOR_MONITORING_CONFIGURATION.'%TEMP_';
我有RATOR_MONITORING
架构中超过40个表,其表名从'TEMP_'
开始。我想在一次查询中一次删除所有这些表中的数据,而不是使用每个表的delete语句。我甚至不想生成语句。如果需要,我可以创建匿名块,但不知道如何去做。我试过下面的查询,但它不工作。如何在oracle中一次删除指定表中的数据sql
Delete from RATOR_MONITORING_CONFIGURATION.'%TEMP_';
如果你想删除所有的行,然后更好地使用TRUNCATE,它会重置高水位。但请记住,truncate是一个DDL声明,因此将有一个隐式提交;使用DELETE您可以在验证后手动提交。
虽然,我不会在生产环境中这样做。如果这是您在测试环境中构建测试数据的事情,那么您可以(ab)使用EXECUTE IMMEDIATE。
例如,执行下面的匿名块为RATOR_MONITORING
用户:
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;
/
顺便说一句,用好文本编辑器,它不会花费超过一分钟打造删除/ TRUNCATE语句并在纯SQL中执行此操作。
您应该生成DML并在pl \ sql块中使用动态sql,只是潜伏'EXECUTE IMMEDIATE'语句 –
正如我所说我不想生成sql语句,因为我想在不同模式中尝试这种逻辑,必须生成sql语句并在pl \ sql块中使用动态sql。但是,你能举一个你说什么的例子吗? – Andrew
你必须生成DML,没有它没有办法做这样的任务。看看这里http://stackoverflow.com/questions/832160/sql-delete-all-the-data-from-all-available-tables有接近你的任务的例子。看看'EXECUTE IMMEDIATE'的例子。 –