从oracle db截断表时出错

时间:2009-03-18 10:08:44

标签: oracle storage truncate

我在一个过程中执行类似这样的操作,以清除数据库中所有表的所有数据。

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. 甚至指定存储关闭,如,

    EXECUTE IMMEDIATE'TRUNCATE TABLE'|| t.table_name || 'DROP STORAGE';

    无济于事。错误是一样的。

  3. 我认为它可能与某些表上的外部约束有关。因此,脚本中早期的“禁用约束”

3 个答案:

答案 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)

更改您的计划:

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