-1

I need help with this error in the part 4 of my source code, when I want see I.DIRECTOR.ASIGNATURAS.COUNT, this is a nested table and show this error: 06531. 00000 - "Reference to uninitialized collection" *Cause: An element or member function of a nested table or varray was referenced (where an initialized collection is needed) without the collection having been initialized. *Action: Initialize the collection with an appropriate constructor or whole-object assignment.

--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;
/
malrios
  • 1
  • 2
  • This is a lot more information than most people give; but you haven't shown the creation of `TABLA_PROFESORES` so the update in step 3 fails - does that also happen for you, or do you have that defined and get past that step? – Alex Poole Feb 20 '15 at 14:53
  • ok, I have written the table "tabla_profesores", I had forgotten – malrios Feb 22 '15 at 16:26

2 Answers2

1

If you look at the contents of your TABLA_CENTROS table, you can see that three of the five rows have DIRECOR populated, but two do not:

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          

You're doing this update:

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
);

(which, incidentally, you execute twice: once with the statement-terminating semicolon, once with the buffer-submitting slash on the next line), but looking just at C1_CENTROS:

SELECT CE.COD_CENTRO, CE.DIRECTOR FROM C1_CENTROS CE;

COD_CENTRO   DIRECTOR
---------- ----------
      1000       1000 
      1015       1010 
      1022       2000 
      1045            
      1050            

.. you can see that two don't have the DIRECTOR value set, so the update is correct to leave them null.

You can also see that they are null from the DBMS_OUTPUT calls you make in your block; those get this much output before erroring:

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
 -  -  - 
 - 

You may want to populate the DIRECTOR column for those rows, but you could have other scenarios where they are allowed to be null too, so you can just check the state of the object before trying to use the count value:

  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;

Adding that null check means the block doesn't error, and the debugging now shows:

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
 -  -  - 
 - 
Alex Poole
  • 183,384
  • 11
  • 179
  • 318
0

Did you check the data in TABLA_CENTROS ? The DIRECTOR column is null since your UPDATE is based on TABLA_PROFESORES table which I do not see here, typo perhaps ?