EXÉCUTION IMMÉDIATE avec plusieurs même se lier d'arguments
Quand j'ai créer la procédure suivante
create or replace procedure check_exec_imm(
tab IN VARCHAR2,
col IN VARCHAR2,
col_name IN VARCHAR2
)
IS
cv SYS_REFCURSOR;
col_value VARCHAR2(32767);
lv_query VARCHAR2(32767);
BEGIN
lv_query := 'SELECT ' ||col||
' FROM ' ||tab||
' WHERE (:1 = ''EUR'' OR :1 = ''USD'') and rownum <=1';
EXECUTE IMMEDIATE lv_query INTO col_value USING col_name ;
DBMS_OUTPUT.PUT_LINE('COLUMN VALUE : ' || col_value);
END;
Lorsque la procédure est exécutée, j'obtiens l'erreur suivante
ORA-01008: not all variables bound
ORA-06512: at "GRM_IV.CHECK_EXEC_IMM", line 18
ORA-06512: at line 2
Quand je donne le lier argument nom_col à nouveau comme ci-dessous, la procédure est en cours d'exécution fine.
EXECUTE IMMEDIATE lv_query INTO col_value USING col_name, col_name ;
Pourquoi oracle se comporte différemment dans la présente procédure. Depuis, c'est la même lier des variables, de liaison un argument devrait suffire à droite..!!? Veuillez expliquer d'où je suis ma logique de mal.
When I give the bind argument col_name again
Oui, vous devez fournir la même variable à deux reprises. En plus des identifiants, par exemple, ou des noms de colonnes de la table de noms, ne peut pas être lié uniquement des littéraux. Donc, ceWHERE (:1 = ''EUR'' OR :1 = ''USD'')
semble pas tout à fait correct - au lieu de l'identifiant d'un caractère littéral sera utilisé.- Nicolas j'ai écrit cette procédure pour vérifier avec plusieurs même se lier d'arguments. Parce que, dans une autre procédure alors que j'ai utilisé un autre même lier des variables à plusieurs reprises, le
EXECUTE IMMEDIATE
fonctionnait bien. est-il un moyen que cela peut être fait. Je n'arrivais pas à trouver la différence. - Votre logique est correcte mais c'est juste pas la façon dont il fonctionne dans Oracle.
Vous devez vous connecter pour publier un commentaire.
Il est "spécial" comportement d'Oracle: Répétées de l'espace Réservé des Noms dans les Instructions SQL Dynamiques
Dans un Bloc Anonyme ou de l'Instruction d'APPEL, il n'est pas nécessaire de répéter les valeurs de liaison si les noms sont égaux.
Par exemple cette Bloc Anonyme est de travail:
Mais ce
EXECUTE IMMEDIATE plsql_block USING a, b;
ne fonctionne pas à l'intérieur d'une Procédure.La façon dont vous avez fait référence le nom de la colonne par le biais de lier des variables n'est pas une méthode préférée comme Nichoas souligné. Ce que vous avez essayé s'appelle la dynamique natif SQL à l'aide de 'meilleur' lier les variables.
Dans cette méthode, vous devez lier chaque paramètre X fois depuis que vous l'utiliser X fois parce qu'ils sont tous traités comme des variables distinctes.
Lire plus sur la liaison à SQL dynamique.