PL/SQL使用VARRAY出现‘Subscript beyond count’错误的排查求助
PL/SQL VARRAY 下标越界问题解决
错误原因
你遇到的Subscript beyond count错误,核心问题是VARRAY初始化后是空的,直接用下标赋值会越界。当你执行personas_array := personas();时,这个VARRAY的元素计数(COUNT)是0,没有任何可用的元素位置,这时不管i是1还是其他值,直接用personas_array(i)赋值都会触发下标超出范围的错误。
修复方案
在给VARRAY元素赋值前,必须先调用EXTEND()方法扩展数组,为新元素分配空间。可以调整循环内的代码逻辑,不用手动维护i变量,直接利用数组的COUNT属性来定位新元素的下标:
修改后的PL/SQL块代码:
DECLARE nombre_grupo VARCHAR2(15); direccion_tipo direccion; persona_tipo persona; personas_array personas := personas(); CURSOR departamento IS SELECT * FROM departamentos; CURSOR empleado IS SELECT * FROM empleados, departamentos WHERE empleados.dept_no = departamentos.dept_no; BEGIN FOR departamento_rec IN (SELECT * FROM departamentos) LOOP nombre_grupo := departamento_rec.dnombre; personas_array := personas(); -- 重置为空数组 FOR empleado_rec IN (SELECT * FROM empleados WHERE dept_no = departamento_rec.dept_no) LOOP direccion_tipo := DIRECCION(departamento_rec.loc, 'NULL', empleado_rec.dir); personas_array.EXTEND(); -- 扩展数组,新增一个元素位置 -- 用COUNT属性获取当前最后一个元素的下标 personas_array(personas_array.COUNT) := PERSONA(empleado_rec.emp_no, empleado_rec.apellido, direccion_tipo, empleado_rec.fecha_alt); END LOOP; INSERT INTO grupos VALUES (nombre_grupo, personas_array); END LOOP; END; /
补充说明
- 你之前尝试删除重建
personas类型没用,是因为错误根本不在类型定义本身,而是数组的使用逻辑错误。 - 不能在PL/SQL块内创建类型后插入表,是因为表的列类型必须是**数据库级(SCHEMA级)**的类型,PL/SQL块内定义的是局部类型,无法被表结构识别。
内容的提问来源于stack exchange,提问作者doctrinavladimir
相关产品推荐
相关产品推荐

