Как дать результат конвейерной функции в качестве параметра по умолчанию? - PullRequest
1 голос
/ 18 февраля 2020

Я создал эти 4 типа:

record type myrecord1 is (...)
record type myrecord2 is (...)

table tableofmyrecord1 is table of myrecord1;
table tableofmyrecord2 is table of myrecord2;

и 2 функции:

function  a(k in tableofmyrecord2) return packageName.tableofmyrecord1 PIPELINED;
function  b return packageName.tableofmyrecord2  PIPELINED;

Я могу эффективно задать параметр по умолчанию; null, таблица пустая, таблица, которую я создал, но я могу дать непосредственно результат конвейерной функции.

function  a return packageName.tOfmyrecord(k in tableofmyrecord2 :=package.b)   PIPELINED

Это не работает.

Это решение тоже не работает.

declare
    defaultArgOFA :=package.b;
    function  a return packageName.tOfmyrecord(k in tableofmyrecord2 :=defaultArgOFA)  PIPELINED

та же ошибка

PLS-00653: агрегатные / табличные функции недопустимы

1 Ответ

0 голосов
/ 18 февраля 2020

Эта ошибка говорит о том, что вы не можете вызывать конвейерные функции с использованием PL SQL, поэтому вы не можете напрямую писать v:=a(). Но вы можете использовать SQL. Ниже приведен пример, когда конвейеризованный b получает входные данные из конвейерного a и умножает зарплаты.

Пакет:

create or replace package pkg is
  type tr is record (id int, name varchar2(10), sal int);
  type tt is table of tr;
  function a return tt pipelined;
  function b(par in tt) return tt pipelined;
end pkg;

Тело:

create or replace package body pkg is

function a return tt pipelined is
  v_tr tr;
begin
  v_tr.id := 1;  v_tr.name := 'Mark';  v_tr.sal := 100;
  pipe row (v_tr);

  v_tr.id := 2;  v_tr.name := 'Pete';  v_tr.sal := 120;
  pipe row (v_tr);
  return;
end;

function b(par in tt) return tt pipelined is
  v_tr tr;
begin
  for i in 1..par.last loop
    v_tr := par(i);
    v_tr.sal := v_tr.sal * 10;
    pipe row (v_tr);
  end loop;
  return;
end;

end pkg;

И это Тест работал для меня:

select * from table(pkg.b(pkg.a));

Результат:

    ID NAME              SAL
------ ---------- ----------
     1 Mark             1000
     2 Pete             1200
...