55 votes

Tronquer une table dans une procédure stockée

Quand j'exécute ce qui suit dans un shell Oracle, cela fonctionne bien

 truncate table table_name
 

Mais quand j'essaye de le mettre dans une procédure stockée

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

ça échoue avec

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

Pourquoi?

Merci, Klas Mellbourn

111voto

Dheer Points 1684

Toutes les instructions DDL dans Oracle PL / SQL doivent utiliser Execute Immediate avant l'instruction. Par conséquent, vous devriez utiliser:

 execute immediate 'truncate table schema.tablename';
 

18voto

stjohnroe Points 1844

En plus d’exécuter immédiatement, vous pouvez également utiliser

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

L'instruction échoue car le proc stocké est en train d'exécuter DDL et certaines instances de DDL pourraient invalider le proc stocké. En utilisant les approches execute immédiate ou exec_ddl, la DDL est implémentée via du code non analysé.

Ce faisant, vous devez vous assurer que DDL émet une validation implicite à la fois avant et après l'exécution.

12voto

serioys sam Points 1245

essayez le code ci-dessous

 execute immediate 'truncate table tablename' ;
 

10voto

Gourabp Points 463

Vous devriez savoir qu'il n'est pas possible d'exécuter directement une instruction DDL, comme vous le faites pour DML à partir d'un PL/SQL bloc parce que PL/SQL ne prend pas en charge la liaison tardive directement à elle seule le soutien de la compilation de liaison qui est très bien pour DML. donc, pour surmonter ce type de problème oracle a fourni une dynamique SQL approche qui peut être utilisée pour exécuter les instructions DDL.Le sql dynamique approche est fondée sur l'analyse et la liaison de la chaîne sql lors de l'exécution. En outre, vous devriez rememder que des instructions DDL sont, par défaut, validation automatique donc vous devez être prudent à propos de l'instruction DDL en utilisant le SQL dynamique de l'approche au cas ou si vous avez quelques DML (qui doit être engagé explicitement à l'aide de TCL) avant l'exécution de la DDL dans la procédure stockée ou une fonction.

Vous pouvez utiliser l'une des suivantes de sql dynamique approche pour exécuter une instruction DDL à partir d'un pl/sql bloc.

1) Exécuter immédiate

2) DBMS_SQL paquet

3) DBMS_UTILITY.EXEC_DDL_STATEMENT (parse_string IN VARCHAR2);

Espérons que cela répond à votre question avec des explications.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X