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
相关产品推荐
相关产品推荐

