Question

Lorsque j'exécute ce qui suit dans un shell Oracle, cela fonctionne correctement

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;
/

il échoue avec

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

Pourquoi?

Était-ce utile?

La solution

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';

Autres conseils

En plus de l'exécution immédiate, vous pouvez également utiliser

DBMS_UTILITY.EXEC_DDL_STATEMENT ('TRUNCATE TABLE nom de la table;');

L'instruction échoue car le proc stocké exécute le DDL et certaines instances du 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 surveiller le fait que DDL génère une validation implicite à la fois avant et après l'exécution.

essayez le code ci-dessous

execute immediate 'truncate table tablename' ;

Vous devez savoir qu'il n'est pas possible d'exécuter directement une instruction DDL comme vous le faites pour DML à partir d'un bloc PL / SQL, car PL / SQL ne prend pas directement en charge la liaison tardive. Il ne prend en charge que la liaison de compilation, ce qui convient très bien pour DML. Par conséquent, pour surmonter ce type de problème, oracle a fourni une approche SQL dynamique qui peut être utilisée pour exécuter les instructions DDL. L'approche SQL dynamique concerne l'analyse et la liaison d'une chaîne SQL à l'exécution. Vous devez également vous rappeler que les instructions DDL sont par défaut des validations automatiques. Par conséquent, vous devez faire attention à toute instruction DDL utilisant l'approche SQL dynamique en cas d'utilisation d'un fichier DML (à valider explicitement à l'aide de TCL) avant d'exécuter le DDL dans le dossier. proc / function stocké.

Vous pouvez utiliser l’une des approches SQL dynamiques suivantes pour exécuter une instruction DDL à partir d’un bloc pl / sql.

1) Exécuter immédiatement

2) Package DBMS_SQL

3) DBMS_UTILITY.EXEC_DDL_STATEMENT (chaîne_dans IN VARCHAR2);

J'espère que cela répond à votre question avec des explications.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top