oracle stored-procedures plsql ddl

oracle - Truncar una tabla en un procedimiento almacenado



stored-procedures plsql (4)

Además de ejecutar inmediatamente, también puedes usar

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

La instrucción falla porque el proceso almacenado está ejecutando DDL y algunas instancias de DDL podrían invalidar el proceso almacenado. Al utilizar los enfoques execute immediate o exec_ddl, el DDL se implementa a través de un código no analizado.

Al hacer esto, debes tener en cuenta el hecho de que DDL emite un compromiso implícito tanto antes como después de la ejecución.

Cuando ejecuto lo siguiente en un shell de Oracle funciona bien

truncate table table_name

Pero cuando trato de ponerlo en un procedimiento almacenado

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

falla con

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

¿Por qué?

Gracias, Klas Mellbourn


Debe saber que no es posible ejecutar directamente una instrucción DDL como lo hace para DML desde un bloque PL / SQL porque PL / SQL no admite el enlace tardío directamente, solo admite el enlace de tiempo de compilación, lo que está bien para DML. por lo tanto, para superar este tipo de problema, Oracle ha proporcionado un enfoque de SQL dinámico que se puede utilizar para ejecutar las sentencias de DDL. El enfoque de sql dinámico trata sobre el análisis sintáctico y el enlace de la cadena sql en el tiempo de ejecución. También debe recordar que las sentencias DDL son por defecto autocomprometidas, por lo tanto, debe tener cuidado con cualquiera de las sentencias DDL utilizando el enfoque SQL dinámico en caso de que tenga algún DML (que se debe comprometer explícitamente usando TCL) antes de ejecutar el DDL en el proc / función almacenada.

Puede usar cualquiera de los siguientes enfoques dinámicos de sql para ejecutar una instrucción DDL desde un bloque pl / sql.

1) Ejecutar inmediatamente

2) paquete DBMS_SQL

3) DBMS_UTILITY.EXEC_DDL_STATEMENT (parse_string EN VARCHAR2);

Espero que esto responda tu pregunta con una explicación.


Todas las sentencias DDL en Oracle PL / SQL deberían usar Execute Inmediate antes de la instrucción. Por lo tanto, debes usar:

execute immediate ''truncate table schema.tablename'';


prueba el siguiente código

execute immediate ''truncate table tablename'' ;