Вот как я понял вопрос;поскольку у меня нет ваших таблиц, я попытался имитировать то, что вы сказали с таблицами Скотта.
Сначала создайте несколько типов, которые будут использоваться функцией.
SQL> create or replace type t_dep_row as object
2 (deptno number,
3 dname varchar2(30),
4 loc varchar2(30));
5 /
Type created.
SQL> create or replace type t_dep_tab is table of t_dep_row;
2 /
Type created.
Сама функция: она принимает номер отдела и возвращает дополнительную информацию об отделе.Это что-то вроде глупо , поскольку в схеме Скотта он возвращает только одну глубину, но не обращайте на это внимания.
SQL> create or replace function f_dep(par_deptno in number)
2 return t_dep_tab
3 is
4 l_tab t_dep_tab := t_dep_tab();
5 begin
6 for cur_r in (select rownum rn, deptno, dname, loc
7 from dept
8 where deptno = par_deptno)
9 loop
10 l_tab.extend;
11 l_tab(cur_r.rn) := t_dep_row(cur_r.deptno, cur_r.dname, cur_r.loc);
12 end loop;
13 return l_tab;
14 end;
15 /
Function created.
SQL> -- Does it return anything?
SQL> select * from table(f_dep(20));
DEPTNO DNAME LOC
---------- --------------- ----------
20 RESEARCH DALLAS
Хорошо, давайте объединим таблицу EMP с функцией.
SQL> select e.deptno, t.dname, t.loc, e.ename, e.job
2 from emp e join table(f_dep(e.deptno)) t on t.deptno = e.deptno
3 where e.deptno <= 20
4 order by e.deptno, e.job;
DEPTNO DNAME LOC ENAME JOB
---------- --------------- ---------- ---------- ---------
10 ACCOUNTING NEW YORK MILLER CLERK
10 ACCOUNTING NEW YORK CLARK MANAGER
10 ACCOUNTING NEW YORK KING PRESIDENT
20 RESEARCH DALLAS FORD ANALYST
20 RESEARCH DALLAS SMITH CLERK
20 RESEARCH DALLAS JONES MANAGER
6 rows selected.
SQL>
У нас что-то есть.Итак, это было бы как сделать это.Попробуйте применить его к вашему делу и посмотреть, что произойдет.Удачи!