如何将从 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),','))