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

如何在Oracle APEX中获取嵌套JSON中的数据

在Oracle APEX中解析嵌套JSON数组数据的方法

针对你给出的嵌套JSON结构,下面是两种常用的数据提取方法:

方式一:使用APEX_JSON包(PL/SQL方式)

通过APEX_JSON的解析和遍历方法,逐层提取嵌套数组中的数据:

DECLARE
    l_json CLOB := '{
        "payload": [
            {
                "itemId": "155364958",
                "title": "N1000001",
                "terms": [
                    {
                        "title": "Price",
                        "fieldId": "PRICE",
                        "valueTypeName": "Money",
                        "isMultiValue": false,
                        "acceptableValues": "LimitedRange",
                        "isRequirement": false
                    }]
            }] }';
    l_payload_count NUMBER;
    l_terms_count NUMBER;
BEGIN
    -- 解析JSON内容
    APEX_JSON.parse(l_json);
    
    -- 获取payload数组的元素总数
    l_payload_count := APEX_JSON.get_count(p_path => 'payload');
    
    -- 遍历payload数组的每个元素
    FOR i IN 1..l_payload_count LOOP
        DBMS_OUTPUT.PUT_LINE('Item ID: ' || APEX_JSON.get_varchar2(p_path => 'payload[%d].itemId', p0 => i));
        DBMS_OUTPUT.PUT_LINE('Title: ' || APEX_JSON.get_varchar2(p_path => 'payload[%d].title', p0 => i));
        
        -- 获取当前payload元素下terms数组的元素总数
        l_terms_count := APEX_JSON.get_count(p_path => 'payload[%d].terms', p0 => i);
        
        -- 遍历terms数组的每个元素
        FOR j IN 1..l_terms_count LOOP
            DBMS_OUTPUT.PUT_LINE('Term Title: ' || APEX_JSON.get_varchar2(p_path => 'payload[%d].terms[%d].title', p0 => i, p1 => j));
            DBMS_OUTPUT.PUT_LINE('Field ID: ' || APEX_JSON.get_varchar2(p_path => 'payload[%d].terms[%d].fieldId', p0 => i, p1 => j));
            DBMS_OUTPUT.PUT_LINE('Value Type: ' || APEX_JSON.get_varchar2(p_path => 'payload[%d].terms[%d].valueTypeName', p0 => i, p1 => j));
        END LOOP;
    END LOOP;
END;
/

方式二:使用SQL的JSON_TABLE函数(查询方式)

如果需要通过SQL直接查询提取数据,可通过多层JSON_TABLE展开嵌套数组:

SELECT
    p.item_id,
    p.item_title,
    t.term_title,
    t.field_id,
    t.value_type_name,
    t.is_multi_value,
    t.acceptable_values,
    t.is_requirement
FROM
    JSON_TABLE(
        '{
            "payload": [
                {
                    "itemId": "155364958",
                    "title": "N1000001",
                    "terms": [
                        {
                            "title": "Price",
                            "fieldId": "PRICE",
                            "valueTypeName": "Money",
                            "isMultiValue": false,
                            "acceptableValues": "LimitedRange",
                            "isRequirement": false
                        }]
                }] }',
        '$.payload[*]'
        COLUMNS (
            item_id VARCHAR2(20) PATH '$.itemId',
            item_title VARCHAR2(20) PATH '$.title',
            terms_data CLOB FORMAT JSON PATH '$.terms'
        )
    ) p,
    JSON_TABLE(
        p.terms_data,
        '$[*]'
        COLUMNS (
            term_title VARCHAR2(20) PATH '$.title',
            field_id VARCHAR2(20) PATH '$.fieldId',
            value_type_name VARCHAR2(20) PATH '$.valueTypeName',
            is_multi_value VARCHAR2(5) PATH '$.isMultiValue',
            acceptable_values VARCHAR2(20) PATH '$.acceptableValues',
            is_requirement VARCHAR2(5) PATH '$.isRequirement'
        )
    ) t;

或者更简洁的单JSON_TABLE写法(Oracle 12c及以上版本支持):

SELECT
    jt.item_id,
    jt.item_title,
    jt.term_title,
    jt.field_id,
    jt.value_type_name,
    jt.is_multi_value,
    jt.acceptable_values,
    jt.is_requirement
FROM
    JSON_TABLE(
        '{
            "payload": [
                {
                    "itemId": "155364958",
                    "title": "N1000001",
                    "terms": [
                        {
                            "title": "Price",
                            "fieldId": "PRICE",
                            "valueTypeName": "Money",
                            "isMultiValue": false,
                            "acceptableValues": "LimitedRange",
                            "isRequirement": false
                        }]
                }] }',
        '$.payload[*].terms[*]'
        COLUMNS (
            item_id VARCHAR2(20) PATH '../../itemId',
            item_title VARCHAR2(20) PATH '../../title',
            term_title VARCHAR2(20) PATH '$.title',
            field_id VARCHAR2(20) PATH '$.fieldId',
            value_type_name VARCHAR2(20) PATH '$.valueTypeName',
            is_multi_value VARCHAR2(5) PATH '$.isMultiValue',
            acceptable_values VARCHAR2(20) PATH '$.acceptableValues',
            is_requirement VARCHAR2(5) PATH '$.isRequirement'
        )
    ) jt;

内容的提问来源于stack exchange,提问作者Programming with saadmalik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 17:27:16