Подтвердить что ты не робот

Усечение таблицы в хранимой процедуре

Когда я запускаю следующее в оболочке 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   ;   :=

Зачем?

4b9b3361

Ответ 1

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

execute immediate 'truncate table schema.tablename';

Ответ 2

Также, как немедленное выполнение, вы также можете использовать

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

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

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

Ответ 3

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

execute immediate 'truncate table tablename' ;

Ответ 4

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

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

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

2) DBMS_SQL пакет

3) DBMS_UTILITY.EXEC_DDL_STATEMENT (parse_string IN VARCHAR2);

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