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. storage キーワードが必須なのはなぜですか? DROP STORAGEデフォルトだと思っていました。
  2. storage close を指定しても、

    EXECUTE IMMEDIATE 'TRUNCATE TABLE' || t.table_name || 'ドロップストレージ';

    役に立ちません。エラーは同じです。

  3. 一部のテーブルの外部制約と関係があるのではないかと思いました。したがって、スクリプトの前半で「制約を無効にする」
4

3 に答える 3

2

実行しているコマンドを文字列変数で作成し、dbms_outputを使用して出力してから、実行することをお勧めします。このようにして、エラーを生成している実行しようとしているものを正確に確認できます。

このエラーの原因の1つは、スペースを含むテーブル名がある場合です(はい、可能です)。その場合の解決策は、テーブル名を二重引用符で囲むことです。

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. 実行前に切り捨てコマンドをPL/SQL変数に入れます
  2. 例外が発生したときに、dbms_outputまたはutl_file(それぞれの後にフラッシュ)を介して切り捨てステートメントを出力する例外ハンドラーを追加します。
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 に答える