Oracle Apex - REST 数据源 - 嵌套 JSON 数组 - 触发两个表 - 删除函数错误 ORA-04091

2024-04-20

这个问题是另一个问题的后续所以问题 https://stackoverflow.com/questions/75219903/oracle-apex-rest-data-source-nested-json-array-trigger-two-tables-update.

我有一个带有 REST 数据源的应用程序,它接收来自 API 的 JSON 响应。有两张桌子ORDERS and ORDER_ITEMS. The ORDERS表包含一列ORDER_ITEMS这是一个JSON文档 type.

我在我的上创建了一个触发器ORDERS运行的表AFTER INSERT, UPDATE or DELETE on my ORDERS表,并维护ORDER_ITEMS表(从ORDERS table ORDER_ITEMS列并插入ORDER_ITEMS表和每列)。

create or replace trigger "TR_MAINTAIN_LINES"
AFTER
insert or update or delete on "ORDERS_LOCAL"
for each row
begin
    if inserting or updating then
        if updating then
          delete ORDER_ITEMS_LOCAL
          where order_id = :old.order_id;
        end if;
        insert into ORDER_ITEMS_LOCAL ( order_id, line_id, line_number, product_id, quantity, price) 
        ( select :new.order_id,
                 seq_line_id.nextval,
                 j.line_number,
                 j.product_id,
                 j.quantity,
                 j.price
            from json_table( 
                     :new.order_items,
                     '$[*]' columns (
                         line_id for ordinality,
                         line_number number path '$.line_number',
                         product_id  number path '$.product_id',
                         quantity number        path '$.quantity',
                         price    number        path '$.price' ) ) j );
    elsif deleting then
        delete ORDER_ITEMS_LOCAL
        where order_id = :old.order_id;
    end if;
end;

触发器适用于AFTER INSERT and UPDATE。然而,当我尝试DELETE一行从ORDERS表,我收到错误。error ORA-04091: table WKSP_DEMO.ORDER_ITEMS_LOCAL is mutating, trigger/function may not see it

但从其中删除一行ORDER_ITEMS表按预期工作。

  • ORDERS table 在此输入图像描述 https://i.stack.imgur.com/CsqRW.png

  • ORDERS表数据在此输入图像描述 https://i.stack.imgur.com/nuK7M.png

  • ORDER_ITEMS table 在此输入图像描述 https://i.stack.imgur.com/10XkG.png

  • ORDER_ITEMS表数据在此输入图像描述 https://i.stack.imgur.com/M4TrI.png

  • 触发器在此输入图像描述 https://i.stack.imgur.com/12kU8.png

  • BI_ORDER_ITEMS_LOCAL trigger

create or replace trigger "BI_ORDER_ITEMS_LOCAL"   
  before insert on "ORDER_ITEMS_LOCAL"               
  for each row  
begin   
  if :NEW."LINE_ID" is null then 
    select "ORDER_ITEMS_LOCAL_SEQ".nextval into :NEW."LINE_ID" from sys.dual; 
  end if; 
end; 
  • 错误信息在此输入图像描述 https://i.stack.imgur.com/SoLLC.png

- - 更新 - - -

所以我拿出了触发器的删除部分ORDER and ORDER_LINES表行按预期删除。

create or replace trigger "TR_MAINTAIN_LINES"
AFTER
insert or update on "ORDERS_LOCAL"
for each row
begin
    if inserting or updating then
        if updating then
          delete ORDER_ITEMS_LOCAL
          where order_id = :old.order_id;
        end if;
        insert into ORDER_ITEMS_LOCAL ( order_id, line_id, line_number, product_id, quantity, price) 
        ( select :new.order_id,
                 seq_line_id.nextval,
                 j.line_number,
                 j.product_id,
                 j.quantity,
                 j.price
            from json_table( 
                     :new.order_items,
                     '$[*]' columns (
                         line_id for ordinality,
                         line_number number path '$.line_number',
                         product_id  number path '$.product_id',
                         quantity number        path '$.quantity',
                         price    number        path '$.price' ) ) j );

    end if;
