PL/SQL报错PLS-00382:cursor数据赋值给VARRAY时类型错误
错误原因
PLS-00382报错的核心原因是你将游标循环的行记录变量i直接用作了VARRAY类型字段t_fabricante_reg_sanitario的下标。VARRAY的下标要求为正整数,而i是游标返回的行记录类型,二者类型完全不匹配,因此触发类型错误。除此之外VARRAY使用前未初始化、未主动扩展长度也会后续引发运行时错误。
修复方案
修改后的代码逻辑如下:
- 新增专门的整数变量作为VARRAY的下标
- 使用VARRAY前先完成初始化
- 每次赋值前扩展VARRAY长度,用整数下标完成赋值
-- 原有变量定义后新增VARRAY下标计数变量 v_cont number :=1; v_arr_idx number :=1; -- 新增 ... FOR reg1 IN ... LOOP -- 进入内层游标循环前先初始化VARRAY p_Tabla(v_cont).t_fabricante_reg_sanitario := V_REG_SANITARIO(); v_arr_idx := 1; -- 每次处理新记录时重置下标 for i in c1(v_provr_gen, v_provr_trabajo) loop -- 扩展VARRAY长度 p_Tabla(v_cont).t_fabricante_reg_sanitario.EXTEND; -- 用整数下标完成赋值 p_Tabla(v_cont).t_fabricante_reg_sanitario(v_arr_idx) := i.reg_sanitario; v_arr_idx := v_arr_idx + 1; -- 可选:增加长度校验,避免超过VARRAY定义的最大长度10 if v_arr_idx > 10 then exit; end if; end loop; ... end loop;
注意事项
- 你定义的
V_REG_SANITARIO是最大长度为10的VARRAY,如果游标返回的记录数超过10,扩展长度时会触发报错,可根据业务需求提前加截断逻辑,或者将VARRAY改为无最大长度限制的嵌套表类型。 - 所有PL/SQL集合类型使用前必须初始化,未初始化直接赋值会触发运行时错误。
内容的提问来源于stack exchange,提问作者Golan_trevize
相关产品推荐
相关产品推荐

