Вопрос

Когда я запускаю следующее в оболочке Oracle, оно работает нормально

truncate table table_name

Но когда я пытаюсь поместить это в хранимую процедуру

CREATE OR REPLACE PROCEDURE test IS
BEGIN
    truncate table table_name;
END test;
/

это терпит неудачу с

ERROR line 3, col 14, ending_line 3, ending_col 18, Found 'table', Expecting:  @   ROW  or   (   or   .   or   ;   :=

Почему?

Это было полезно?

Решение

Все операторы DDL в Oracle PL/SQL должны использовать команду Execute Immediate перед оператором.Следовательно, вам следует использовать:

execute immediate 'truncate table schema.tablename';

Другие советы

Помимо немедленного выполнения вы также можете использовать

DBMS_UTILITY.EXEC_DDL_STATEMENT('TRUNCATE TABLE tablename;');

Оператор не выполняется, поскольку хранимая процедура выполняет DDL, а некоторые экземпляры DDL могут сделать хранимую процедуру недействительной.При использовании подходов выполнения немедленного выполнения или exec_ddl DDL реализуется посредством неанализируемого кода.

При этом вам нужно обратить внимание на тот факт, что DDL выдает неявную фиксацию как до, так и после выполнения.

попробуйте приведенный ниже код

execute immediate 'truncate table tablename' ;

Вы должны знать, что невозможно напрямую запустить оператор DDL, как вы это делаете для DML, из блока PL/SQL, поскольку PL/SQL не поддерживает непосредственно позднее связывание, а поддерживает только связывание во время компиляции, что подходит для DML.следовательно, чтобы преодолеть этот тип проблемы, Oracle предоставил подход динамического SQL, который можно использовать для выполнения операторов DDL. Подход динамического sql заключается в анализе и связывании строки sql во время выполнения.Также вы должны помнить, что инструкции DDL по умолчанию автоматически фиксируются, поэтому вам следует быть осторожными с любыми инструкциями DDL, использующими подход динамического SQL, если у вас есть некоторый DML (который должен быть явно зафиксирован с использованием TCL) перед выполнением DDL в сохраненная процедура/функция.

Вы можете использовать любой из следующих подходов динамического sql для выполнения оператора DDL из блока pl/sql.

1) Выполнить немедленно

2) Пакет DBMS_SQL

3) DBMS_UTILITY.EXEC_DDL_STATEMENT (строка разбора В VARCHAR2);

Надеюсь, это ответит на ваш вопрос с объяснением.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top