引用未初始化的集合

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”,我忘记了

以上是关于引用未初始化的集合的主要内容,如果未能解决你的问题,请参考以下文章

获取对关联数组的未初始化集合的错误引用

ORA-O6531: 引用未初始化的集合错误

构造函数中的引用向量:未初始化的引用

错误:对象引用未初始化

Plsql 未初始化的集合

引用未初始化的内存而不访问它是不是合法?