参考未初始化的集合

时间:2015-02-20 12:45:32

标签: plsql oracle10g oracle-sqldeveloper plsqldeveloper

我需要在源代码的第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;
/

2 个答案:

答案 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表,我在这里看不到,也许错字?