【问题标题】:error while truncating tables from oracle db从 oracle db 截断表时出错
【发布时间】:2009-03-18 10:08:43
【问题描述】:

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

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. 我认为这可能与某些表上的外部约束有关。因此,脚本前面的“禁用约束”

【问题讨论】:

  • 您应该尝试更改 EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || t.table_name || '丢弃存储';立即执行“截断表”|| t.table_name || '丢弃存储';可能缺少一些空间:)

标签: oracle storage truncate


【解决方案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.

【讨论】:

  • 将尝试手动构建命令...表名都没有空格...如 Emp_Details
【解决方案2】:

改变你的程序:

  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;

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

【讨论】:

    【解决方案3】:

    截断表 Table_NAME 删除存储;

    【讨论】:

      猜你喜欢
      • 2011-06-16
      • 2021-11-30
      • 2012-06-10
      • 1970-01-01
      • 2020-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多