Oracle Apex 5.1:页面项目的拆分值

Oracle Apex 5.1: Split values of page item

我尝试在 Oracle Apex 5.1 中拆分页面项的值。 我首先做的是为自动完成连接这样的值。用户需要知道员工所在的部门。结果保存在页面项PX_Employee中。

select name || ',' || department from table;

结果:John Cooper,Department1

为了获得 John Cooper 的电子邮件,我需要将这些值相互拆分。要获取电子邮件,我使用此代码(无需 concat 即可正常工作)

DECLARE
  mail VARCHAR(40);
BEGIN 
  select email 
    into mail 
    FROM table 
    WHERE NAME = :PX_Employee;

  :PX_MAIL := mail;

EXCEPTION
  WHEN NO_DATA_FOUND THEN
    mail := NULL;
END; 

您可以使用 Apex Util 函数 STRING_TO_TABLE 再次拆分字符串并以这种方式提取名称。

DECLARE
    l_vc_arr2    APEX_APPLICATION_GLOBAL.VC_ARR2;
    mail VARCHAR(40);
BEGIN
    l_vc_arr2 := APEX_UTIL.STRING_TO_TABLE('John Cooper, Department1', ',');
    BEGIN select email into mail FROM table WHERE NAME = l_vc_arr2(1);
END;

一个简单的 SUBSTRINSTR 就可以完成这项工作。一些注意事项:

  • 你不需要局部变量;将结果直接放入PX_MAIL项
  • 为了不处理可能的 NO_DATA_FOUND,请使用聚合函数(例如 MAX,我做的那个):
    • 如果有同名员工,SELECT 将 return 其电子邮件地址
    • 如果有两名(或更多)员工同名,它将 return 最后一名员工的电子邮件地址(按字母顺序排序)。这是一种可能的情况;你宁愿不依赖名称作为标识符 - 切换到某种唯一 ID
    • 如果没有与这样的员工的行,它不会 return NO_DATA_FOUND 而是 NULL(因此您不必单独处理)

begin
  select max(t.mail)
    into :PX_MAIL
    from your_table t
    where t.name = substr(:PX_EMPLOYEE, 1, instr(:PX_EMPLOYEE, ',') - 1);
end;

例如:

SQL> with test (px_employee) as
  2    (select 'John Cooper, Department 1' from dual)
  3  select substr(PX_EMPLOYEE, 1, instr(PX_EMPLOYEE, ',') - 1)
  4  from test;

SUBSTR(PX_E
-----------
John Cooper

SQL>