PLSQL-返回代码集合

时间:2019-06-05 13:22:35

标签: plsql

我正在尝试编写一个函数以返回代码列表。

在包装规格书中我已经声明了

type codes_t is table of number;

function getCodes(
   acc_id in Account.id%type
)
return codes_t;

我体内有

function getCodes(
  acc_id in Account.id%type
)
return codes_t
is
  v_codes codes_t := codes_t();
begin
   for row in (select ...) loop
     v_codes.extend();
     v_codes(v_codes.count) := row.code;
   end loop;
return codes_t;

程序包编译器没有错误,但是当我尝试使用

调用函数时
select pkg.getCodes(123) from dual;

我收到 ORA-00902:无效的数据类型

有什么明显不对吗?

2 个答案:

答案 0 :(得分:0)

由于您试图用SQL调用该函数,并且该函数返回一个数组,因此您需要做两件事:

  1. 将类型创建为数据库类型(即create type ...),以便SQL引擎可以知道数据类型
  2. 将函数的输出广播到表中,然后从中选择,例如select * from table(<function>)

做这两件事应该可以帮到你。

答案 1 :(得分:0)

或者它可以被管道化。 Demo

CREATE OR REPLACE PACKAGE pkg
is

type codes_t is table of number;

function getCodes(
   acc_id in NUMBER
)
return codes_t PIPELINED;
end pkg;
/
CREATE OR REPLACE PACKAGE BODY pkg
is
  function getCodes(
    acc_id in NUMBER
  ) return codes_t PIPELINED
  is
    v_codes codes_t := codes_t();
  begin
     for r in (select acc_id as code from dual
                union 
                 select acc_id+1 from dual) loop
              PIPE row(r.code);
     end loop;
  end getCodes;
end pkg;
/