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

使用apex_json获取二级嵌套JSON数组值时返回null问题求助

问题原因

你代码中filter_value始终返回null的核心问题出在嵌套循环的取值逻辑:

  • 调用APEX_JSON.get_varchar2获取数组值时,额外传入了未声明、未初始化的l_json_values参数。你当前使用的是APEX_JSON.parse(v_a)全局解析模式,没有显式将解析结果存入自定义的apex_json.t_values类型变量,此时调用取值方法不需要传p_values参数,传入未赋值的参数会导致路径匹配失败,返回null。
修正方案(两种可选)

方案1:最简修正(保留全局解析模式)

仅需要删除取值语句中多余的p_values => l_json_values参数即可,完整修正后代码如下:

DECLARE
v_a     VARCHAR2(5000) := 
        '{
        "lovFilters": [
            {
            "lovFor": "Ids",
            "values": [1,2,3]
            }, 
            {
            "lovFor": "Amounts",
            "values": [20,30,50,60]
            }
        ]
        }';
v_array_count   NUMBER := 0;
lov_for         VARCHAR2(30);
filter_value    VARCHAR2(256);
v_count_2       NUMBER:= 0;
BEGIN
    APEX_JSON.parse(v_a);
    v_array_count := APEX_JSON.get_count(p_path => 'lovFilters');
    dbms_output.put_line ('FILTER array count : '||v_array_count);
    FOR lr_i IN 1 .. v_array_count
    LOOP
        dbms_output.put_line ('-------------------------');
        lov_for := APEX_JSON.get_varchar2 (p_path => 'lovFilters[%d].lovFor', p0 => lr_i);
        dbms_output.put_line ('lov_for : '||lov_for); 
        v_count_2 := APEX_JSON.get_count(p_path => 'lovFilters[%d].values', p0 => lr_i);
        dbms_output.put_line ('v_count_2 : '||v_count_2);
        dbms_output.put_line ('--------------------------');
        FOR lr_n IN 1 .. v_count_2
        LOOP
            filter_value := 
                APEX_JSON.get_varchar2(p_path => 'lovFilters[%d].values[%d]', p0 => lr_i, p1 => lr_n);
            dbms_output.put_line ('filter_value : '||filter_value);        
        END LOOP;
   END LOOP;
END;
/

方案2:显式使用解析变量(推荐,避免全局解析冲突)

如果要使用p_values参数,需要补全变量声明和解析赋值逻辑:

DECLARE
v_a     VARCHAR2(5000) := 
        '{
        "lovFilters": [
            {
            "lovFor": "Ids",
            "values": [1,2,3]
            }, 
            {
            "lovFor": "Amounts",
            "values": [20,30,50,60]
            }
        ]
        }';
v_array_count   NUMBER := 0;
lov_for         VARCHAR2(30);
filter_value    VARCHAR2(256);
v_count_2       NUMBER:= 0;
l_json_values   apex_json.t_values; -- 新增声明解析结果变量
BEGIN
    APEX_JSON.parse(l_json_values, v_a); -- 解析结果存入变量
    v_array_count := APEX_JSON.get_count(p_values => l_json_values, p_path => 'lovFilters');
    dbms_output.put_line ('FILTER array count : '||v_array_count);
    FOR lr_i IN 1 .. v_array_count
    LOOP
        dbms_output.put_line ('-------------------------');
        lov_for := APEX_JSON.get_varchar2 (p_values => l_json_values, p_path => 'lovFilters[%d].lovFor', p0 => lr_i);
        dbms_output.put_line ('lov_for : '||lov_for); 
        v_count_2 := APEX_JSON.get_count(p_values => l_json_values, p_path => 'lovFilters[%d].values', p0 => lr_i);
        dbms_output.put_line ('v_count_2 : '||v_count_2);
        dbms_output.put_line ('--------------------------');
        FOR lr_n IN 1 .. v_count_2
        LOOP
            filter_value := 
                APEX_JSON.get_varchar2(p_values => l_json_values, p_path => 'lovFilters[%d].values[%d]', p0 => lr_i, p1 => lr_n);
            dbms_output.put_line ('filter_value : '||filter_value);        
        END LOOP;
   END LOOP;
END;
/
运行输出

两种方案运行后输出均符合你的预期:

FILTER array count : 2
-------------------------
lov_for : Ids
v_count_2 : 3
--------------------------
filter_value : 1
filter_value : 2
filter_value : 3
-------------------------
lov_for : Amounts
v_count_2 : 4
--------------------------
filter_value : 20
filter_value : 30
filter_value : 50
filter_value : 60

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:12:00