2015-10-06 71 views
1

我有RATOR_MONITORING架构中超过40个表,其表名从'TEMP_'开始。我想在一次查询中一次删除所有这些表中的数据,而不是使用每个表的delete语句。我甚至不想生成语句。如果需要,我可以创建匿名块,但不知道如何去做。我试过下面的查询,但它不工作。如何在oracle中一次删除指定表中的数据sql

Delete from RATOR_MONITORING_CONFIGURATION.'%TEMP_'; 
+1

您应该生成DML并在pl \ sql块中使用动态sql,只是潜伏'EXECUTE IMMEDIATE'语句 –

+1

正如我所说我不想生成sql语句,因为我想在不同模式中尝试这种逻辑,必须生成sql语句并在pl \ sql块中使用动态sql。但是,你能举一个你说什么的例子吗? – Andrew

+1

你必须生成DML,没有它没有办法做这样的任务。看看这里http://stackoverflow.com/questions/832160/sql-delete-all-the-data-from-all-available-tables有接近你的任务的例子。看看'EXECUTE IMMEDIATE'的例子。 –

回答

1

如果你想删除所有的行,然后更好地使用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中执行此操作。

+1

你好Lalit我不想从模式表中删除数据。我想从表名从'TEMP_'开始的Rator_Monitoring_Configuration架构中删除数据,是的,我在测试环境中首先尝试这个查询,如果它工作,那么我将在生产环境中使用。 – Andrew

+0

@Rahul没问题,只需在for循环中的查询中添加一个过滤器即可。我已经更新了代码。 –

+0

我不明白为什么我们必须在select查询中使用user_tables而不是提供模式名称? – Andrew

相关问题