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, ce WHERE (: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.
InformationsquelleAutor ethan | 2014-02-20