Oracle 如何从函数返回一个列表;选择在……中“;陈述

Oracle 如何从函数返回一个列表;选择在……中“;陈述,oracle,plsql,Oracle,Plsql,我希望为ERP系统编写一个函数,该函数返回一个列表,可用于“select…in”语句。例如 而不是 “从A中选择*,其中b位于('c','d','e')” 我需要像 “从A中选择*其中b在(获取项目('A'))” 我尝试过一个函数,它可以创建“c”、“d”、“e”位,但没有给出任何结果 我试过几种方法,但似乎没有找到正确的主意。我可以编写API/函数,但从函数中获取项目列表并将其放入select语句的最佳方法是什么?数组或sys refcursor可以工作吗?一个选项是创建一个返回表的函数。下面

我希望为ERP系统编写一个函数,该函数返回一个列表,可用于“select…in”语句。例如

而不是

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

我需要像

“从A中选择*其中b在(获取项目('A'))”

我尝试过一个函数,它可以创建“c”、“d”、“e”位,但没有给出任何结果


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

一个选项是创建一个返回表的函数。下面是一个基于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.
看起来像您的代码(在中有):

使用连接的代码(结果相同):


如何派生谓词中要使用的项的函数?我这样问是因为函数可能是错误的解决方案-如果函数使用查询来派生项,视图可能会更好。
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
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>