Oracle Apex 22.21 - REST 数据源 - 嵌套 JSON 数组 - 通过触发器同步两个表 - PLSQL 错误问题

2024-03-26

这个问题是后续问题另一个问题 https://stackoverflow.com/questions/75192510/oracle-apex-rest-data-source-nested-json-array-sync-two-tables-where-to.

我实际上已经重新创建了上一个问题的表格。更新后的 JSON 响应可以在这个问题的底部找到。

ORDERS_LOCAL table

ORDERS_LOCAL表数据。ORDER_ITEMScolumn 是我需要提取到的 JSON 数组ORDER_ITEMS_LOCAL table.

ORDER_ITEMS_LOCAL table. LINE_ID列应该自动创建。ORDER_ID列是一个外键ORDERS_LOCAL table. PRODUCT_ID列是一个外键PRODUCTS table. LINE_NUMBER只是订单行号(第 1 行 = 产品 1、价格、数量 | 第 2 行 = 产品 2、价格、数量等...)我相信它被称为sequence type?

PRODUCTS table

PRODUCTS表数据

根据卡斯滕的回答,我为ORDERS表从对象浏览器.

然后我输入了上一个问题中 Carsten 的 PLSQL 代码。他确实提到这是伪代码。所以我尝试更新一下..

create or replace trigger "TR_MAINTAIN_LINES"
AFTER
insert or update or delete on "ORDERS_LOCAL"
for each row
begin
    if inserting then
        insert into ORDER_ITEMS_LOCAL ( line_id, order_id, line_number, product_id, quantity, price) 
        ( select :new.id,
                 seq_lines.nextval,
                 j.line_number,
                 j.product_id,
                 j.quantity,
                 j.price
            from json_table( 
                     :new.order_items,
                     '$[*]' columns (
                         line_number for ordinality,
                         product_id  number path '$.product_id',
                         quantity number        path '$.quantity',
                         price    number        path '$.price' ) ) );
    elsif deleting then
        delete ORDER_ITEMS_LOCAL
        where order_id = :old.id;
    elsif updating then
        delete ORDER_ITEMS_LOCAL
        where order_id = :old.id;
        -- 
        -- handle the update case here.
        -- I would simply delete and re-insert LINES rows.
    end if;
end;

我收到以下错误

Compilation failed, line 4 (08:38:57) The line numbers associated with compilation errors are relative to the first BEGIN statement. This only affects the compilation of database triggers.
PLS-00049: bad bind variable 'NEW.ID'Compilation failed, line 19 (08:38:57) The line numbers associated with compilation errors are relative to the first BEGIN statement. This only affects the compilation of database triggers.
PLS-00049: bad bind variable 'OLD.ID'Compilation failed, line 22 (08:38:57) The line numbers associated with compilation errors are relative to the first BEGIN statement. This only affects the compilation of database triggers.
PLS-00049: bad bind variable 'OLD.ID'

我相信这是由于触发代码中缺少列造成的,但我不确定。

我是 PLSQL 新手,解析 JSON 有点令人困惑......尤其是下面。请看我的评论。

    if inserting then
        insert into ORDER_ITEMS_LOCAL ( line_id, order_id, line_number, product_id, quantity, price) 
        ( select :new.id,                  -- is this new id for `line_id`
                 order_id                  -- how to insert order_id foreign key
                 seq_lines.nextval,        -- not sure what this is for?
                 j.line_number,            -- I changed 'lines' to 'order_items' so should this be seq_order_items.nextval, ?
                 j.product_id,             
                 j.quantity,
                 j.price
            from json_table( 
                     :new.order_items,           -- I changed 'lines' to 'order_items' so I changed this from :new.lines,
                     '$[*]' columns (            -- Would I include 'line_id' and 'order_id' in here as well?
                         line_number for ordinality,
                         product_id  number path '$.product_id',
                         quantity number        path '$.quantity',
                         price    number        path '$.price' ) ) );

更新的 JSON 响应

