运行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
相关产品推荐
相关产品推荐

