如何从函数中为“ select ... IN ..”语句返回列表

时间:2019-06-12 11:26:03

标签: oracle plsql

我希望为ERP系统编写一个函数,该函数返回可以在“ select ... IN”语句中使用的列表。例如...

而不是...

“从A中选择*,其中b在('c','d','e')中”

我需要类似...

“从A中选择*,其中(get_items('a'))中b在其中

我尝试了一个可以创建'c','d','e'位的函数,但这并没有给我任何结果。

我尝试了几种方法,但似乎无法找到正确的想法。我可以编写API /函数,但是从函数中获取项目列表并放入该select语句的最佳方法是什么?数组或sys refcursor可以工作吗?

1 个答案:

答案 0 :(得分:1)

一个选项是创建一个返回 table 的函数。这是一个基于Scott的示例架构的示例。该函数接受部门编号并返回该部门中的empno列表。

SQL> create or replace function get_emps (par_deptno in number)
  2     return sys.odcinumberlist
  3  is
  4     l_list  sys.odcinumberlist := sys.odcinumberlist ();
  5  begin
  6     select empno
  7       bulk collect into l_list
  8       from emp
  9      where deptno = par_deptno;
 10
 11     return l_list;
 12  end;
 13  /

Function created.

看起来像您的代码(带有IN):

SQL> select e.empno, e.ename, e.job, e.sal
  2  from emp e
  3  where e.empno in (select * from table(get_emps(10)));

     EMPNO ENAME      JOB              SAL
---------- ---------- --------- ----------
      7782 CLARK      MANAGER         2450
      7839 KING       PRESIDENT      10000
      7934 MILLER     CLERK           1300

使用JOIN的代码(结果将相同):

SQL> select e.empno, e.ename, e.job, e.sal
  2  from emp e join table(get_emps(10)) t on e.empno = t.column_value;

     EMPNO ENAME      JOB              SAL
---------- ---------- --------- ----------
      7782 CLARK      MANAGER         2450
      7839 KING       PRESIDENT      10000
      7934 MILLER     CLERK           1300

SQL>