Come ottenere un record utilizzando ESEGUIRE IMMEDIATO?
-
23-08-2019 - |
Domanda
Ho un sacco di funzioni con le firme come:
FUNCTION func1 (par1 IN VARCHAR2, par2 IN NUMBER) RETURN my_rec;
e ho una funzione per il recupero dati da questo gruppo di funzioni:
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;
ma questo codice non riesce con ORA-01007 'variabile non nell'elenco di selezione'.
Come posso riscrivere dichiarazione?
Soluzione
Tutto funziona bene per me (Oracle 10G), quella che ho correggere l'errore di sintassi nella tua definizione di funzione (gli indesiderati e virgola sulla prima riga):
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')
Altri suggerimenti
Credo che è possibile concatenare alla query come avete fatto con FUNC_NAME .
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow