创建一个动态值列表

问题描述

我有一个返回代码数组(NUMBER)的函数

select GET_USER_OFFICE_CODES(10) FROM DUAL;

返回

DB.OFFICE_CODES(3,4,5,6,7,8,9)

最终我想创建一个在APEX 5.1应用程序中使用此功能lov

例如,

select office_code,id 
from offices where ID IN (select GET_USER_OFFICE_CODES(10) FROM DUAL);

很显然,我在处理数据类型时遇到了麻烦。

有人可以帮我在sql中按摩结果,以便我可以在sql中执行以下操作吗?

select * 
from offices 
where ID IN (select GET_USER_OFFICE_CODES(10) FROM DUAL);

解决方法

如果您描述该功能的确切作用,那将有所帮助。我现在只是猜测。

功能:

SQL> create or replace function f_test(par_in in number)
  2    return sys.odcinumberlist
  3  is
  4    l_arr sys.odcinumberlist := sys.odcinumberlist();
  5  begin
  6    l_arr.extend;
  7    l_arr(l_arr.last) := 10;
  8    l_arr.extend;
  9    l_arr(l_arr.last) := 20;
 10    return l_arr;
 11  end;
 12  /

Function created.

返回什么?

SQL> select f_test(10) from dual;

F_TEST(10)
--------------------------------------------------------------------------------
ODCINUMBERLIST(10,20)

如何在Apex中使用它?

SQL> select deptno d,2         dname r
  3  from dept d
  4  where d.deptno in (select * from table(f_test(10)));

         D R
---------- --------------
        10 ACCOUNTING
        20 RESEARCH

SQL>
,

假设DB.OFFICE_CODES是SQL范围内定义的集合,则可以使用MEMBER OF运算符:

select * 
from offices 
where ID MEMBER OF GET_USER_OFFICE_CODES(10);

哪个输出:

ID | LOCATION  
-: | :---------
 3 | Location 3
 4 | Location 4
 5 | Location 5
 6 | Location 6
 7 | Location 7
 8 | Location 8
 9 | Location 9

假设您的架构称为DB,这是您的设置示例:

CREATE TYPE DB.OFFICE_CODES IS TABLE OF NUMBER;

CREATE FUNCTION GET_USER_OFFICE_CODES(
  value IN INT
) RETURN DB.OFFICE_CODES
IS
BEGIN
  -- Do something to get your values.
  RETURN DB.OFFICE_CODES(3,4,5,6,7,8,9);
END;
/

然后,如果您有offices表:

CREATE TABLE offices ( id,location ) AS
SELECT LEVEL,'Location ' || LEVEL FROM DUAL CONNECT BY LEVEL <= 10;

db 提琴here