【问题标题】:How to give the result of a pipelined function as a default parameter?如何将流水线函数的结果作为默认参数?
【发布时间】:2020-02-18 05:15:03
【问题描述】:

我已经创建了这 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,表为空,我创建的表,但我可以直接给出 pipelined 函数的结果。

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:不允许使用聚合/表函数

【问题讨论】:

  • 您想通过使用流水线函数来实现什么并不完全可以理解?

标签: oracle plsql


【解决方案1】:

这个错误表示不能使用PLSQL调用流水线函数,所以不能直接写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

【讨论】:

    猜你喜欢
    • 2015-03-31
    • 2011-11-18
    • 1970-01-01
    • 2021-10-02
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 2017-08-03
    相关资源
    最近更新 更多