如何使用 Oracle Apex 中的穿梭页面项目删除多行?

How to delete multiple rows using shuttle page item in Oracle Apex?

我的要求是用户必须能够 select 从穿梭页面项中删除他们需要从 table 中删除的员工编号。在后端我有一个 plsql 代码应该删除 selected 员工号码如下:

BEGIN
    delete from employees where empno in (:P7_EMPLOYEE_NUMBER);
END;

此外,我将在代码中有更多逻辑来做其他事情,但是我无法删除多行,如果我 select 班车项目中的 1 个员工编号,我可以删除记录成功,当我尝试删除多条记录时,我不断收到以下错误:

Ajax call returned server error ORA-01722: invalid number for Execute Server-Side Code

我将代码更改为:

BEGIN
    delete from employees where empno in (to_number(:P7_EMPLOYEE_NUMBER));
END;

而且我不断收到相同的错误消息。

我怎样才能使这个工作?

一个穿梭项目包含 colon-separated 个值,这意味着您必须将它拆分成行,例如

delete from employees 
where empno in (select regexp_substr(:P7_EMPLOYEE_NUMBER, '[^:]+', 1, level)
                from dual
                connect by level <= regexp_count(:P7_EMPLOYEE_NUMBER, ':') + 1
               );

API APEX_STRING 有许多实用函数来处理 multi-value 页面项目(select 列表、复选框、快捷键)。要将冒号分隔的列表转换为数组,请使用 APEX_STRING.SPLIT.

DELETE 
  FROM     
       employees 
 WHERE empno IN 
      (SELECT column_value 
         FROM table(apex_string.split(: P7_EMPLOYEE_NUMBER,':'))
      ); 

APEX 引擎将始终将 multi-values 项作为单个 colon-delimited 字符串提交,例如:1:2:3:4

您需要将字符串拆分为多个值,以便处理它们。 有多种方法可以做到这一点:

  1. 在子查询中使用 APEX_STRING.SPLIT or the APEX_STRING.SPLIT_NUMBERS API
delete from employees 
 where empno in (select column_value
                   from apex_string.split_numbers(:P7_EMPLOYEE_NUMBER, ':'));
  1. 将 APEX_STRING API 与 MEMBER OF 函数一起使用
delete from employees 
 where empno member of apex_string.split_numbers(:P7_EMPLOYEE_NUMBER, ':');

注意 的成员需要有相同的类型。在这种情况下,empno 是一个数字,因此您必须使用 split_numbers API.

  1. 使用正则表达式拆分值
delete from employees 
 where empno in (select regexp_substr(:P7_EMPLOYEE_NUMBER, '[^:]+', 1, level)
                   from dual
                connect by level <= regexp_count(:P7_EMPLOYEE_NUMBER, ':') + 1
                );

我更喜欢使用选项 2,因为它的代码更少且更易于阅读。