3

我在清除数据库中所有表中的所有数据的过程中正在执行类似的操作。

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.
  1. 为什么存储关键字是强制性的?我以为DROP STORAGE是默认的。
  2. 即使指定存储关闭,如,

    立即执行“截断表”|| t.table_name || '丢弃存储';

    没有帮助。错误是一样的。

  3. 我认为这可能与某些表上的外部约束有关。因此,脚本前面的“禁用约束”
4

3 回答 3

2

我建议您在字符串变量中构建您正在执行的命令,使用 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.
于 2009-03-18T12:17:19.340 回答
0

改变你的程序:

  1. 在执行之前将您的 truncate 命令放入 PL/SQL 变量中
  2. 添加一个异常处理程序,当您遇到异常时,该处理程序通过 dbms_output 或 utl_file 输出截断语句(在每个语句之后进行 fflush):
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;

这应该向您显示导致问题的语句。

于 2009-03-18T23:13:30.620 回答
-2

截断表 Table_NAME 删除存储;

于 2015-04-21T07:52:21.123 回答