Oracle Apex中调用APEX_JSON.get_varchar2解析JSON遇数值错误求助
问题分析与解决方法
错误原因
meta.columns是JSON数组类型,而APEX_JSON.get_varchar2(p_path => 'meta.columns')是用于提取单个字符串值的API,直接调用会因类型不匹配触发numeric or value error错误。
正确解析示例
以下是完整的PL/SQL解析代码,可正确读取meta.columns数组中的所有元素:
DECLARE l_json_str VARCHAR2(32767) := '{ "data": [["2021-01-01", 22, 22, 204, 0.09090909090909091, 22.545454545454547, 1.0, 6], ["2021-01-02", 25, 25, 240, 0.4, 21.16, 1.0, 17], ["2021-01-03", 22, 22, 195, 0.2727272727272727, 21.59090909090909, 1.0, 9], ["2021-01-04", 25, 25, 175, 0.16, 17.56, 1.0, 7], ["2021-01-05", 27, 27, 181, 0.18518518518518517, 16.925925925925927, 1.0, 6], ["2021-01-06", 21, 21, 137, 0.23809523809523808, 18.333333333333332, 1.0, 7], ["2021-01-07", 18, 18, 149, 0.2222222222222222, 19.0, 1.0, 11], ["2021-01-08", 27, 27, 206, 0.2222222222222222, 20.703703703703702, 1.0, 11], ["2021-01-09", 17, 17, 129, 0.23529411764705882, 17.647058823529413, 1.0, 5], ["2021-01-10", 21, 21, 173, 0.2857142857142857, 18.714285714285715, 1.0, 8]], "meta": {"columns": ["timestamp__to_date", "visitors", "sessions", "page_views", "goal_conversion_rate", "events_per_session", "returning_visitors_rate", "goal_conversions"], "count": 89} }'; l_col_count NUMBER; l_col_name VARCHAR2(100); BEGIN -- 解析JSON字符串到APEX_JSON内存结构 APEX_JSON.parse(l_json_str); -- 获取meta.columns数组的长度 l_col_count := APEX_JSON.get_count(p_path => 'meta.columns'); -- 遍历数组,逐个提取元素值 FOR i IN 1..l_col_count LOOP l_col_name := APEX_JSON.get_varchar2(p_path => 'meta.columns[%d]', p0 => i); DBMS_OUTPUT.PUT_LINE('列名: ' || l_col_name); END LOOP; -- 可选:获取meta.count数值 DBMS_OUTPUT.PUT_LINE('数据行数: ' || APEX_JSON.get_number(p_path => 'meta.count')); END; /
关键说明
- 使用
APEX_JSON.get_count(p_path => 'meta.columns')获取数组元素个数,用于循环遍历。 - 数组元素的路径格式为
meta.columns[%d],其中%d是占位符,通过p0参数传入索引值(从1开始)。 - 如果需要一次性获取所有数组元素,也可以使用
APEX_JSON.get_json_table将数组转换为关系型表格:
SELECT column_value AS column_name FROM APEX_JSON.get_json_table( p_json => l_json_str, p_path => 'meta.columns[*]' );
内容的提问来源于stack exchange,提问作者Mohammad Ubaid
相关产品推荐
相关产品推荐

