创建一个动态值列表

Create a Dynamic List of Values

我有一个函数 returns 代码数组 (NUMBER)。

select GET_USER_OFFICE_CODES(10) FROM DUAL;

returns

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.

它是什么return?

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 table:

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

db<>fiddle here