Tronquer une table dans une procédure stockée
-
05-07-2019 - |
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?
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.