Oracle Apex - REST 数据源 - 嵌套 JSON 数组 - 同步两个表 - 在哪里编写 SQL

2024-03-22

这个问题是后续问题另一个问题 https://stackoverflow.com/questions/75183126/oracle-apex-22-21-rest-data-source-nested-json-array-discovery.

摘要:我有一个返回嵌套 JSON 数组的 API。正在通过 APEX 提取数据REST 数据源. The 行选择器 in the 数据简介被设定为 ”。” (选择“根节点”)。

The lines数组已手动添加到列 (LINES) 中数据简介, set 数据类型 to JSON文档,并使用lines as the selector.

SAMPLE JSON RESPONSE FROM API
[ {
  "order_number": "so1223",
  "order_date": "2022-07-01",
  "full_name": "Carny Coulter",
  "email": "[email protected] /cdn-cgi/l/email-protection",
  "credit_card": "3545556133694494",
  "city": "Myhiya",
  "state": "CA",
  "zip_code": "12345",
  "lines": [
    {
      "product": "Beans - Fava, Canned",
      "quantity": 1,
      "price": 1.99
    },
    {
      "product": "Edible Flower - Mixed",
      "quantity": 1,
      "price": 1.50
    }
  ]
},
{
  "order_number": "so2244",
  "order_date": "2022-12-28",
  "full_name": "Liam Shawcross",
  "email": "[email protected] /cdn-cgi/l/email-protection",
  "credit_card": "6331104669953298",
  "city": "Humaitá",
  "state": "NY",
  "zip_code": "98670",
  "lines": [
    {
      "order_id": 5,
      "product": "Beans - Green",
      "quantity": 2,
      "price": 4.33
    },
    {
      "order_id": 1,
      "product": "Grapefruit - Pink",
      "quantity": 5,
      "price": 5.00
    }
  ]
},
]

订单属性已同步到本地表(表名:SOTEST_LOCAL)

该表有正确的数据。如下所示,LINES列包含 JSON 数组。

然后我创建了一个ORDER_LINES从中提取 JSON 的子表LINES栏目中的SOTEST_LOCAL桌子。 (抱歉表名......我应该将表命名为ORDERS_LOCAL and ORDER_LINES_LOCAL)

CREATE TABLE  "SOTEST_ORDER_LINES_LOCAL" 
   (    "LINE_ID" NUMBER, 
    "ORDER_ID" NUMBER, 
    "LINE_NUMBER" NUMBER, 
    "PRODUCT" VARCHAR2(200) COLLATE "USING_NLS_COMP", 
    "QUANTITY" NUMBER, 
    "PRICE" NUMBER, 
     CONSTRAINT "SOTEST_ORDER_LINES_LOCAL_PK" PRIMARY KEY ("LINE_ID")
  USING INDEX  ENABLE
   )  DEFAULT COLLATION "USING_NLS_COMP"
/
ALTER TABLE  "SOTEST_ORDER_LINES_LOCAL" ADD CONSTRAINT "SOTEST_ORDER_LINES_LOCAL_FK" FOREIGN KEY ("ORDER_ID")
      REFERENCES  "SOTEST_LOCAL" ("ORDER_ID") ON DELETE CASCADE ENABLE
/
QuickSQL version..

SOTEST_ORDER_LINES_LOCAL
    LINE_ID /pk
    ORDER_ID /fk SOTEST_LOCAL references ORDER_ID
    LINE_NUMBER
    PRODUCT
    QUANTITY
    PRICE

因此,根据 Carsten 在上一个问题中的回答,我可以编写 SQL 来从LINES栏目中的SOTEST_LOCAL表到子表SOTEST_ORDER_LINES_LOCAL.

我的问题分为两部分。

  • SQL具体应该写在哪里呢?我会把它写在SQL Workshop in SQL Commands?

  • REST 数据正在同步以每小时发出一次请求。那么我是否需要编写一个在每次合并新数据时运行的函数?


