如何将从 oracle apex 20.1 多选项返回的字符串值转换为逗号分隔的数字数组
How to convert string value returned from oracle apex 20.1 multiselect item into comma separated numbers array
我有一个多 select 启用的 select 列表。我想在 pl/sql 查询中使用 IN () 运算符内的所有 selected id。所选值返回如下,
"1","5","4"
我想使用 em 作为数字,如下所示,
1,5,4
我的查询是这样的,
UPDATE EMPLOYEE SET EMPSTAT = 'Active' WHERE EMPID IN (:P500_EMPIDS);
您可以为此使用 API apex_string。如果您想使用 IN 运算符,则必须使用 EXECUTE IMMEDIATE,因为您不能在 IN 运算符中使用串联字符串。
相反,您可以执行以下操作:
DECLARE
l_array apex_t_varchar2;
BEGIN
l_array := apex_string.split(p_str => :P500_EMPIDS, p_sep => ':');
FOR i IN 1..l_array.count LOOP
UPDATE EMPLOYEE SET EMPSTAT = 'Active' WHERE EMPID = l_array(i);
END LOOP;
END;
解释:将冒号分隔的id列表转换为varchar2的table,然后遍历table.
的元素
请注意,我使用“:”作为分隔符,这是 apex 用于多选的分隔符。如果您需要“,”,请相应地更改上面的代码。
这是员工 table:
SQL> select * from employee;
EMPID EMPSTAT
---------- --------
1 Inactive
2 Inactive
4 Inactive
5 Inactive
SQL>
这是一种将逗号分隔值拆分为 行 的方法(而不是拆分为您在 IN
中使用的值列表!)。请注意:
- 第 3 行:
REPLACE
函数用空字符串替换双引号
- 第 3 行:然后在分层查询
的帮助下使用 REGEXP_SUBSTR
将其拆分成行
SQL> with test (col) as
2 (select '"1","5","4"' from dual)
3 select regexp_substr(replace(col, '"', ''), '[^,]+', 1, level) val
4 from test
5 connect by level <= regexp_count(col, ',') + 1;
VAL
--------------------
1
5
4
SQL>
通常多选项目的值以冒号分隔,例如1:5:4
。如果确实如此,正则表达式将如下所示:
regexp_substr(col, '[^:]+', 1, level) val
在 Apex 中将其用作:
update employee e set
e.empstat = 'Active'
where e.empid in
(select regexp_substr(replace(:P1_ITEM, '"', ''), '[^,]+', 1, level)
from dual
connect by level <= regexp_count(:P1_ITEM, ',') + 1
);
结果是:
3 rows updated.
SQL> select * from employee order by empid;
EMPID EMPSTAT
---------- --------
1 Active
2 Inactive
4 Active
5 Active
SQL>
试试吧。
感谢您帮助 everyone.Please 检查一下,如果有任何问题请告诉我。我找到了如下解决方案,
DECLARE
l_selected APEX_APPLICATION_GLOBAL.VC_ARR2;
BEGIN
l_selected := APEX_UTIL.STRING_TO_TABLE(:P500_EMPIDS);
FOR i in 1 .. l_selected.count LOOP
UPDATE EMPLYEE SET EMPSTATUS = 'ACTIVE' WHERE EMPID = to_number(l_selected(i));
END LOOP;
END;
请注意,您可以在更新语句中直接使用 apex_string
,因此 Koen Lostrie
的答案可以修改为不需要循环:
UPDATE EMPLOYEE
SET EMPSTAT = 'Active'
WHERE EMPID IN (
select to_number(trim('"' from column_value))
from table(apex_string.split(:P500_EMPIDS,','))
);
测试用例:
with cte1 as (
select '"1","2","3"' as x from dual
)
select to_number(trim('"' from column_value))
from table(apex_string.split((select x from cte1),','))
我有一个多 select 启用的 select 列表。我想在 pl/sql 查询中使用 IN () 运算符内的所有 selected id。所选值返回如下,
"1","5","4"
我想使用 em 作为数字,如下所示,
1,5,4
我的查询是这样的,
UPDATE EMPLOYEE SET EMPSTAT = 'Active' WHERE EMPID IN (:P500_EMPIDS);
您可以为此使用 API apex_string。如果您想使用 IN 运算符,则必须使用 EXECUTE IMMEDIATE,因为您不能在 IN 运算符中使用串联字符串。 相反,您可以执行以下操作:
DECLARE
l_array apex_t_varchar2;
BEGIN
l_array := apex_string.split(p_str => :P500_EMPIDS, p_sep => ':');
FOR i IN 1..l_array.count LOOP
UPDATE EMPLOYEE SET EMPSTAT = 'Active' WHERE EMPID = l_array(i);
END LOOP;
END;
解释:将冒号分隔的id列表转换为varchar2的table,然后遍历table.
的元素请注意,我使用“:”作为分隔符,这是 apex 用于多选的分隔符。如果您需要“,”,请相应地更改上面的代码。
这是员工 table:
SQL> select * from employee;
EMPID EMPSTAT
---------- --------
1 Inactive
2 Inactive
4 Inactive
5 Inactive
SQL>
这是一种将逗号分隔值拆分为 行 的方法(而不是拆分为您在 IN
中使用的值列表!)。请注意:
- 第 3 行:
REPLACE
函数用空字符串替换双引号 - 第 3 行:然后在分层查询 的帮助下使用
REGEXP_SUBSTR
将其拆分成行
SQL> with test (col) as
2 (select '"1","5","4"' from dual)
3 select regexp_substr(replace(col, '"', ''), '[^,]+', 1, level) val
4 from test
5 connect by level <= regexp_count(col, ',') + 1;
VAL
--------------------
1
5
4
SQL>
通常多选项目的值以冒号分隔,例如1:5:4
。如果确实如此,正则表达式将如下所示:
regexp_substr(col, '[^:]+', 1, level) val
在 Apex 中将其用作:
update employee e set
e.empstat = 'Active'
where e.empid in
(select regexp_substr(replace(:P1_ITEM, '"', ''), '[^,]+', 1, level)
from dual
connect by level <= regexp_count(:P1_ITEM, ',') + 1
);
结果是:
3 rows updated.
SQL> select * from employee order by empid;
EMPID EMPSTAT
---------- --------
1 Active
2 Inactive
4 Active
5 Active
SQL>
试试吧。
感谢您帮助 everyone.Please 检查一下,如果有任何问题请告诉我。我找到了如下解决方案,
DECLARE
l_selected APEX_APPLICATION_GLOBAL.VC_ARR2;
BEGIN
l_selected := APEX_UTIL.STRING_TO_TABLE(:P500_EMPIDS);
FOR i in 1 .. l_selected.count LOOP
UPDATE EMPLYEE SET EMPSTATUS = 'ACTIVE' WHERE EMPID = to_number(l_selected(i));
END LOOP;
END;
请注意,您可以在更新语句中直接使用 apex_string
,因此 Koen Lostrie
的答案可以修改为不需要循环:
UPDATE EMPLOYEE
SET EMPSTAT = 'Active'
WHERE EMPID IN (
select to_number(trim('"' from column_value))
from table(apex_string.split(:P500_EMPIDS,','))
);
测试用例:
with cte1 as (
select '"1","2","3"' as x from dual
)
select to_number(trim('"' from column_value))
from table(apex_string.split((select x from cte1),','))