我希望为ERP系统编写一个函数,该函数返回可以在“ select ... IN”语句中使用的列表。例如...
而不是...
“从A中选择*,其中b在('c','d','e')中”
我需要类似...
“从A中选择*,其中(get_items('a'))中b在其中
我尝试了一个可以创建'c','d','e'位的函数,但这并没有给我任何结果。
我尝试了几种方法,但似乎无法找到正确的想法。我可以编写API /函数,但是从函数中获取项目列表并放入该select语句的最佳方法是什么?数组或sys refcursor可以工作吗?
答案 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>