0

我有一个启用多选的选择列表。我想在 pl/sql 查询中使用 IN () 运算符中的所有选定 ID。选择的值返回如下,

"1","5","4"

我想用 em 作为数字,如下所示,

1,5,4

我的查询就像,

UPDATE EMPLOYEE SET EMPSTAT = 'Active' WHERE EMPID IN (:P500_EMPIDS);
4

4 回答 4

0

您可以为此使用 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 用于多选的内容。如果您需要“,”,则相应地更改上面的代码。

于 2020-06-23T12:49:20.457 回答
0

这是员工表:

SQL> select * from employee;

     EMPID EMPSTAT
---------- --------
         1 Inactive
         2 Inactive
         4 Inactive
         5 Inactive

SQL>

这是一种将逗号分隔的值拆分为的方法(而不是您将在IN! 中使用的值列表)。注意:

  • 第 3 行: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>

试试看。

于 2020-06-23T17:16:26.843 回答
0

请注意,您可以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),','))
于 2020-06-29T09:08:06.263 回答
0

感谢大家的帮助。请检查一下并告诉我是否有任何问题。我找到了如下解决方案,

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;
于 2020-06-24T03:45:38.403 回答