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

运行PL/SQL提取JSON数组时遇ORA-06531错误,求解决方案

解决ORA-06531: Reference to uninitialized collection错误方案

问题根源

当JSON对象为空(如示例中第二个元素的test2UUIDs: {}),JSON_OBJECT_T.GET_KEYS()会返回一个未初始化的JSON_KEY_LIST集合,此时直接调用COUNT方法就会抛出ORA-06531错误。

修复方案

以下两种修改方式均可解决问题:

方式一:提前初始化集合

在循环内先初始化V_KEYS,再接收GET_KEYS的返回值,确保集合始终处于已初始化状态:

DECLARE
    V_JDOC_ARRAY   JSON_ARRAY_T;
    V_TEST2UUIDS   JSON_OBJECT_T;
    V_KEYS         JSON_KEY_LIST;
    v_cnt          NUMBER;
BEGIN
    V_JDOC_ARRAY := JSON_ARRAY_T ('[
                                    {
                                     "test1UUIDs": {},
                                     "test2UUIDs": {
                                                    "1": "aaaaaa",
                                                    "2": "bbbbb"
                                                   }
                                    },
                                    {
                                     "test1UUIDs": {},
                                     "test2UUIDs": {}
                                    }
                                  ]');

    FOR V_I IN 0 .. V_JDOC_ARRAY.GET_SIZE - 1
    LOOP
        V_TEST2UUIDS :=
            TREAT (
                TREAT (V_JDOC_ARRAY.GET (V_I) AS JSON_OBJECT_T).GET (
                    'test2UUIDs')
                    AS JSON_OBJECT_T);
        -- 提前初始化集合,避免未初始化的情况
        V_KEYS := JSON_KEY_LIST();
        V_KEYS := V_TEST2UUIDS.GET_KEYS;
        v_cnt := V_KEYS.COUNT;
        DBMS_OUTPUT.PUT_LINE('第' || (V_I+1) || '个对象的test2UUIDs键数量:' || v_cnt);
        
        FOR V_J IN 1..V_KEYS.COUNT LOOP
          DBMS_OUTPUT.PUT_LINE('TEST2UUIDS(' || (V_I + 1) || '): ' || V_KEYS(V_J) || ' ' || V_TEST2UUIDS.GET_STRING(V_KEYS(V_J)));
        END LOOP;
    END LOOP;
END;
/

方式二:判断集合状态后使用

通过IS NOT INITIALIZED条件判断集合状态,未初始化时直接赋值0,避免调用错误方法:

DECLARE
    V_JDOC_ARRAY   JSON_ARRAY_T;
    V_TEST2UUIDS   JSON_OBJECT_T;
    V_KEYS         JSON_KEY_LIST;
    v_cnt          NUMBER;
BEGIN
    V_JDOC_ARRAY := JSON_ARRAY_T ('[
                                    {
                                     "test1UUIDs": {},
                                     "test2UUIDs": {
                                                    "1": "aaaaaa",
                                                    "2": "bbbbb"
                                                   }
                                    },
                                    {
                                     "test1UUIDs": {},
                                     "test2UUIDs": {}
                                    }
                                  ]');

    FOR V_I IN 0 .. V_JDOC_ARRAY.GET_SIZE - 1
    LOOP
        V_TEST2UUIDS :=
            TREAT (
                TREAT (V_JDOC_ARRAY.GET (V_I) AS JSON_OBJECT_T).GET (
                    'test2UUIDs')
                    AS JSON_OBJECT_T);
        V_KEYS := V_TEST2UUIDS.GET_KEYS;
        
        -- 判断集合是否初始化,未初始化则赋值0
        IF V_KEYS IS NOT INITIALIZED THEN
            v_cnt := 0;
        ELSE
            v_cnt := V_KEYS.COUNT;
        END IF;
        DBMS_OUTPUT.PUT_LINE('第' || (V_I+1) || '个对象的test2UUIDs键数量:' || v_cnt);
        
        -- 遍历前先确认集合有效
        IF V_KEYS IS INITIALIZED THEN
            FOR V_J IN 1..V_KEYS.COUNT LOOP
              DBMS_OUTPUT.PUT_LINE('TEST2UUIDS(' || (V_I + 1) || '): ' || V_KEYS(V_J) || ' ' || V_TEST2UUIDS.GET_STRING(V_KEYS(V_J)));
            END LOOP;
        END IF;
    END LOOP;
END;
/

说明

  • 方式一通过提前初始化集合,确保V_KEYS始终处于可用状态;
  • 方式二通过显式判断集合状态,针对性处理空对象场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 10:25:23