我有一个plsql块,它用另外两个表的信息填充一个表,我必须使用一个变量数组:
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;
i INTEGER;
BEGIN
FOR departamento IN (SELECT * FROM departamentos) LOOP
nombre_grupo := departamento.dnombre;
i := 1;
personas_array := personas();
FOR empleado IN (SELECT * FROM empleados WHERE dept_no = departamento.dept_no) LOOP
direccion_tipo := DIRECCION(departamento.loc, 'NULL', empleado.dir);
personas_array(i) := PERSONA(empleado.emp_no, empleado.apellido,
direccion_tipo, empleado.fecha_alt);
i := i + 1;
END LOOP;
INSERT INTO grupos VALUES (nombre_grupo, personas_array);
END LOOP;
END;
下面是典型的人物角色:
CREATE OR REPLACE TYPE personas AS VARRAY(5) OF PERSONA
因此,当我执行该块时,它到达personas_array(i)
位,无论i的值是什么,它都会以“下标超出计数”错误退出执行。
我已经删除并重新创建了类型角色,我还尝试在过程中创建类型,但是它不能插入到表中
1条答案
按热度按时间enxuqcxy1#
SQL初学者的一些提示:
不要学习30年前的Oracle连接语法,使用现代的ANSI连接语法,即
游标是多余的。请使用
或
您还可以使用以下命令:
根据我的感觉,varray经常是学生材料的一部分,但在真实的生活中几乎没有使用。
使用字符串
'NULL'
很可能不是你想要的。使用文字NULL
,即类型
VARRAY(5) OF PERSONA
定义了一个可变数组,其最大大小为5个元素。当您使用personas_array := personas();
初始化它时,实际大小为0。您需要扩展该可变数组。您的代码可能如下所示:
需要注意的是,这样的过程性能会很低。专业的做法是创建嵌套表,然后用一个命令插入数据:
但也许,那会是“高级”SQL课程中的一章。