mercredi 20 juin 2012

Oracle Execute Immediate : Nom de table invalide (ORA-00903: Invalid table name)

Si vous avez cette erreur c'est que comme moi vous avez tenté de faire quelque chose comme :

Begin
  Execute Immediate 'Truncate Table :1' using 'MaTable';
End;

En y réfléchissant bien, il est normal qu'Oracle refuse de faire cela. En effet, la commande Execute Immediate travaille avec des bind variables (préfixées par un ':'). La valeur d'une bind variable est assignée après que le parseur ait analysé votre requête. Oracle vous indique donc que la table ":1" n'existe pas.

Pour info, si vous travaillez avec sqlplus et que vous pouvez scripter le code que vous souhaitiez exécuter, il est possible d'avoir le comportement que vous souhaitiez en utilisant une variable de script, c'est à dire &1 :

Begin
   Execute Immediate 'Truncate Table &1';
End;
/

Si sqlplus n'est pas une solution, vous devez concaténer votre requête dynamique :

Begin
  Execute Immediate 'Truncate Table ' || 'MaTable';
End;

Aucun commentaire:

Enregistrer un commentaire