引用未初始化的集合
Posted
技术标签:
【中文标题】引用未初始化的集合【英文标题】:Reference to uninitialized collection 【发布时间】:2015-02-20 12:45:31 【问题描述】:我在源代码的第 4 部分中需要帮助解决此错误,当我想查看 I.DIRECTOR.ASIGNATURAS.COUNT 时,这是一个嵌套表并显示此错误: 06531. 00000 - “对未初始化集合的引用” *原因:嵌套表或可变数组的元素或成员函数 被引用(需要初始化集合的地方) 没有初始化集合。 *操作:使用适当的构造函数初始化集合 或整个对象分配。
--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;
/
【问题讨论】:
这比大多数人提供的信息要多得多;但是您没有显示TABLA_PROFESORES
的创建,因此第 3 步中的更新失败 - 您是否也会发生这种情况,或者您是否已经定义并通过了该步骤?
好的,我已经写了表格“tabla_profesores”,我忘记了
【参考方案1】:
如果您查看TABLA_CENTROS
表的内容,您可以看到五行中的三行填充了DIRECOR
,但有两行没有:
COD_CENTRO NOM_CENTRO DIRECTOR DIRECCION LOCALIDAD PROVINCIA
---------- -------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------- -------------------- --------------------
1000 IES El Quijote ***.TIPO_PROFESOR(1000,'Martínez Salas, Fernando',***.TIPO_ESPECIALIDAD('IF','Informática'),'1961-09-07 00:00:00.0','H'***.TABLA_ASIG()) Avda. Los Molinos 25 GUADALAJARA GUADALAJARA
1015 CP Los Danzantes ***.TIPO_PROFESOR(1010,'Montes García, M.Pilar',***.TIPO_ESPECIALIDAD('MT','Matemáticas'),'1970-10-10 00:00:00.0','M'***.TABLA_ASIG()) C/Las Musas s/n PASTRANA GUADALAJARA
1022 IES Planeta Tierra ***.TIPO_PROFESOR(2000,'Ramos Ruiz, Luis',***.TIPO_ESPECIALIDAD('LG','Lengua'),'1963-08-08 00:00:00.0','H'***.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
列,但您也可以在其他情况下允许它们为空,因此您可以在尝试使用计数值之前检查对象的状态:
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;
添加该空检查意味着该块不会出错,并且现在调试显示:
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
- - -
-
【讨论】:
【参考方案2】:您检查过 TABLA_CENTROS 中的数据吗? DIRECTOR 列为空,因为您的 UPDATE 基于 TABLA_PROFESORES 表,我在这里看不到,可能是错字?
【讨论】:
我已经写了表格“tabla_profesores”,我忘记了以上是关于引用未初始化的集合的主要内容,如果未能解决你的问题,请参考以下文章