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

使用APEX_JSON构建JSON时get_varchar2返回null的问题求助

APEX_JSON写入后get_varchar2返回null的排查与解决

问题原因

调用apex_json.initialize_clob_output后,所有APEX_JSON.write操作都会直接写入CLOB输出缓冲区,不会填充apex_json.g_values全局变量。后续用apex_json.get_varchar2指定p_values=>apex_json.g_values时自然读不到数据——因为g_values是空的。

解决方案

分两种场景处理:

场景1:需要同时构建JSON结构(用于后续读取)和生成CLOB输出

放弃initialize_clob_output,先通过默认的g_values构建JSON结构,完成读取后再将结构转换为CLOB:

declare
    v_var varchar2(222);
    v_clob clob;
begin
    -- 直接操作g_values构建JSON(默认模式,无需额外初始化)
    APEX_JSON.open_object;
    APEX_JSON.write('w', 'no errors');
    APEX_JSON.close_object;
    
    -- 从g_values中读取指定键的值
    V_VAR := nvl(apex_json.get_VARCHAR2(p_path=>'w',p_values=>apex_json.g_values), '--');
    DBMS_OUTPUT.PUT_LINE('w value is: '|| V_VAR);
    
    -- 将g_values中的JSON结构转换为CLOB输出
    apex_json.get_clob_output(p_clob => v_clob, p_free => true);
    DBMS_OUTPUT.PUT_LINE(v_clob);
end;
/

场景2:仅需生成CLOB输出,无需后续读取结构

保持原有的直接输出写法,但如果要验证内容,直接读取生成的CLOB即可,不要尝试从g_values读取:

declare
    v_var varchar2(222);
    v_clob clob;
begin
    apex_json.initialize_clob_output;
    APEX_JSON.open_object;
    APEX_JSON.write('w', 'no errors');
    APEX_JSON.close_object;
    
    -- 直接读取输出缓冲区的CLOB并提取值
    v_clob := apex_json.get_clob_output(p_free => true);
    DBMS_OUTPUT.PUT_LINE('w value is: '|| json_value(v_clob, '$.w'));
    DBMS_OUTPUT.PUT_LINE(v_clob);
end;
/

排查要点

  • 明确APEX_JSON的两种工作模式:内存结构模式(操作g_values,适合构建后解析读取)和直接输出模式(initialize_clob_output/print,直接生成JSON字符串),两者不能交叉读取。
  • 调用initialize_clob_output后,所有写入操作都会跳过g_values,直接写入输出缓冲区。
  • 可通过apex_json.is_initialized函数检查g_values是否已被初始化填充。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 23:46:04