【发布时间】:2026-01-24 19:45:02
【问题描述】:
我在我正在创建的包中使用关联数组,我收到错误 ORA-06531: Reference to uninitialized collection if I try to get the count (TBL.COUNT) before I have bulk collect into the array.
我发现我可以使用 EXISTS(1) 来检查那里是否有东西而不是计数,但如果我不是批量收集到它,我如何获得我需要用于下一行的索引?
loc_idx := TBL.COUNT;
OR
TBL(TBL.COUNT+1) := blah;
我的想法是,与嵌套表和可变数组不同,您不需要初始化关联数组
这是我正在使用的一个示例
TYPE invc_ln_item_type IS TABLE OF invc_ln_item%ROWTYPE;
invc_ln_item_tbl invc_ln_item_type;
用作以下过程的输入
PROCEDURE CREATE_INVC_LN_ITEM(P_LN_ITEM_TYPE_CD IN
invc_ln_item.ln_item_type_cd%TYPE,
P_LN_ITEM_SBTYPE_CD IN
invc_ln_item.ln_item_sbtype_cd%TYPE,
P_INVC_PK IN invc.invc_pk%TYPE,
P_INVC_LN_ITEM_TBL IN OUT
invc_ln_item_type)
IS
loc_inv_ln_item_rec INVC_LN_ITEM%ROWTYPE;
loc_idx NUMBER;
BEGIN
loc_idx := P_INVC_LN_ITEM_TBL.COUNT + 1;
INSERT INTO APP.INVC_LN_ITEM (INVC_LN_ITEM_PK,
INSRT_DT,
INSRT_USER,
LAST_UPDT_DT,
LAST_UPDT_USER,
LN_ITEM_TYPE_CD,
LN_ITEM_SBTYPE_CD,
INVC_PK,
UNITS,
AMT)
VALUES (null,
null,
null,
null,
null,
P_LN_ITEM_TYPE_CD,
P_LN_ITEM_SBTYPE_CD,
P_INVC_PK,
0,
0)
RETURNING INVC_LN_ITEM_PK,
INSRT_DT,
INSRT_USER,
LAST_UPDT_DT,
LAST_UPDT_USER,
LN_ITEM_TYPE_CD,
LN_ITEM_SBTYPE_CD,
INVC_PK,
UNITS,
AMT
INTO loc_inv_ln_item_rec;
P_INVC_LN_ITEM_TBL(loc_idx) := loc_inv_ln_item_rec;
END;
然后像这样被调用
CREATE_INVC_LN_ITEM(P_BILLG_PRFL_LN_ITEM_REC.ln_item_type_cd,
billg_prfl_ln_item_sbtype_tbl(c).ln_item_sbtype_cd,
invc_rec.invc_pk,
invc_ln_item_tbl);
上述案例中的错误发生在: loc_idx := P_INVC_LN_ITEM_TBL.COUNT + 1;
[错误] 执行 (39:1): ORA-06531: 引用未初始化的集合
【问题讨论】:
-
你确定你使用的是关联数组吗?请分享代码。编辑:如果您的集合将被密集填充,您为什么要使用(或尝试使用)关联数组?
-
上面列出的帖子是针对嵌套表的。这篇文章是关于关联数组的
-
如果有人好奇,我解决了这个问题。在定义类型时,我忘记了:INDEX BY PLS_INTEGER
-
@programmerNOOB
When defining the TYPE, I forgot the: INDEX BY PLS_INTEGER那么您的集合不再作为关联数组存在。它已转换为嵌套表,这就是为您发布上述链接的原因。像Reference to uninitialized collection PL/SQL这样的错误也只发生在嵌套表中,因为在关联数组中我们不需要初始化任何东西。所以实际上这是一个指针,`Goran Stefanović` 指出的非常好,
标签: oracle collections plsql associative-array