2009-05-21 5 views
2

J'ai un tas de fonctions avec des signatures comme:Comment obtenir un enregistrement en utilisant EXECUTE IMMEDIATE?

FUNCTION func1 (par1 IN VARCHAR2, par2 IN NUMBER) RETURN my_rec; 

et j'ai une fonction pour récupérer les données de ce groupe de fonctions:

FUNCTION get_result (func_name IN VARCHAR2, par1 IN VARCHAR2, par2 IN NUMBER) RETURN my_rec; 
IS 
    rec1 my_rec; 
BEGIN 
    EXECUTE IMMEDIATE 'SELECT ' || func_name || '(:par1, :par2) FROM DUAL' 
    INTO rec1 
    USING IN par1, IN par2; 

    RETURN rec1; 
END; 

mais ce code échoue avec ORA-01007 « variable pas dans la liste de sélection '.
Comment puis-je réécrire une instruction?

Répondre

2

Tout fonctionne bien pour moi (Oracle 10G), que je corrige l'erreur de syntaxe dans la définition de la fonction (semi-colon indésirables sur la première ligne):

SQL> create type my_rec is object (id integer, name varchar2(30)) 
    2/

Type created. 

SQL> create FUNCTION func1 (par1 IN VARCHAR2, par2 IN NUMBER) RETURN my_rec 
    2 is 
    3 l_rec my_rec := my_rec (1, 'x'); 
    4 begin 
    5  return l_rec; 
    6 end; 
    7/


Function created. 

SQL> CREATE OR REPLACE 
    2 FUNCTION get_result (func_name IN VARCHAR2, par1 IN VARCHAR2, par2 IN NUMBER) RETURN my_rec 
    3 IS 
    4  rec1 my_rec; 
    5 BEGIN 
    6  EXECUTE IMMEDIATE 'SELECT ' || func_name || '(:par1, :par2) FROM DUAL' 
    7  INTO rec1 
    8  USING IN par1, IN par2; 
    9  RETURN rec1; 
10 END; 
11/

Function created. 

SQL> select get_result ('func1',1,2) from dual; 

GET_RESULT('FUNC1',1,2)(ID, NAME) 
------------------------------------------------- 
MY_REC(1, 'x') 
+1

cela fonctionne quand je définis my_rec en tant que type d'objet, mais ne fonctionne pas lorsque my_rec est défini comme type d'enregistrement dans le package. Avez-vous une idée pourquoi? – engro

+0

@ negr-o, un type d'enregistrement dans un paquet n'est connu que dans PL/SQL, vous ne pouvez pas l'utiliser dans SQL. – tuinstoel

+0

2 tuinstoel: merci! – engro

0

Je pense que vous pouvez concaténer à la requête comme vous l'avez fait avec nom_fonction.

+0

qu'avez-vous dire: concaténer les valeurs de variables avec chaîne dynamic-sql au lieu d'utiliser la clause 'USING'? – engro

+0

Oui. J'avoue que c'est un trou de sécurité juste dans le cas où par1 et par2 ne sont pas des chaînes "sûres". – ATorras

Questions connexes