oracle - 仅仅因为另一个进程失败,Oracle APEX ARP 进程没有执行?
问题描述
你是一个很棒的社区。这是我第一次找不到我的问题的答案,我有数百万
放轻松。我是超级菜鸟,我已经因为我的愚蠢问题让你浪费时间而感到很糟糕
Soo... 我正在尝试使用 oracle apex 制作应用程序。我有一个表格,其中包含 table1 的交互式报告。在表单页面上,我按此顺序有 3 个进程:
- 顶点自动为我制作的自动行处理 (DML),
- 我制作的 pl/sql 进程和
- 重置页面进程顶点。
ARP 更新、创建和删除,由任何按钮(SAVE、CREATE、DELETE)触发。
我的 procces 删除了另一个 table2 中的一行,并在单击 DELETE 并且 ITEM1 不为空时执行(因为在 ITEM1 中,我将行的 PK 存储在第二个表中)。
最后一个过程是通常的重置页面,当按下 DELETE 时应该清除所有项目的值。
默认情况下,火点是所有 3 的“处理”。
有时,由于 FK 约束,我的过程会失败(并返回我设置的错误)。
现在是这样想:如果我的过程失败,则 oder 2 似乎没有被执行。那可能吗?如果我将我的进程的条件(要执行)设置为 Never 其他 2 正在工作。我错过了什么?
解决方案
你没有错过任何东西。
当您按下触发这些进程的按钮时,它们就会进行交易。如果其中任何一个引发错误,则所有这些(到目前为止已执行)都将回滚。
如果您想继续处理,无论您自己的程序(第二个)做什么(我的意思是:它是否成功),然后以某种方式处理它。
一个微不足道的(而不是最好的)选择是忽略可能的错误,例如
begin
delete from child_table where id = :P1_ITEM1;
exception
when others then null; --> ignore any errors
end;
更聪明的方法是拦截您期望的错误。如果您知道(是的,您知道)有可能违反外键约束,请检查是否存在子行;如果没有,请删除主行。
declare
l_id child_table.id%type;
begin
-- If row(s) with such an ID exists, L_ID will be set to that value.
-- In that case, don't do anything
select m.id
into l_id
from child_table m
where m.id = :P1_ITEM1
and rownum = 1;
-- The above query returned something; don't do anything
null;
exception
when no_data_found then
-- The above query didn't return anything, so - delete a row
delete from child_table where id = :P1_ID;
end;
现在,可以/可以/应该修改,这取决于你真正拥有什么;这只是一个想法。
另一个选项是将外键约束设置为on delete cascade
,这意味着删除主记录会自动删除其详细记录。这样做,你不会关心这样的问题,你的第二个过程会很简单
delete from child_table where id = :P1_ID;
(当然,除非你遇到另一种错误)。
如果您想让用户决定是否要删除行,请将按钮的操作更改为“重定向到 URL”(我想目前是“提交”)。目标 URL 将是这样的(假设按钮的名称是P1_START_PROCESSES
):
javascript:if(confirm('Are you sure you want to delete all rows related to this document?')){doSubmit('P1_START_PROCESSES');}
推荐阅读
- c++ - 在 Direct3D 12 中的描述符范围内设置多个描述符
- r - 使用 rmarkdown + plotly 轴标题与轴刻度重叠
- spring-cloud-dataflow - Spring Cloud 数据流自定义应用属性
- vb.net - 对输入的数字进行测验
- laravel - 如何渴望加载多态关系的不同嵌套关系?
- google-cloud-platform - 如何在谷歌云上部署播放应用程序
- c# - 将字段添加到 ac# 嵌入式不和谐消息
- java - 如何用数组更新表中的行
- javascript - 为什么执行 Get 后会收到 12031 错误消息
- python - 有没有办法在 DataFrame 中找到子字符串?