有多种选择:

  1. 在本地同步表上创建触发器

    您可以在 ORDERS 表上创建一个触发器,该触发器运行AFTER INSERT, UPDATE or DELETE在您的 ORDERS 表上,并维护 LINES 表。这个的好处是子表的维护独立于 APEX 或 REST 同步;如果您只是使用普通 SQL*Plus 插入行,它也可以工作。

    下面是一些关于触发器的伪代码。

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 SOTEST_ORDER_LINES_LOCAL ( order_id, line_id, line_number, product, quantity, price) 
        ( select :new.id,
                 seq_lines.nextval,
                 j.line#,
                 j.product,
                 j.quantity,
                 j.price
            from json_table( 
                     :new.lines,
                     '$[*]' columns (
                         line# for ordinality,
                         product  varchar2(255) path '$.product',
                         quantity number        path '$.quantity',
                         price    number        path '$.price' ) ) );
    elsif deleting then
        delete SOTEST_ORDER_LINES_LOCAL
         where order_id = :old.id;
    elsif updating then
        -- 
        -- handle the update case here.
        -- I would simply delete and re-insert LINES rows.
    end if;
end;
  1. 在 APEX 本身中处理子表维护。

    您可以关闭scheduleREST 源同步,并且仅在使用 APEX_REST_SOURCE_SYNC.SYNCHRONIZE_DATA 调用时才运行(https://docs.oracle.com/en/database/oracle/apex/22.1/aeapi/SYNCHRONIZE_DATA-Procedure.html#GUID-660DE4D1-4BAF-405A-A871-6B8C201969C9 https://docs.oracle.com/en/database/oracle/apex/22.1/aeapi/SYNCHRONIZE_DATA-Procedure.html#GUID-660DE4D1-4BAF-405A-A871-6B8C201969C9)。 然后创建一个埃派克斯自动化,它按照您想要的时间表运行,并且此自动化有两个Actions。一种是 REST 源同步,另一种是调用 PL/SQL 代码来维护子表。

    看看这篇博客文章,其中讨论了一些更复杂的同步场景(尽管它确实适合场景):https://blogs.oracle.com/apex/post/synchronize-parent-child-rest-sources https://blogs.oracle.com/apex/post/synchronize-parent-child-rest-sources

我希望这有帮助

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

Oracle Apex - REST 数据源 - 嵌套 JSON 数组 - 同步两个表 - 在哪里编写 SQL 的相关文章

随机推荐

  • 是否可以在 mysql 中散列整个结果集?

    是否可以将哈希函数应用于 mysql 中的整个结果集 我知道如何对结果集的每一行中的值进行哈希处理 e g SELECT md5 something 不过 假设我有一个查询 例如 SELECT FROM some table 结果集包含很多
  • 使 JTable 单元格编辑器值可选择,但不可编辑?

    我已经尽力保持我的JTable紧密且安全 仅可编辑列可通过isCellEditable 然而 我的客户坚持要求他们双击某个单元格 以便复制其内容 即使它是只读的 我可以让单元格可编辑 并且不对他们可以在setValueAt 因此当编辑器退出
  • 值等于数组中的任何值吗?

    只是想知道是否有任何方法可以检查值 A 是否等于数组中的任何值 不使用大循环函数 有点像 Where 函数 e g if DataRow column1value
  • 使用 jetpack EncryptedFile 安全性进行图像加密

    谷歌介绍安全加密jetpack库 https developer android com topic security data 我想使用这个库来加密图像文件 在库的文档中没有用于加密图像文件的示例 我将图像转换为位图 位图转换为字节数组
  • 点击叠加时显示标注

    我有一个带有多个叠加层的 MKMapView 一切都很好 而且它的工作原理是如此简单 令人难以置信 然而 有一件事我无法去上班 这个想法很简单 当用户在覆盖层覆盖的区域内点击时 必须出现包含有关该覆盖层的一些信息的标注 叠加都是MKPoly
  • 高效访问任意深度的字典

    假设我有一个像这样的多级字典 mydict first second third fourth the end 我想像这样访问它 test get entry mydict first second third fourth 到目前为止我所
  • 保存张量流对象检测增强图像

    有没有办法在所有预处理 增强之后查看tensorflow对象检测api训练的图像 我想验证一下事情看起来是否正确 我能够通过查看推论中调整大小的图表来验证调整大小 但显然我无法对增强选项执行此操作 过去使用 Keras 我已经能够做到这一点
  • 如何向 UITableView 单元格添加图像?

    我临时添加了一些值UITableViewCell以编程方式 但我需要向每个单元格添加图像 我怎样才能做到这一点 这是我的代码 h 文件 interface BidalertsViewController UIViewController
  • 如何将 jstring 转换为 wchar_t *

    假设在 C 方面 我的函数采用类型变量jstring named myString 我可以将其转换为 ANSI 字符串 如下所示 const char ansiString env gt GetStringUTFChars myString
  • 身体下方的空白区域和 div 的奇怪位置[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在为朋
  • gcc、静态库、外部汇编函数变成未定义符号

    我在 g 构建链接到静态库的应用程序时遇到问题 其中静态库应包含一些用外部 asm 文件编写的全局函数 并使用 yasm 编译 所以在图书馆里 我有 ifdef cplusplus extern C endif extern void at
  • 如何在 Javascript 中查找财产的所有者

    好的 因为我最初的问题听起来不清楚 所以我决定对其进行编辑 我的问题是如何找出谁定义了某个属性 例如parseInt函数 我如何知道它是在哪个对象上定义的 就像 ifparseInt被定义在window对象或document对象或任何对象
  • 从多个嵌套数组创建新的数据对象集

    我有一个复杂的数据结构 其中有多个嵌套数组 下面是当前的结构 var contentData data content type column sections sub type heading 1 text Heading Text ty
  • 引导程序和访问过的链接

    我们使用 Bootstrap 为我们的网站提供响应能力 指示后续链接是良好的用户体验实践 但由于 Bootstrap 是为应用程序构建的 因此它不支持这一点 人们使用过任何解决方法吗 一年多前 问题已通过 bootstrap 记录并关闭 请
  • 如何检测移动设备是否由 Google Chrome 模拟? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有没有办法区分真实的移动设备和 Google Chrome 模拟的设备 请注意 Google Chrome 可以模拟用户代理 触摸屏
  • 从站点中抓取验证链接 Href

    我想从以下位置获取验证hrefGmailnator 收件箱 https www gmailnator com geralddoreyestmp messageid 179b454b4c482c4d并且此站点包含 href 不和谐验证 如下所
  • javascript 模块导出模式

    有人可以解释一下导出变量的用途吗 从backbone js复制过来 我还注意到spine js使用相同的模式 https gist github com 1375748 https gist github com 1375748 var B
  • 如何更改 Sublime Text 中输出面板的位置?

    我希望输出显示在代码的右侧 而不是下面 我可以将视图更改为两列 但无法更改输出面板的位置 例如 是否可以将输出面板的位置更改为代码的右侧 而不是代码的下方 有一种解决方案已经存在多年 但似乎并未得到广泛使用 这是包buildview 它将构
  • 如何在指令模板中使用范围

    我想在这样的指令的模板函数中使用 scope 变量 换句话说 我想在指令内部并使用 scope 变量生成指令模板 帮助我将模板功能连接到控制器 directive data compile http templateCache functi
  • Oracle Apex - REST 数据源 - 嵌套 JSON 数组 - 同步两个表 - 在哪里编写 SQL

    这个问题是后续问题另一个问题 https stackoverflow com questions 75183126 oracle apex 22 21 rest data source nested json array discovery