end;

ON DELETE CASCADE 子句和触发器逻辑之间存在冲突。在 DELETE 情况下,两者都尝试删除子行。你可以 ...

  • 从触发器中删除 DELETE 部分并让 ON DELETE CASCADE 子句完成这项工作
  • 从外键中删除 ON DELETE CASCADE 子句。

我想,我会推荐第二种选择,这样所有的逻辑都集中在一个地方,即你的触发器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle Apex - REST 数据源 - 嵌套 JSON 数组 - 触发两个表 - 删除函数错误 ORA-04091 的相关文章

  • 并行运行过程 - Oracle PL/SQL

    我正在尝试使用 dbms scheduler 并行运行存储过程 Oracle PL SQL 但出现类似未知作业的错误 我也尝试过 dbms job 这里出现错误 必须声明标识符 dbms jobs 有人可以帮我吗 以下是我尝试过的两种方法
  • 从 Oracle 函数返回引用游标

    我收到错误 PLS 00382 表达式类型错误 我想将参考光标作为输出 请让我知道我该怎么做 create or replace function test cur return sys refcursor as var ref sys r
  • 即使用户也可以访问需要限制的APEX页面

    我创建了一个 4 页的应用程序 Home 管理页面 计算体重指数 About 然后我进入 gt shared components gt Select Authorization schema gt Create 我已将其命名为only a
  • 从存储过程,返回 OUT 参数和 OUT 游标并解析结果 (Oracle)

    问题 是否可以使用 OUT 返回 两者 一个变量和一个光标 来自我下面的代码 我看到了 SqlDB 的类似问题 但经过长时间的搜索后没有找到 OracleDB 的解决方案 在 PLSQL 中 CREATE OR REPLACE PROCED
  • 具有两列的 LISTAGG 函数

    我有一张这样的桌子 报告 user id Department Position Record id 1 Science Professor 1001 1 Maths 1002 1 History Teacher 1003 2 Scienc
  • 有没有办法访问私有 plsql 过程以进行测试?

    我正在开发一个包含大量 plsql 代码的项目 并希望向我们的代码库添加更具体的单元测试 我喜欢测试的一些过程 函数不在包规范中 我无法更改它 有没有办法访问这些 私有 plsql 过程而不将它们添加到规范中 到目前为止 我唯一的想法是在测
  • 使用预定义的系统函数将分隔字符串(或列)转换为 Oracle 中的行

    几年前 在 Oracle 10 或 9 中 我使用了一个类似于 DBMS COL 2 VAL 的函数 这绝对不是正确的函数 此内置函数的目的是根据指定的分隔符将提供的字符串转换为行 我知道有多种方法可以将分隔字符串转换为行 但我正在寻找的是
  • 模块化代码有哪些好的实践?

    在 PL SQL 中 有一些奇特的新概念 比如表函数 对象 可能还有其他我还没有发现的概念 但话又说回来 还有简单的代码生成 动态 pl sql 您可以 立即执行 这些可以帮助代码重用 据我所知 表函数和对象可以帮助创建模块化代码 但仍然不
  • SQL 查询中的游标

    在 Oracle 中 可以返回cursor在 SQL 查询中 使用cursor关键字 像这样 select owner table name cursor select column name from all tab columns wh
  • 为分组依据字段创建索引?

    Oracle数据库中需要为group by字段创建索引吗 例如 select from some table where field one is not null and field two group by field three fi
  • 使用 Oracle PL/SQL 存储过程授予其他用户表的权限

    我遇到了执行以下操作的应用程序的问题 PL SQL 包 A 包含应用程序的所有函数 过程 A 由 USER A 拥有 A 在 Oracle 中创建用户帐户 并在这些用户下创建表 A 还必须能够 TRUNCATE INSERT 到用户的表 注
  • oracle pl/sql中的XML解析

    我正在尝试在 PL SQL 中解析此 XML
  • 如何在oracle DB中存储日文字符?

    我想将日语 或任何语言 字符存储在我的 Oracle 数据库表的一列中 我使用 varchar2 作为数据类型 当我尝试将此字符 插入到该列时 它存储为 不知道该怎么办 需要帮忙 Note 我尝试将数据类型更改为 nvarchar2 仍然不
  • 获取表的某些列只有空值

    我需要知道一张表的哪些列只有空值 我知道我应该在 user tab columns 中执行循环 但是如何仅检测具有空值的列呢 感谢并抱歉我的英语 要在事先不知道列标识的情况下执行查询 需要使用动态 SQL 假设您已经知道该表不为空 您可以执
  • PL/SQL 打印存储过程返回的引用游标

    如何从存储过程 OUT 变量 返回的引用游标中获取数据并将结果行打印到 SQL PLUS 中的 STDOUT ORACLE存储过程 PROCEDURE GetGrantListByPI p firstname IN VARCHAR2 p l
  • 如何将 SELECT...INTO 与 JOIN 一起使用?

    我有以下示例代码 DECLARE myRow table rowtype myVar table2 column type BEGIN SELECT table col1 table col3 table col4 table2 colum
  • 处理ORACLE异常

    我需要处理ORA 01400 错误 http www techonthenet com oracle errors ora01400 php 无法使用异常句柄将 NULL 插入 SCHEMA TABLE NAME COLUMN NAME O
  • 似乎找不到循环 PL/SQL 数组的方法?

    我正在尝试这样做 arrCauses APEX UTIL STRING TO TABLE P1 CAUSE FOR c IN 1 arrCauses count LOOP INSERT INTO DT EVENT CAUSE EVENT I
  • Oracle PL/SQL - NO_DATA_FOUND 异常是否对存储过程性能不利?

    我正在编写一个需要进行大量调节的存储过程 根据 C NET 编码中的常识 异常会损害性能 因此我也始终避免在 PL SQL 中使用它们 我在此存储过程中的调节主要围绕记录是否存在 我可以通过以下两种方式之一进行 SELECT COUNT I
  • Oracle:PL/SQL 中查看值是否存在的最快方法:列表、VARRAY 或临时表

    UPDATE如果您想查看很长的原始问题 请查看编辑 这是问题的更清晰的简短版本 我需要看看是否GroupA 不总是GroupA 这会改变每个循环迭代 存在于大约 200 个组的 列表 数组 临时表 等等 中 如何存储这 200 个组完全由我

