我需要在源代码的第4部分中帮助解决此错误,当我想查看I.DIRECTOR.ASIGNATURAS.COUNT时,这是一个嵌套表并显示此错误: 06531. 00000 - “未初始化集合的参考” *原因:嵌套表或varray的元素或成员函数 被引用(需要初始化集合) 没有收集已初始化。 *操作:使用适当的构造函数初始化集合 或整个对象分配。
--tables
CREATE TABLE C1_CENTROS(
COD_CENTRO NUMBER(4) CONSTRAINT PKCENTROS PRIMARY KEY,
NOM_CENTRO VARCHAR2(20),
DIRECTOR NUMBER(4),
DIRECCION VARCHAR2(25),
LOCALIDAD VARCHAR2(20),
PROVINCIA VARCHAR2(20)
);
INSERT INTO C1_CENTROS VALUES (1000,'IES El Quijote', 1000,'Avda. Los Molinos 25', 'GUADALAJARA', 'GUADALAJARA');
INSERT INTO C1_CENTROS VALUES (1015,'CP Los Danzantes', 1010,'C/Las Musas s/n','PASTRANA', 'GUADALAJARA');
INSERT INTO C1_CENTROS VALUES (1022, 'IES Planeta Tierra',2000, 'C/Mina 45', 'AZUQUECA', 'GUADALAJARA');
INSERT INTO C1_CENTROS VALUES (1045, 'CP Manuel Hidalgo', NULL, 'C/Granada 5', 'GUADALAJARA', 'GUADALAJARA');
INSERT INTO C1_CENTROS VALUES (1050, 'IES Antoñete', NULL,'C/Los Toreros 21', 'SIGUENZA', 'GUADALAJARA');
COMMIT;
CREATE TABLE C1_ESPECIALIDAD( -- (1 fila por especialidad)
ESPECIALIDAD CHAR(2) CONSTRAINT PKESP PRIMARY KEY,
NOMBRE_ESPE VARCHAR2(30)
);
insert into C1_ESPECIALIDAD VALUES ('IF','Informática');
insert into C1_ESPECIALIDAD VALUES ('IN','Inglés');
insert into C1_ESPECIALIDAD VALUES ('FQ','Física y Química');
insert into C1_ESPECIALIDAD VALUES ('GH','Geografía e Historia');
insert into C1_ESPECIALIDAD VALUES ('TG','Tecnología');
insert into C1_ESPECIALIDAD VALUES ('LG','Lengua');
insert into C1_ESPECIALIDAD VALUES ('DB','Dibujo');
insert into C1_ESPECIALIDAD VALUES ('MT','Matemáticas');
CREATE TABLE C1_PROFESORES (
COD_PROF NUMBER(4) CONSTRAINT PKPROF PRIMARY KEY,
NOMBRE_APE VARCHAR2(30),
ESPECIALIDAD CHAR(2),
JEFE_DEP NUMBER(4),
FECHA_NAC DATE,
SEXO CHAR(1),
COD_CENTRO NUMBER(4),
constraint fk_prof_cent foreign key(COD_CENTRO) references c1_centros,
constraint fk_prof_esp foreign key(ESPECIALIDAD) references C1_ESPECIALIDAD
);
INSERT INTO C1_PROFESORES VALUES (1000,'Martínez Salas, Fernando', 'IF', 1001, '07-09-1961', 'H', 1000);
INSERT INTO C1_PROFESORES VALUES (1001, 'Bueno Zarco, Elisa', 'IF',NULL, '17-02-1960', 'M', 1000);
INSERT INTO C1_PROFESORES VALUES (2002, 'Rivera Silvestre, Ana','DB',3000, '10-10-1950', 'M',1000);
INSERT INTO C1_PROFESORES VALUES (3000, 'De Lucas Fdez, M.Angel','DB',NULL, '09-09-1980','M',1000);
INSERT INTO C1_PROFESORES VALUES (1010, 'Montes García, M.Pilar', 'MT', 1011,'10-10-1970', 'M', 1015);
INSERT INTO C1_PROFESORES VALUES (1011, 'Arroba Conde, Manuel', 'MT', NULL,'10-12-1970', 'H', 1015);
INSERT INTO C1_PROFESORES VALUES (1022, 'Ruiz Lafuente, Manuel','MT',1011, '11-11-1966', 'H',1015);
INSERT INTO C1_PROFESORES VALUES (2000, 'Ramos Ruiz, Luis','LG',2003, '08-08-1963', 'H',1022 );
INSERT INTO C1_PROFESORES VALUES (2003, 'Segura Molina, Irene','LG',NULL, '08-07-1963', 'M',1022 );
INSERT INTO C1_PROFESORES VALUES (1045, 'Serrano Laguía, María','IF',NULL,'01-02-1976', 'M', 1022);
COMMIT;
alter table c1_CENTROS
add constraint fk_centr_dire foreign key(DIRECTOR)references C1_PROFESORES(COD_PROF);
alter table c1_profesores
add constraint fk_prof_prof foreign key(JEFE_DEP)references C1_PROFESORES(COD_PROF);
CREATE TABLE C1_ASIGNATURAS (
COD_ASIG CHAR(6) CONSTRAINT PKASIG primary key,
NOMBRE_ASI VARCHAR2(30)
);
insert into C1_ASIGNATURAS VALUES ('IF0001','DAHC');
insert into C1_ASIGNATURAS VALUES ('IF0002','RAL');
insert into C1_ASIGNATURAS VALUES ('IF0003','IMSI');
insert into C1_ASIGNATURAS VALUES ('IF0004','DPEG');
insert into C1_ASIGNATURAS VALUES ('IF0006','PLE');
insert into C1_ASIGNATURAS VALUES ('IF0007','FPE');
insert into C1_ASIGNATURAS VALUES ('LG0001','Lengua 1 ESO');
insert into C1_ASIGNATURAS VALUES ('LG0002','Lengua 2 ESO');
insert into C1_ASIGNATURAS VALUES ('LG0003','Lengua 3 ESO');
insert into C1_ASIGNATURAS VALUES ('LG0004','Lengua 4 ESO');
insert into C1_ASIGNATURAS VALUES ('DB0001','Plástica');
insert into C1_ASIGNATURAS VALUES ('DB0002','Taller cerámica');
insert into C1_ASIGNATURAS VALUES ('DB0003','Dibujo Técnico');
insert into C1_ASIGNATURAS VALUES ('MT0001','Matemáticas 1 BAC');
insert into C1_ASIGNATURAS VALUES ('MT0002','Matemáticas 2 BAC');
CREATE TABLE C1_ASIGPROF ( --asignaturas que imparten los profesores
COD_ASIG CHAR(6) ,
COD_PROF NUMBER(4),
constraint PK_ASIG_PROF primary key(COD_ASIG ,COD_PROF ),
constraint fk_asiprof_asi foreign key(COD_ASIG) references c1_asignaturas,
constraint fk_asiprof_prof foreign key(COD_PROF) references c1_profesores
);
insert into C1_ASIGPROF VALUES ('IF0002',1001);
insert into C1_ASIGPROF VALUES ('IF0003',1001);
insert into C1_ASIGPROF VALUES ('IF0001',1000);
insert into C1_ASIGPROF VALUES ('LG0001',2000);
insert into C1_ASIGPROF VALUES ('LG0002',2000);
insert into C1_ASIGPROF VALUES ('LG0003',2003);
insert into C1_ASIGPROF VALUES ('LG0004',2003);
insert into C1_ASIGPROF VALUES ('DB0001',2002);
insert into C1_ASIGPROF VALUES ('DB0002',2002);
insert into C1_ASIGPROF VALUES ('DB0003',3000);
insert into C1_ASIGPROF VALUES ('MT0001',1010);
insert into C1_ASIGPROF VALUES ('MT0001',1011);
insert into C1_ASIGPROF VALUES ('MT0001',1022);
insert into C1_ASIGPROF VALUES ('MT0002',1010);
COMMIT;
--part 1 (this is ok)
CREATE OR REPLACE TYPE TIPO_ESPECIALIDAD AS OBJECT(
ESPECIALIDAD CHAR(2),
NOMBRE_ESPE VARCHAR2(30)
);
/
CREATE OR REPLACE TYPE TIPO_ASIGNATURA AS OBJECT(
COD_ASIG CHAR(6),
NOMBRE_ASI VARCHAR2(30)
);
/
CREATE OR REPLACE TYPE TABLA_ASIG AS TABLE OF TIPO_ASIGNATURA;
/
CREATE OR REPLACE TYPE TIPO_PROFESOR AS OBJECT(
COD_PROF NUMBER(4),
NOMBRE_APE VARCHAR2(30),
ESPECIALIDAD TIPO_ESPECIALIDAD,
FECHA_NAC DATE,
SEXO CHAR(1),
ASIGNATURAS TABLA_ASIG
);
/
CREATE OR REPLACE TYPE TIPO_CENTROS AS OBJECT( --(1 fila por centro)
COD_CENTRO NUMBER(4),
NOM_CENTRO VARCHAR2(20),
DIRECTOR TIPO_PROFESOR, -- (código de profesor del director del centro)
DIRECCION VARCHAR2(25),
LOCALIDAD VARCHAR2(20),
PROVINCIA VARCHAR2(20)
);
/
--part 2 (this is ok)
CREATE TABLE TABLA_CENTROS OF TIPO_CENTROS(
COD_CENTRO PRIMARY KEY
)NESTED TABLE DIRECTOR.ASIGNATURAS STORE AS TABLA_STORE_CEN;
/
CREATE TABLE TABLA_PROFESORES(
PROFESOR TIPO_PROFESOR,
COD_CENTRO REF TIPO_CENTROS
)NESTED TABLE PROFESOR.ASIGNATURAS STORE AS TABLA_STORE_PRO;
/
--part 3 (this is ok)
INSERT INTO TABLA_CENTROS (COD_CENTRO, NOM_CENTRO, DIRECCION, LOCALIDAD, PROVINCIA)
SELECT COD_CENTRO, NOM_CENTRO, DIRECCION, LOCALIDAD, PROVINCIA FROM C1_CENTROS;
/
INSERT INTO TABLA_PROFESORES
SELECT
TIPO_PROFESOR(P.COD_PROF, P.NOMBRE_APE,
TIPO_ESPECIALIDAD(E.ESPECIALIDAD,
E.NOMBRE_ESPE),
FECHA_NAC, SEXO, TABLA_ASIG () ),
REF (CEN)
FROM C1_PROFESORES P, TABLA_CENTROS CEN,
C1_ESPECIALIDAD E
WHERE P.ESPECIALIDAD = E.ESPECIALIDAD
AND P.COD_CENTRO = CEN.COD_CENTRO;
UPDATE TABLA_CENTROS TC SET TC.DIRECTOR =(
SELECT T.PROFESOR FROM TABLA_PROFESORES T, C1_CENTROS CE WHERE CE.COD_CENTRO=TC.COD_CENTRO AND CE.DIRECTOR = T.PROFESOR.COD_PROF
);
/
DECLARE
CURSOR C1 (PROF NUMBER) IS
SELECT T1.COD_ASIG CO , NOMBRE_ASI NOM
FROM C1_ASIGNATURAS T1, C1_ASIGPROF T2
WHERE T1.COD_ASIG= T2.COD_ASIG AND COD_PROF = PROF;
CURSOR C2 IS SELECT P.PROFESOR.COD_PROF PP
FROM TABLA_PROFESORES P;
ASIG TIPO_ASIGNATURA:= TIPO_ASIGNATURA(NULL,NULL) ;
BEGIN
FOR I IN C2 LOOP --RECORRE TABLA PROFESORES
FOR J IN C1(I.PP) LOOP --RECORRE ASIG POR PROF
ASIG.COD_ASIG := J.CO;
ASIG.NOMBRE_ASI := J.NOM ;
INSERT INTO TABLE
(SELECT T.PROFESOR.ASIGNATURAS FROM
TABLA_PROFESORES T
WHERE T.PROFESOR.COD_PROF= I.PP )
VALUES (TIPO_ASIGNATURA
(ASIG.COD_ASIG,ASIG.NOMBRE_ASI ));
DBMS_OUTPUT.PUT_LINE('CODIGO:' ||
I.PP ||'*'||ASIG.NOMBRE_ASI);
END LOOP;
END LOOP;
END;
/
--part 4 (this is the error)
DECLARE
CURSOR C1 IS SELECT * FROM TABLA_CENTROS;
BEGIN
FOR I IN C1 LOOP
DBMS_OUTPUT.PUT_LINE(I.COD_CENTRO||' - '||I.NOM_CENTRO||' - '||I.DIRECCION||' - '||I.LOCALIDAD||' - '||I.PROVINCIA);
DBMS_OUTPUT.PUT_LINE(I.DIRECTOR.COD_PROF||' - '||I.DIRECTOR.NOMBRE_APE||' - '||I.DIRECTOR.FECHA_NAC||' - '||I.DIRECTOR.SEXO);
DBMS_OUTPUT.PUT_LINE(I.DIRECTOR.ESPECIALIDAD.ESPECIALIDAD||' - '||I.DIRECTOR.ESPECIALIDAD.NOMBRE_ESPE);
FOR J IN 1.. I.DIRECTOR.ASIGNATURAS.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(I.DIRECTOR.ASIGNATURAS(J).COD_ASIG||' - '||I.DIRECTOR.ASIGNATURAS(J).NOMBRE_ASI);
END LOOP;
END LOOP;
END;
/
答案 0 :(得分:1)
如果查看TABLA_CENTROS
表的内容,可以看到五行中有三行填充了DIRECOR
,但有两行没有填充:
COD_CENTRO NOM_CENTRO DIRECTOR DIRECCION LOCALIDAD PROVINCIA
---------- -------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------- -------------------- --------------------
1000 IES El Quijote STACKOVERFLOW.TIPO_PROFESOR(1000,'Martínez Salas, Fernando',STACKOVERFLOW.TIPO_ESPECIALIDAD('IF','Informática'),'1961-09-07 00:00:00.0','H'STACKOVERFLOW.TABLA_ASIG()) Avda. Los Molinos 25 GUADALAJARA GUADALAJARA
1015 CP Los Danzantes STACKOVERFLOW.TIPO_PROFESOR(1010,'Montes García, M.Pilar',STACKOVERFLOW.TIPO_ESPECIALIDAD('MT','Matemáticas'),'1970-10-10 00:00:00.0','M'STACKOVERFLOW.TABLA_ASIG()) C/Las Musas s/n PASTRANA GUADALAJARA
1022 IES Planeta Tierra STACKOVERFLOW.TIPO_PROFESOR(2000,'Ramos Ruiz, Luis',STACKOVERFLOW.TIPO_ESPECIALIDAD('LG','Lengua'),'1963-08-08 00:00:00.0','H'STACKOVERFLOW.TABLA_ASIG()) C/Mina 45 AZUQUECA GUADALAJARA
1045 CP Manuel Hidalgo C/Granada 5 GUADALAJARA GUADALAJARA
1050 IES Antoñete C/Los Toreros 21 SIGUENZA GUADALAJARA
您正在进行此更新:
UPDATE TABLA_CENTROS TC SET TC.DIRECTOR =(
SELECT T.PROFESOR FROM TABLA_PROFESORES T, C1_CENTROS CE WHERE CE.COD_CENTRO=TC.COD_CENTRO AND CE.DIRECTOR = T.PROFESOR.COD_PROF
);
(顺便说一下,你执行两次:一次使用语句终止分号,一次使用下一行缓冲区提交斜杠),但只看C1_CENTROS:
SELECT CE.COD_CENTRO, CE.DIRECTOR FROM C1_CENTROS CE;
COD_CENTRO DIRECTOR
---------- ----------
1000 1000
1015 1010
1022 2000
1045
1050
..你可以看到两个没有设置DIRECTOR
值,所以更新是正确的,让它们为空。
您还可以看到它们在您的块中进行的DBMS_OUTPUT调用中为空;那些在出错之前得到这么多的输出:
1000 - IES El Quijote - Avda. Los Molinos 25 - GUADALAJARA - GUADALAJARA
1000 - Martínez Salas, Fernando - 07-09-1961 - H
IF - Informática
1015 - CP Los Danzantes - C/Las Musas s/n - PASTRANA - GUADALAJARA
1010 - Montes García, M.Pilar - 10-10-1970 - M
MT - Matemáticas
1022 - IES Planeta Tierra - C/Mina 45 - AZUQUECA - GUADALAJARA
2000 - Ramos Ruiz, Luis - 08-08-1963 - H
LG - Lengua
1045 - CP Manuel Hidalgo - C/Granada 5 - GUADALAJARA - GUADALAJARA
- - -
-
您可能希望为这些行填充DIRECTOR
列,但您可能还有其他允许它们为null的方案,因此您可以在尝试使用计数之前检查对象的状态值:
IF I.DIRECTOR IS NOT NULL THEN
FOR J IN 1.. I.DIRECTOR.ASIGNATURAS.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(I.DIRECTOR.ASIGNATURAS(J).COD_ASIG
||' - '||I.DIRECTOR.ASIGNATURAS(J).NOMBRE_ASI);
END LOOP;
END IF;
添加null检查意味着该块没有错误,现在调试显示:
1000 - IES El Quijote - Avda. Los Molinos 25 - GUADALAJARA - GUADALAJARA
1000 - Martínez Salas, Fernando - 07-09-1961 - H
IF - Informática
1015 - CP Los Danzantes - C/Las Musas s/n - PASTRANA - GUADALAJARA
1010 - Montes García, M.Pilar - 10-10-1970 - M
MT - Matemáticas
1022 - IES Planeta Tierra - C/Mina 45 - AZUQUECA - GUADALAJARA
2000 - Ramos Ruiz, Luis - 08-08-1963 - H
LG - Lengua
1045 - CP Manuel Hidalgo - C/Granada 5 - GUADALAJARA - GUADALAJARA
- - -
-
1050 - IES Antoñete - C/Los Toreros 21 - SIGUENZA - GUADALAJARA
- - -
-
答案 1 :(得分:0)
您是否检查了TABLA_CENTROS中的数据? DIRECTOR列是空的,因为你的UPDATE基于TABLA_PROFESORES表,我在这里看不到,也许错字?