Для этого вам понадобится динами c SQL. Вот как: я использую пример схемы Скотта, пытаясь Мими c, что у вас есть.
SQL> CREATE TABLE employees
2 AS
3 SELECT deptno emp_id,
4 ename column1,
5 job column2,
6 TO_CHAR (hiredate, 'dd.mm.yyyy') column3
7 FROM emp;
Table created.
Ваши типы:
SQL> CREATE OR REPLACE TYPE emp_obj_type AS OBJECT
2 (
3 column1 VARCHAR2 (20),
4 column2 VARCHAR2 (20),
5 column3 VARCHAR2 (20)
6 );
7 /
Type created.
SQL> CREATE OR REPLACE TYPE emp_tbl_type IS TABLE OF emp_obj_type;
2 /
Type created.
Функция: рекомендуется сначала отобразить оператор, который вы собираетесь выполнить, чтобы визуально убедиться в его правильности (строка № 14); удалите его, когда он больше не нужен.
SQL> CREATE OR REPLACE FUNCTION employee_function (par_table_name VARCHAR2)
2 RETURN emp_tbl_type
3 IS
4 emp_details emp_tbl_type := emp_tbl_type ();
5 l_str VARCHAR2 (1000);
6 BEGIN
7 l_str :=
8 'SELECT EMP_OBJ_TYPE (column1, column2, column3) '
9 || ' FROM (SELECT column1, column2, column3 '
10 || ' FROM employees a JOIN '
11 || par_table_name
12 || ' b ON a.emp_id = b.deptno)';
13
14 -- DBMS_OUTPUT.put_line (l_str);
15
16 EXECUTE IMMEDIATE l_str BULK COLLECT INTO emp_details;
17
18 RETURN emp_details;
19 END;
20 /
Function created.
Тестирование:
SQL> SELECT employee_function ('dept') FROM DUAL;
EMPLOYEE_FUNCTION('DEPT')(COLUMN1, COLUMN2, COLUMN3)
--------------------------------------------------------------------------------
EMP_TBL_TYPE(EMP_OBJ_TYPE('SMITH', 'CLERK', '17.12.1980'), EMP_OBJ_TYPE('ALLEN',
'SALESMAN', '20.02.1981'), EMP_OBJ_TYPE('WARD', 'SALESMAN', '22.02.1981'), EMP_
OBJ_TYPE('JONES', 'MANAGER', '02.04.1981'), EMP_OBJ_TYPE('MARTIN', 'SALESMAN', '
28.09.1981'), EMP_OBJ_TYPE('BLAKE', 'MANAGER', '01.05.1981'), EMP_OBJ_TYPE('CLAR
K', 'MANAGER', '09.06.1981'), EMP_OBJ_TYPE('SCOTT', 'ANALYST', '09.12.1982'), EM
P_OBJ_TYPE('KING', 'PRESIDENT', '17.11.1981'), EMP_OBJ_TYPE('TURNER', 'SALESMAN'
, '08.09.1981'), EMP_OBJ_TYPE('ADAMS', 'CLERK', '12.01.1983'), EMP_OBJ_TYPE('JAM
ES', 'CLERK', '03.12.1981'), EMP_OBJ_TYPE('FORD', 'ANALYST', '03.12.1981'), EMP_
OBJ_TYPE('MILLER', 'CLERK', '23.01.1982'))
SQL>