我在一个过程中执行类似这样的操作,以清除数据库中所有表的所有数据。
LOOP
dbms_utility.exec_ddl_statement('alter table ' || c.owner || '.' || c.table_name || ' disable constraint ' || c.constraint_name);
END LOOP;
.
.
.
LOOP
EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || t.table_name ;
END LOOP;
现在,这会引发以下错误:
ORA-03291: Invalid truncate option - missing STORAGE keyword
ORA-06512: at "MYSCHEMA.CLEAR_DATA", line 15
ORA-06512: at line 2
Process exited.
Disconnecting from the database MYDB.
DROP STORAGE
是默认值。甚至指定存储关闭,如,
EXECUTE IMMEDIATE'TRUNCATE TABLE'|| t.table_name || 'DROP STORAGE';
无济于事。错误是一样的。
答案 0 :(得分:1)
我建议您在字符串变量中构建正在执行的命令,使用dbms_output输出它,然后执行它。通过这种方式,您将看到正在尝试执行的生成错误的内容。
可能导致此错误的一件事是,如果您有一个带有空格的表名(是的,它是可能的)。如果是这种情况,解决方案是将表名用双引号括起来。
dev> create table "dave exp" (x number);
Table created.
dev> truncate table dave exp;
truncate table dave exp
*
ERROR at line 1:
ORA-03291: Invalid truncate option - missing STORAGE keyword
dev> truncate table "dave exp";
Table truncated.
答案 1 :(得分:0)
更改您的计划:
LOOP BEGIN ... v_sql := 'TRUNCATE TABLE ' || t.table_name ; EXECUTE IMMEDIATE v_sql; EXCEPTION WHEN OTHERS THEN dbms_output.put_line(SQLERRM); dbms_output.put_line(v_sql); END; END LOOP;
这应该会显示导致问题的陈述。
答案 2 :(得分:0)
截断表Table_NAME drop storage;