[
{
    "order_id": "HO9b6-ahMY-B2i9",
    "order_number": 34795,
    "order_date": "2022-11-02",
    "store_id": 2,
    "full_name": "Ronda Perfitt",
    "email": "[email protected] /cdn-cgi/l/email-protection",
    "city": "Fresno",
    "state": "California",
    "zip_code": "93762",
    "credit_card": "5108758574719798",
    "order_items": [
      {
        "line_number": 1,
        "product_id": 2,
        "quantity": 1,
        "price": 3418.85
      },
      {
        "line_number": 2,
        "product_id": 7,
        "quantity": 1,
        "price": 4070.12
      }
    ]
  },
    {
    "order_id": "RFvUC-sN8Y-icJP",
    "order_number": 62835,
    "order_date": "2022-10-09",
    "store_id": 1,
    "full_name": "Wash Rosenfelt",
    "email": "[email protected] /cdn-cgi/l/email-protection",
    "city": "Chicago",
    "state": "Illinois",
    "zip_code": "60646",
    "credit_card": "5048372443777103",
    "order_items": [
      {
        "line_number": 1,
        "product_id": 1,
        "quantity": 1,
        "price": 3349.05
      },
      {
        "line_number": 2,
        "product_id": 3,
        "quantity": 1,
        "price": 4241.29
      },
      {
        "line_number": 3,
        "product_id": 1,
        "quantity": 1,
        "price": 3560.03
      }
    ]
  },
]

我很抱歉让这件事变得混乱。我真的很想学习如何正确地做到这一点。非常感谢您的支持。谢谢。


在触发器代码中,:old 和 :new 前缀引用触发器操作之前和之后的表行。所以 ...

  • 在更新的情况下,:old.{column-name}引用表列列的值before更新,:new.{column-name}引用值after更新。
  • 在 INSERTING 情况下,没有:old.{column-name}(因此该值为 NULL);:new.{column-name}引用插入的值。
  • 在 DELETING 情况下,没有:new.{column-name}价值;仅有的:old.{column-name}可用。

您会看到编译器错误,因为我的触发器伪代码包含:new.id,但您的表没有名为的列ID; it's ORDER_ID在你的情况下。所以你需要相应地调整该代码。

https://docs.oracle.com/en/database/oracle/oracle-database/21/lnpls/plsql-triggers.html#GUID-E76C8044-6942-4573-B7DB-3502FB96CF6F https://docs.oracle.com/en/database/oracle/oracle-database/21/lnpls/plsql-triggers.html#GUID-E76C8044-6942-4573-B7DB-3502FB96CF6F

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

