首页 > 解决方案 > 仅仅因为另一个进程失败,Oracle APEX ARP 进程没有执行?

问题描述

  1. 你是一个很棒的社区。这是我第一次找不到我的问题的答案,我有数百万

  2. 放轻松。我是超级菜鸟,我已经因为我的愚蠢问题让你浪费时间而感到很糟糕

  3. 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 正在工作。我错过了什么?

标签: oracleoracle-apex

解决方案


你没有错过任何东西。

当您按下触发这些进程的按钮时,它们就会进行交易。如果其中任何一个引发错误,则所有这些(到目前为止已执行)都将回滚。

如果您想继续处理,无论您自己的程序(第二个)做什么(我的意思是:它是否成功),然后以某种方式处理它。

一个微不足道的(而不是最好的)选择是忽略可能的错误,例如

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');}

推荐阅读