Вот один из вариантов.
Сначала создайте тип, который будет выглядеть как таблица, которую вы будете передавать функции. Поскольку я использую выборочные таблицы Скотта EMP
и DEPT
, моя функция вернет строку, состоящую из номера отдела, объединенного с названием отдела и инициалами местоположения.
SQL> create or replace type t_dept_r as object
2 (deptno number, dname varchar2(20), loc varchar2(20));
3 /
Type created.
SQL> create or replace function test_Func(par_dr in t_dept_r)
2 return varchar2
3 is
4 retval varchar2(20);
5 begin
6 retval := to_char(par_dr.deptno) ||
7 substr(par_dr.dname, 1, 1) ||
8 substr(par_dr.loc, 1, 1);
9 return retval;
10 end;
11 /
Function created.
Давайте проверим это:
SQL> select e.deptno, e.ename, d.dname, d.loc,
2 test_func(t_dept_r(d.deptno, d.dname, d.loc)) result
3 from emp e join dept d on e.deptno = d.deptno
4 where e.sal > 2000;
DEPTNO ENAME DNAME LOC RESULT
---------- ---------- -------------- ------------- ----------
20 JONES RESEARCH DALLAS 20RD
30 BLAKE SALES CHICAGO 30SC
10 CLARK ACCOUNTING NEW YORK 10AN
20 SCOTT RESEARCH DALLAS 20RD
10 KING ACCOUNTING NEW YORK 10AN
20 FORD RESEARCH DALLAS 20RD
6 rows selected.
SQL>
Как вы можете видеть, это требует небольшого набора текста (я полагаю, больше, чем вы ожидали), который включает в себя присвоение имен всем столбцам, которые вы проходите (то есть вы не можете передать что-то вроде test_func(d.*)
).
Посмотрите, поможет ли это.