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;
一个简单的 SUBSTR
和 INSTR
就可以完成这项工作。一些注意事项:
- 你不需要局部变量;将结果直接放入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>
我尝试在 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;
一个简单的 SUBSTR
和 INSTR
就可以完成这项工作。一些注意事项:
- 你不需要局部变量;将结果直接放入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>