随机推荐

  • Google Freebase API 如何获取图像的 URL?

    所以 我试图弄清楚如何获取 Freebase 数据库中图像的 URL 我想要一张旧金山的照片 这就是我获取旧金山主题的方式 https www googleapis com freebase v1sandbox topic 2Fen 2Fs
  • 编译具有多个参数的案例类会导致 java.lang.StackOverflowError

    我有以下带有大量参数 150 的案例类 在使用 sbt 版本 0 14 编译期间导致 java lang StackOverflowError 异常 类定义 case class TestClass Param1 String Param2
  • 通过 url 将整数传递给 php $_GET

    所以我正在做一些 CTF 挑战之一是关于 php 类型杂耍 代码看起来像这样 if GET var1 hash md4 GET var1 print flag 所以我 80 确定我需要传入一个整数 这样它就会是真的 但我能操作的只是 url
  • jQuery Uncaught TypeError 与 Theme Punch Revolution Slider

    我遇到了一个无法追踪的问题 我正在使用革命滑块 http themes themepunch com theme revolution jq我不断收到 jQuery 错误 Uncaught TypeError Cannot read pro
  • WordPress REST API - 允许任何人发帖

    我正在 WordPress 上构建一个应用程序 它需要一个简单的前端表单 任何人都可以提交需要保存在数据库中的信息 我正在尝试通过 REST API 来处理这个问题 由于应用程序的性质 提交此信息时不能进行任何页面重定向 我可以毫无问题地设
  • LinqDataSource:过滤并绑定到gridview

    问题没有按照我想要的方式解决 但我继续感谢 ukaszW pl 他的时间和努力 我正在使用 gridview 控件和 linqdatasource 它一切正常 我添加了 searchBySubject 的功能 并且添加了WhereParam
  • 如何将“旧的 spring mvc 控制器与 jsp”和“vaadin7 ui”集成在一起

    我正在尝试将 vaadin 与我的 spring mvc 应用程序集成 我有一些带有 jsp 文件的 url spring mvc 控制器使用它们 例如 mysite com spring mysite com spring example
  • Zend 引擎可以嵌入 PHP 之外吗?

    如果我记得的话 Zend 引擎的原始设计之一是它相对容易嵌入人们可能希望创建的其他语言 基本上 PHP 语法没有所有 PHP 模块 现在还是这样吗 嗯 Zend 引擎基本上是一个解释 PHP 字节码的虚拟机 基本上 您要做的就是为一种语言和
  • 为什么这个 css 动画无限自动播放轮播会在项目重置时跳转?

    我正在努力根据此处的示例创建无限自动播放轮播 https codepen io jackoliver pen qVbQqW https codepen io jackoliver pen qVbQqW 请注意 codepen 示例是多么流畅
  • java jar 的清单属性

    在您的帮助下 我完成了我的第一个 Java 项目 现在我想创建一个 jar 并从 jar 运行应用程序 Java 项目 它是一个普通的控制台应用程序 它有另一个项目 控制台应用程序 作为依赖项 我通过右键单击 导出 创建一个 jar 使用
  • 使用 C# 运行 T4 模板

    我有 T4 模板 mycode tt 它生成一个 cs 文件 我通常右键单击 tt 文件并选择 RunCustomTool 它会在内部获取 xml 文件并为我生成代码 现在我想使用 C Windows 应用程序运行自定义工具 因此 单击按钮
  • 如果您无法控制类,如何模拟类中的方法?

    我使用 Xunit 和 Moq 进行单元测试 到目前为止 我能够成功地模拟和测试接口中的方法 但是我应该如何模拟和测试我无法控制的类的方法 该类没有接口 方法也不是虚拟的 我研究了 Type Mock Isolator 但我无法使其工作 而
  • 订购 ActiveRecord 关系对象

    我有一个名为的 ActiveRecord 对象contact 它有一个关系叫做profiles 这些配置文件具有 url 属性 配置文件应按 url 按字母顺序排序 我试过了sort by也order但我收到此错误 contact prof
  • 使用 Ajax 将 JSON 发送到 WCF 3.5

    我在将 JSON 传递给 Weight 方法时遇到问题 我不断得到HTTP 1 1 415 Cannot process the message because the content type application x www form
  • 将照片上传到 Google Photos API 不返回上传令牌

    我正在使用 2018 版 Google Photos API 来上传图像和媒体 如下所述 上传字节 https developers google com photos library guides upload media uploadi
  • 嵌入式 Windows XP 中的网络接口设置

    给定设备描述 即出现在 设备属性 gt 连接使用 文本框中的字符串 我们如何获取网络接口名称 即出现在 网络连接 对话框中的名称 我们必须使用纯 C C 语言 或者通过一些标准命令行工具 例如 netsh ipconfig 或者两者的组合来
  • 数字中的下划线是什么意思? [复制]

    这个问题在这里已经有答案了 我想知道为什么以下变量被视为数字 a 1 000 000 print a 1000000 不应该print a return 1 000 000 使用 Python 3 6 以及PEP 515 https www
  • AspNetCore 抽象无法加载

    I use 适用于 Visual Studio 的 ASP NET Core Angular 2 模板 http blog stevensanderson com 2016 10 04 angular2 template for visua
  • 从 User.rb 模型访问 ApplicationHelper

    这是一些不起作用的简单代码 module ApplicationHelper def industries industries Agriculture Food etc end end class User lt ActiveRecord
  • Oracle Apex - REST 数据源 - 嵌套 JSON 数组 - 触发两个表 - 删除函数错误 ORA-04091

    这个问题是另一个问题的后续所以问题 https stackoverflow com questions 75219903 oracle apex rest data source nested json array trigger two