Oracle Apex 22.21 - REST 数据源 - 嵌套 JSON 数组 - 通过触发器同步两个表 - PLSQL 错误问题 的相关文章

  • 在plsql中检查用户密码是否有效

    我需要检查数据库用户是否有效 我将允许用户使用以下方式更改密码ALTER命令 但在执行此操作之前 我想验证他们当前的密码 以确保他们的身份与他们所说的一致 是否可以在 pl sql 内部获取用户 密码组合并检查其是否有效 我认为 Oracl
  • RESULT_CACHE RELIES_ON (NLS_SESSION_PARAMETERS)

    为什么每次我更改会话以设置新的 NLS DATE FORMAT 时 下面的函数不返回新的参数值 FUNCTION get param p parameter IN VARCHAR2 RETURN VARCHAR2 RESULT CACHE
  • 截断存储过程中的表

    当我在 Oracle shell 中运行以下命令时 它工作正常 truncate table table name 但是当我尝试将其放入存储过程时 CREATE OR REPLACE PROCEDURE test IS BEGIN trun
  • PL/SQL 在整个数据库中搜索字符串

    这不仅仅是一个问题 它还是一个信息共享帖子 我今天遇到一个情况我需要在应用程序的整个数据库中寻找一个刺痛 但不知道它属于哪个表 列 下面是我编写并用于帮助我提出建议的 PL SQL 块 希望它能帮助其他有类似需求的人 Declare i N
  • Oracle Form 中的旧值和新值

    我正在使用 Oracle Forms 我有一个名为SOLD TO CUST PARTY NAME 如果我检测到字段值发生变化 我必须执行一个过程 我尝试使用when validate 但即使您只需单击该字段并移动到另一个字段 它也会执行 无
  • 如果表尚不存在则创建

    我正在尝试创建一个表 如果它尚不存在 我目前正在检查它是否存在于DBA TABLES首先 如果该查询没有返回任何内容 则插入 有没有办法只签入同一条语句 这样我就不必将其分解为单独的查询 这就是我目前所拥有的 BEGIN SELECT CO
  • Oracle Apex - REST 数据源 - 嵌套 JSON 数组 - 同步两个表 - 在哪里编写 SQL

    这个问题是后续问题另一个问题 https stackoverflow com questions 75183126 oracle apex 22 21 rest data source nested json array discovery
  • 您能帮我在 Oracle 中编写一个过程,将数据从表假脱机到 CSV 文件吗?

    我正在编写一个过程来使用 Oracle 表中的数据创建 CSV 文件 我用了 spool filename 但错误来了 我可以用吗spool在 PL SQL 中 我认为在 Oracle 10g 11g 上有更好的方法来实现这一点 但这在 O
  • 生成开始日期和结束日期之间的日期

    我需要生成两个给定日期之间的所有日期 这是问题陈述 Input START DATE END DATE 01 FEB 16 03 FEB 16 01 FEB 16 04 FEB 16 01 FEB 16 05 FEB 16 01 FEB 1
  • 使用 Oracle SQL Developer 查询两个数据库

    有没有办法在 Oracle SQL Developer 中查询两个数据库 在单个查询中 我对 Oracle 不太熟悉 无论如何 除了标准的 CRUD 语法 我正在尝试从 SQL Server 表插入 Oracle 表 想做这样的事情 INS
  • 将字符串数组传递给过程并在 WHERE 子句中使用 IN

    我想将字符串列表传递给过程并在 select 语句的 WHERE 子句中使用它 但我不知道如何执行此操作 我声明了以下嵌套表 TYPE t strarray IS TABLE OF VARCHAR2 30 该过程如下所示 PROCEDURE
  • 在PL/SQL中,以一个表作为参数,过滤它并返回它

    我正在为 PL SQL 函数而苦苦挣扎 我正在尝试编写一个函数 该函数将接受对象表 根据某些条件 我打算根据其他表测试值 过滤该表并返回过滤表 我的表类型定义如下 CREATE TYPE test obj AS OBJECT test id
  • 使用预定义的系统函数将分隔字符串(或列)转换为 Oracle 中的行

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

    在 PL SQL 中 有一些奇特的新概念 比如表函数 对象 可能还有其他我还没有发现的概念 但话又说回来 还有简单的代码生成 动态 pl sql 您可以 立即执行 这些可以帮助代码重用 据我所知 表函数和对象可以帮助创建模块化代码 但仍然不
  • Oracle Apex 22.21 - 图表页面 - 条形图类型 - 日期选择器

    我有一张桌子ORDERS其中包含列ORDER DATE 我创建了一个Chart as a Bar type 我希望图表显示给定日期或范围内的订单量 我正在关注这个Youtube教程 https www youtube com watch v
  • Oracle Apex - REST 数据源 - 嵌套 JSON 数组 - 触发两个表 - 删除函数错误 ORA-04091

    这个问题是另一个问题的后续所以问题 https stackoverflow com questions 75219903 oracle apex rest data source nested json array trigger two
  • 获取表的某些列只有空值

    我需要知道一张表的哪些列只有空值 我知道我应该在 user tab columns 中执行循环 但是如何仅检测具有空值的列呢 感谢并抱歉我的英语 要在事先不知道列标识的情况下执行查询 需要使用动态 SQL 假设您已经知道该表不为空 您可以执
  • 在 PLSQL Oracle 中抛出特定错误消息...在休眠中捕获?

    是否可以在 PL SQL oracle 存储过程中抛出特定的错误消息 并在调用它时在 Hibernate 中捕获它 您可以从 PL SQL 代码中抛出用户定义的错误消息 20000 到 20999 之间的错误代码保留用于用户指定的错误消息
  • 如何在 PL/SQL 中将列添加到现有表之前检查列是否存在?

    在向 Oracle 数据库的表中添加列之前 如何添加简单的检查 我已经包含了用于添加列的 SQL ALTER TABLE db tablename ADD columnname NVARCHAR2 30 可以使用以下视图之一访问有关 Ora
  • Oracle:在更新具有多列的表的一个字段时复制行

    有没有一种方法可以一般复制一行 特别是在不指定所有列的情况下 在我的情况下 我有一个大表 我想在其中复制除 ID 和另一列之外的所有列 事实上 数据是在年初复制的 该表有 50 多列 因此如果我不必指定所有列 则更改架构会更加灵活和稳健 这

随机推荐