Comment obtenir un enregistrement à l'aide EXECUTE IMMEDIATE?
-
23-08-2019 - |
Question
J'ai un tas de fonctions avec des signatures comme:
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 la déclaration?
La solution
Tout fonctionne bien pour moi (Oracle 10G), un je corriger l'erreur de syntaxe dans la définition de votre 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')
Autres conseils
Je pense que vous pouvez concaténer à la requête comme vous avez fait avec func_name .
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow