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

