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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 08:05:04