我有一个启用多选的选择列表。我想在 pl/sql 查询中使用 IN () 运算符中的所有选定 ID。选择的值返回如下,
"1","5","4"
我想用 em 作为数字,如下所示,
1,5,4
我的查询就像,
UPDATE EMPLOYEE SET EMPSTAT = 'Active' WHERE EMPID IN (:P500_EMPIDS);
我有一个启用多选的选择列表。我想在 pl/sql 查询中使用 IN () 运算符中的所有选定 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 表,然后循环遍历该表的元素。
请注意,我使用“:”作为分隔符,这就是 apex 用于多选的内容。如果您需要“,”,则相应地更改上面的代码。
这是员工表:
SQL> select * from employee;
EMPID EMPSTAT
---------- --------
1 Inactive
2 Inactive
4 Inactive
5 Inactive
SQL>
这是一种将逗号分隔的值拆分为行的方法(而不是您将在IN
! 中使用的值列表)。注意:
REPLACE
函数用空字符串替换双引号REGEXP_SUBSTR
第 3 行:然后在分层查询的帮助下将其拆分为行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>
试试看。
请注意,您可以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),','))
感谢大家的帮助。请检查一下并告诉我是否有任何问题。我找到了如下解决方案,
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;