ошибка при усечении таблиц из oracle db - PullRequest
1 голос
/ 18 марта 2009

Я делаю что-то подобное в процедуре, чтобы очистить все данные из всех таблиц в моей базе данных.

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. Даже при указании закрытия хранилища, например,

    ВЫПОЛНИТЬ НЕМЕДЛЕННЫЙ «СТОЛ TRUNCATE» || t.table_name || 'DROP STORAGE';

    не помогает. Ошибка та же.

  3. Я подумал, что это может быть связано с внешними ограничениями на некоторые таблицы. Следовательно, «отключить ограничение» ранее в скрипте

Ответы [ 3 ]

1 голос
/ 18 марта 2009

Я бы посоветовал вам построить команду, которую вы выполняете, в строковой переменной, вывести ее с помощью 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.
0 голосов
/ 21 апреля 2015

усеченная таблица Table_NAME drop storage;

0 голосов
/ 19 марта 2009

Измените вашу программу:

  1. поместите вашу команду усечения в переменную 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;

Это должно показать вам утверждение, вызвавшее проблему.

...