Передача фактической строки в качестве параметра функции (ORACLE) - PullRequest
0 голосов
/ 07 апреля 2020

Мне нужно передать фактическую строку в качестве параметра функции в oracle. Например:

Мне нужно сделать что-то вроде этого:

Select 
   tA.paramA1, 
   tB.paramB1, 
   test_func(tA.*) as calc -- where tA.* is actual row processed.
from tA, tb 
where --joins--;

обратите внимание, что test_fun c (tA. *) - это все строки.

Мне нужно сделать это, потому что функция test_fun c () должна сделать несколько вычислений с несколькими значениями строк таблицы tA, и мне не нравится делать что-то вроде test_fun c (tA. param1, tA.param2, ...., tA.paramN)

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Вот один из вариантов.

Сначала создайте тип, который будет выглядеть как таблица, которую вы будете передавать функции. Поскольку я использую выборочные таблицы Скотта 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.*)).

Посмотрите, поможет ли это.

0 голосов
/ 07 апреля 2020

Вы должны использовать параметр типа записи plus, чтобы эта строка использовалась ниже

   Procedure(Table%ROWTYPE) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...