Это пахнет как динамический SQL или, возможно, лучший выбор, процедура, которая возвращает refcursor. Вот пример:
SQL> SELECT * FROM t_function;
FUN_ID FUN_CMD
---------- ----------------------------------------
1 substr(ename, 2, 2)
2 ename ||' '|| job
SQL>
SQL> CREATE OR REPLACE PROCEDURE p_fun (
2 par_fun_id IN t_function.fun_id%TYPE,
3 p_out OUT SYS_REFCURSOR)
4 IS
5 l_cmd t_function.fun_cmd%TYPE;
6 l_str VARCHAR2 (200);
7 BEGIN
8 SELECT fun_cmd
9 INTO l_cmd
10 FROM t_function
11 WHERE fun_id = par_fun_id;
12
13 l_str := 'select ' || l_cmd || ' from emp';
14
15 OPEN p_out FOR l_str;
16 END;
17 /
Procedure created.
Тестирование:
SQL> var l_out refcursor
SQL> exec p_fun(1, :l_out);
PL/SQL procedure successfully completed.
SQL> print l_out
SU
--
MI
LL
AR
ON
AR
LA
LA
CO
IN
UR
DA
AM
OR
IL
14 rows selected.
И еще один:
SQL> exec p_fun(2, :l_out);
PL/SQL procedure successfully completed.
SQL> print l_out
ENAME||''||JOB
--------------------
SMITH CLERK
ALLEN SALESMAN
WARD SALESMAN
JONES MANAGER
MARTIN SALESMAN
BLAKE MANAGER
CLARK MANAGER
SCOTT ANALYST
KING PRESIDENT
TURNER SALESMAN
ADAMS CLERK
JAMES CLERK
FORD ANALYST
MILLER CLERK
14 rows selected.
SQL>