You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle Apex:如何通过REST数据源将API数据插入多表?

在Oracle Apex中处理REST数据源的嵌套订单商品数据

方案一:利用Apex REST数据源的子数据源功能(推荐)

这是最贴合Apex生态的做法,无需手写大量代码,通过可视化配置就能处理嵌套JSON:

  • 配置子数据源:编辑你的订单REST数据源,在「数据配置」里添加子数据源,JSON路径指定为$.lines(对应返回数据中的嵌套数组)。同时关联主数据源的order_number作为子数据源的关联字段,这样每条商品记录都会自动绑定对应的订单号。
  • 创建商品表:先建好存储商品信息的表,确保外键关联订单表的order_number:
    CREATE TABLE ORDER_ITEMS_LOCAL (
        item_id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
        order_number VARCHAR2(50) NOT NULL,
        product_id VARCHAR2(50),
        product_name VARCHAR2(200),
        quantity NUMBER,
        unit_price NUMBER,
        FOREIGN KEY (order_number) REFERENCES ORDERS_LOCAL(order_number)
    );
    
  • 设置同步规则:主数据源同步到ORDERS_LOCAL,确保order_number字段正确映射;子数据源同步到ORDER_ITEMS_LOCAL,将主数据源的order_number映射到商品表的对应字段,同时把lines数组里的商品字段(如product_id、quantity)一一映射到商品表列。

方案二:用PL/SQL解析JSON批量插入

如果REST数据源配置受限,或者需要自定义处理逻辑,可以写PL/SQL过程解析嵌套JSON,完成双表插入:

DECLARE
    l_order_batch_json CLOB;
    l_orders_arr JSON_ARRAY_T;
    l_order_obj JSON_OBJECT_T;
    l_lines_arr JSON_ARRAY_T;
    l_line_obj JSON_OBJECT_T;
    l_order_number VARCHAR2(50);
BEGIN
    -- 示例:从REST API获取批量订单JSON(实际可通过APEX_WEB_SERVICE调用获取)
    l_order_batch_json := '[
        {"order_number": "ORD001", "order_date": "2024-05-20", "customer_id": "CUST001",
         "lines": [{"product_id": "PROD001", "product_name": "商品A", "quantity": 2, "unit_price": 99.9}]},
        {"order_number": "ORD002", "order_date": "2024-05-21", "customer_id": "CUST002",
         "lines": [{"product_id": "PROD002", "product_name": "商品B", "quantity": 1, "unit_price": 199.9},
                   {"product_id": "PROD003", "product_name": "商品C", "quantity": 3, "unit_price": 49.9}]}
    ]';

    -- 解析批量订单数组
    l_orders_arr := JSON_ARRAY_T(l_order_batch_json);
    FOR i IN 0..l_orders_arr.get_size()-1 LOOP
        l_order_obj := l_orders_arr.get_object(i);
        l_order_number := l_order_obj.get_string('order_number');
        
        -- 插入主订单表
        INSERT INTO ORDERS_LOCAL (order_number, order_date, customer_id)
        VALUES (l_order_number, 
                TO_DATE(l_order_obj.get_string('order_date'), 'YYYY-MM-DD'),
                l_order_obj.get_string('customer_id'));
        
        -- 解析嵌套商品行,插入商品表
        l_lines_arr := l_order_obj.get_array('lines');
        FOR j IN 0..l_lines_arr.get_size()-1 LOOP
            l_line_obj := l_lines_arr.get_object(j);
            INSERT INTO ORDER_ITEMS_LOCAL (order_number, product_id, product_name, quantity, unit_price)
            VALUES (l_order_number, 
                    l_line_obj.get_string('product_id'),
                    l_line_obj.get_string('product_name'),
                    l_line_obj.get_number('quantity'),
                    l_line_obj.get_number('unit_price'));
        END LOOP;
    END LOOP;
    COMMIT;
END;
/

你可以把这个过程和Apex的REST数据源调用结合,比如在数据源的「后处理」事件中触发,或者做成定时任务批量同步数据。

最佳实践

  • 优先选择方案一,Apex的子数据源功能可视化程度高,后续维护更简单,避免手写代码的出错风险。
  • 确保ORDERS_LOCAL表的order_number是主键或唯一约束,这样外键关联不会出现数据不一致的问题。
  • 如果API返回批量订单,Apex的REST数据源会自动遍历数组,子数据源也会对应绑定每个订单的order_number,无需额外处理循环逻辑。

内容的提问来源于stack exchange,提问作者Kurtonio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 18:22:48