如何使用 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
您需要将字符串拆分为多个值,以便处理它们。
有多种方法可以做到这一点:
- 在子查询中使用 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, ':'));
- 将 APEX_STRING API 与 MEMBER OF 函数一起使用
delete from employees
where empno member of apex_string.split_numbers(:P7_EMPLOYEE_NUMBER, ':');
注意 的成员需要有相同的类型。在这种情况下,empno 是一个数字,因此您必须使用 split_numbers API.
- 使用正则表达式拆分值
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,因为它的代码更少且更易于阅读。
我的要求是用户必须能够 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
您需要将字符串拆分为多个值,以便处理它们。 有多种方法可以做到这一点:
- 在子查询中使用 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, ':'));
- 将 APEX_STRING API 与 MEMBER OF 函数一起使用
delete from employees
where empno member of apex_string.split_numbers(:P7_EMPLOYEE_NUMBER, ':');
注意 的成员需要有相同的类型。在这种情况下,empno 是一个数字,因此您必须使用 split_numbers API.
- 使用正则表达式拆分值
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,因为它的代码更少且更易于阅读。