5

I have the following schema

DROP TABLE ALUMNO_ASIGNATURA;
DROP TABLE ASIGNATURA;
DROP TABLE TITULACION;
DROP TABLE PROFESOR;
DROP TABLE ALUMNO;
DROP TABLE PERSONA;


CREATE TABLE PERSONA
(   DNI             VARCHAR2(9)     CONSTRAINT PERSONA_PK                       PRIMARY KEY, 
    NOMBRE          VARCHAR2(20)    CONSTRAINT PERSONA_NOMBRE_NN                NOT NULL, 
    APELLIDO        VARCHAR2(30)    CONSTRAINT PERSONA_APELLIDO_NN              NOT NULL, 
    CIUDAD          VARCHAR2(20), 
    DIRECCIONCALLE  VARCHAR2(30), 
    DIRECCIONNUM    VARCHAR2(3), 
    TELEFONO        VARCHAR2(9), 
    FECHANACIMIENTO DATE, 
    VARON           VARCHAR2(1)     CONSTRAINT PERSONA_VARON_NN                 NOT NULL 
                                    CONSTRAINT PERSONA_VARON_CK                 CHECK (VARON BETWEEN 0 AND 1)
);

COMMENT ON COLUMN persona.varon IS '0 para mujer, 1 para hombre'; 

CREATE TABLE PROFESOR
(   IDPROFESOR      VARCHAR2(4)     CONSTRAINT PROFESOR_PK                      PRIMARY KEY, 
    DNI             VARCHAR2(9)     CONSTRAINT PROFESOR_DNI_NN                  NOT NULL
                                    CONSTRAINT PROFESOR_PERSONA_FK              REFERENCES PERSONA (DNI)                ON DELETE CASCADE
);

CREATE TABLE ALUMNO
(   IDALUMNO        VARCHAR2(7)     CONSTRAINT ALUMNO_PK                        PRIMARY KEY, 
    DNI             VARCHAR2(9)     CONSTRAINT ALUMO_DNI_NN                     NOT NULL
                                    CONSTRAINT ALUMNO_PERSONA_FK                REFERENCES PERSONA (DNI)                ON DELETE CASCADE
);

CREATE TABLE TITULACION
(   IDTITULACION    VARCHAR2(6)     CONSTRAINT TITULACION_PK                    PRIMARY KEY, 
    NOMBRE          VARCHAR2(30)    CONSTRAINT TITULACION_NOMBRE_NN             NOT NULL
);

CREATE TABLE ASIGNATURA 
(   IDASIGNATURA    VARCHAR2(6)     CONSTRAINT ASIGNATURA_PK                    PRIMARY KEY, 
    NOMBRE          VARCHAR2(50)    CONSTRAINT ASIGNATURA_NOMBRE_NN             NOT NULL, 
    CREDITOS        NUMBER(3,1), 
    CUATRIMESTRE    VARCHAR2(1), 
    COSTEBASICO     NUMBER(16,2), 
    IDPROFESOR      VARCHAR2(4)     CONSTRAINT ASIGNATURA_PROFESOR_FK           REFERENCES PROFESOR (IDPROFESOR)        ON DELETE SET NULL, 
    IDTITULACION    VARCHAR2(6)     CONSTRAINT ASIGNATURA_IDTITULACION_NN       NOT NULL
                                    CONSTRAINT ASIGNATURA_TITULACION_FK         REFERENCES TITULACION (IDTITULACION)    ON DELETE CASCADE, 
    CURSO           VARCHAR2(1)
);

CREATE TABLE ALUMNO_ASIGNATURA
(   IDALUMNO        VARCHAR2(7)     CONSTRAINT ALUMNO_ASIGNATURA_ALUMNO_FK      REFERENCES ALUMNO (IDALUMNO)            ON DELETE CASCADE, 
    IDASIGNATURA    VARCHAR2(6)     CONSTRAINT ALUMNO_ASIGNATURA_ASIGNAT_FK     REFERENCES ASIGNATURA (IDASIGNATURA)    ON DELETE CASCADE,
    NUMEROMATRICULA VARCHAR2(1)     CONSTRAINT ALUMNO_ASIGNATURA_NUM_MATR_NN    NOT NULL,
    CONSTRAINT ALUMNO_ASIGNATURA_PK PRIMARY KEY (IDALUMNO, IDASIGNATURA)
);

--ALTER TABLE ALUMNO ADD CONSTRAINT ALUMNO_DNI_UQ UNIQUE (DNI);
--ALTER TABLE PROFESOR ADD CONSTRAINT PROFESOR_DNI_UQ UNIQUE (DNI);


Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('02852373F','Noelia','Ruiz','Madrid','Romeral','34','916432348',to_date('23/09/74','DD/MM/RR'),'0');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('07634664I','Benito','Encinas','Madrid','Polar','67','916436467',to_date('30/01/67','DD/MM/RR'),'1');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('10210210B','Juan','Perez','Teruel','Teruel','56','936111111',to_date('01/02/70','DD/MM/RR'),'1');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('12354123T','Gregorio','Llamas','Sevilla','Ro','67','942133336',to_date('17/08/79','DD/MM/RR'),'1');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('12456789B','Encarna','Loles','Huesca','Huesca','67','955674523',to_date('18/06/78','DD/MM/RR'),'0');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('16161616A','Luis','Ramírez','Haro','Pez','34','941111111',to_date('01/01/69','DD/MM/RR'),'1');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('17171717A','Laura','Beltrán','Madrid','Gran Vía','23','912121212',to_date('08/08/74','DD/MM/RR'),'0');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('18181818A','Pepe','Pérez','Madrid','Percebe','13','913131313',to_date('02/02/80','DD/MM/RR'),'1');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('19191919A','Juan','Sánchez','Bilbao','Melancolía','7','944141414',to_date('03/03/66','DD/MM/RR'),'1');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('20202020A','Luis','Jiménez','Nájera','Cigüeña','15','941151515',to_date('03/03/79','DD/MM/RR'),'1');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('20220220B','Luis','Valiente','Lugo','San Cristobal','23','956567893',to_date('13/04/60','DD/MM/RR'),'1');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('21123124R','Javier','Maganto','Madrid','Fax','23','917643653',to_date('16/07/78','DD/MM/RR'),'1');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('21212121A','Rosa','García','Haro','Alegría','16','941161616',to_date('04/04/78','DD/MM/RR'),'0');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('23232323A','Jorge','Sáenz','Logroño','Luis Ulloa','17','941171717',to_date('09/09/78','DD/MM/RR'),'1');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('24242424A','María','Gutiérrez','Logroño','Avda. de la Paz','18','941181818',to_date('10/10/64','DD/MM/RR'),'0');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('25252525A','Rosario','Díaz','Logroño','Percebe','19','941191919',to_date('11/11/71','DD/MM/RR'),'0');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('26262626A','Elena','González','Logroño','Percebe','20','941202020',to_date('05/05/75','DD/MM/RR'),'0');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('30303030B','Pedro','Del Río','Zamora','Antequera','89','967653424',to_date('18/12/68','DD/MM/RR'),'1');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('32456245H','Gustavo','Pérez','Valencia','Numancia','234','947676576',to_date('25/04/79','DD/MM/RR'),'1');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('37634764E','Mariano','Rodriguez','Madrid','Sal','56','917334653',to_date('23/05/78','DD/MM/RR'),'1');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('41515151C','Eduardo','Rodriguez','Valladolid','Roquera','67','956666666',to_date('14/06/75','DD/MM/RR'),'1');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('42456487E','Rita','Cantora','Soria','Robles','67','956433423',to_date('24/11/69','DD/MM/RR'),'0');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('44212123J','Paloma','Morales','Madrid','Gotan','34','917636436',to_date('12/12/84','DD/MM/RR'),'0');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('50101010D','María','Sanz','Malaga','Ronda','8','956454545',to_date('13/05/67','DD/MM/RR'),'0');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('54343433T','Alfonso','Cuevas','Valencia','Valencia','45','937845754',to_date('18/07/68','DD/MM/RR'),'1');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('57632786G','Susana','Moral','Guadalajara','Gran Vía','35','915762646',to_date('17/08/75','DD/MM/RR'),'0');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('63256769H','José','Dorado','Sevilla','Al Andalus','27','945685548',to_date('12/04/78','DD/MM/RR'),'1');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('63456432G','Esther','Barahona','Valencia','Valencia','123','935476548',to_date('24/06/79','DD/MM/RR'),'0');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('64329354E','Cristina','Santos','Madrid','Evaristo','1','912376475',to_date('18/10/67','DD/MM/RR'),'0');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('64423568C','Rocío','García','Madrid','Plaza de España','89','912347890',to_date('12/10/72','DD/MM/RR'),'0');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('76347852I','Marta','Canton','Huelva','Flor','56','967764435',to_date('25/04/78','DD/MM/RR'),'0');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('76453435G','Joaquín','Carmona','Valencia','Caracas','12','937634566',to_date('17/04/75','DD/MM/RR'),'1');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('76529637F','Rodolfo','Sanz','Madrid','Monasterio','88','915643258',to_date('15/12/80','DD/MM/RR'),'1');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('76666436D','Gerardo','Prado','Madrid','Del Olmo','145','917643643',to_date('15/06/67','DD/MM/RR'),'1');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('84545680F','Daniel','Chavero','Madrid','jázmin','34','917664764',to_date('23/06/67','DD/MM/RR'),'1');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('86546543R','Rufino','Mellado','Sevilla','Rufino','45','948765676',to_date('16/04/76','DD/MM/RR'),'1');
Insert into PERSONA (DNI,NOMBRE,APELLIDO,CIUDAD,DIRECCIONCALLE,DIRECCIONNUM,TELEFONO,FECHANACIMIENTO,VARON) values ('86876755F','Clara','Estévez','Madrid','Barco','34','919536754',to_date('23/03/67','DD/MM/RR'),'0');

Insert into PROFESOR (IDPROFESOR,DNI) values ('P101','19191919A');
Insert into PROFESOR (IDPROFESOR,DNI) values ('P102','10210210B');
Insert into PROFESOR (IDPROFESOR,DNI) values ('P117','25252525A');
Insert into PROFESOR (IDPROFESOR,DNI) values ('P202','20220220B');
Insert into PROFESOR (IDPROFESOR,DNI) values ('P203','23232323A');
Insert into PROFESOR (IDPROFESOR,DNI) values ('P204','26262626A');
Insert into PROFESOR (IDPROFESOR,DNI) values ('P303','30303030B');
Insert into PROFESOR (IDPROFESOR,DNI) values ('P304','24242424A');
Insert into PROFESOR (IDPROFESOR,DNI) values ('P415','41515151C');
Insert into PROFESOR (IDPROFESOR,DNI) values ('P500','50101010D');
Insert into PROFESOR (IDPROFESOR,DNI) values ('P600','37634764E');
Insert into PROFESOR (IDPROFESOR,DNI) values ('P777','86876755F');
Insert into PROFESOR (IDPROFESOR,DNI) values ('P888','63256769H');
Insert into PROFESOR (IDPROFESOR,DNI) values ('P999','76347852I');

Insert into ALUMNO (IDALUMNO,DNI) values ('A010101','21212121A');
Insert into ALUMNO (IDALUMNO,DNI) values ('A020202','18181818A');
Insert into ALUMNO (IDALUMNO,DNI) values ('A030303','20202020A');
Insert into ALUMNO (IDALUMNO,DNI) values ('A040404','26262626A');
Insert into ALUMNO (IDALUMNO,DNI) values ('A050505','12456789B');
Insert into ALUMNO (IDALUMNO,DNI) values ('A060606','64423568C');
Insert into ALUMNO (IDALUMNO,DNI) values ('A070707','42456487E');
Insert into ALUMNO (IDALUMNO,DNI) values ('A080808','76529637F');
Insert into ALUMNO (IDALUMNO,DNI) values ('A090909','64329354E');
Insert into ALUMNO (IDALUMNO,DNI) values ('A101010','02852373F');
Insert into ALUMNO (IDALUMNO,DNI) values ('A121212','16161616A');
Insert into ALUMNO (IDALUMNO,DNI) values ('A122143','21123124R');
Insert into ALUMNO (IDALUMNO,DNI) values ('A131313','17171717A');
Insert into ALUMNO (IDALUMNO,DNI) values ('A232358','07634664I');
Insert into ALUMNO (IDALUMNO,DNI) values ('A256346','32456245H');
Insert into ALUMNO (IDALUMNO,DNI) values ('A344746','76453435G');
Insert into ALUMNO (IDALUMNO,DNI) values ('A444378','57632786G');
Insert into ALUMNO (IDALUMNO,DNI) values ('A465665','44212123J');
Insert into ALUMNO (IDALUMNO,DNI) values ('A653344','86546543R');
Insert into ALUMNO (IDALUMNO,DNI) values ('A654455','84545680F');
Insert into ALUMNO (IDALUMNO,DNI) values ('A747647','63456432G');
Insert into ALUMNO (IDALUMNO,DNI) values ('A754576','76666436D');
Insert into ALUMNO (IDALUMNO,DNI) values ('A796476','54343433T');
Insert into ALUMNO (IDALUMNO,DNI) values ('A834532','12354123T');

Insert into TITULACION (IDTITULACION,NOMBRE) values ('100007','Físicas');
Insert into TITULACION (IDTITULACION,NOMBRE) values ('100011','Políticas');
Insert into TITULACION (IDTITULACION,NOMBRE) values ('100042','Dirección de empresas');
Insert into TITULACION (IDTITULACION,NOMBRE) values ('100043','Economía');
Insert into TITULACION (IDTITULACION,NOMBRE) values ('110010','Ingeniería Industrial');
Insert into TITULACION (IDTITULACION,NOMBRE) values ('110052','Ingeniero Industrial');
Insert into TITULACION (IDTITULACION,NOMBRE) values ('110053','Informática Sistemas');
Insert into TITULACION (IDTITULACION,NOMBRE) values ('110054','Informática Gestión');
Insert into TITULACION (IDTITULACION,NOMBRE) values ('110055','Ingeniero en Informática');
Insert into TITULACION (IDTITULACION,NOMBRE) values ('120001','Derecho');
Insert into TITULACION (IDTITULACION,NOMBRE) values ('130043','Educación social');
Insert into TITULACION (IDTITULACION,NOMBRE) values ('130047','Psicología');
Insert into TITULACION (IDTITULACION,NOMBRE) values ('130048','Pedagogía');
Insert into TITULACION (IDTITULACION,NOMBRE) values ('130049','Psicopedagogía');
Insert into TITULACION (IDTITULACION,NOMBRE) values ('130061','Trabajo Social');
Insert into TITULACION (IDTITULACION,NOMBRE) values ('130110','Matemáticas');
Insert into TITULACION (IDTITULACION,NOMBRE) values ('140034','Filosofía');
Insert into TITULACION (IDTITULACION,NOMBRE) values ('140044','Historia');
Insert into TITULACION (IDTITULACION,NOMBRE) values ('140045','Filología Hispánica');
Insert into TITULACION (IDTITULACION,NOMBRE) values ('140046','Filología Inglesa');
Insert into TITULACION (IDTITULACION,NOMBRE) values ('150210','Químicas');
Insert into TITULACION (IDTITULACION,NOMBRE) values ('160000','Empresariales');
Insert into TITULACION (IDTITULACION,NOMBRE) values ('170056','Turismo');

Insert into ASIGNATURA (IDASIGNATURA,NOMBRE,CREDITOS,CUATRIMESTRE,COSTEBASICO,IDPROFESOR,IDTITULACION,CURSO) values ('000115','Seguridad Vial',                                     '4,5','1','30','P204','170056','1');
Insert into ASIGNATURA (IDASIGNATURA,NOMBRE,CREDITOS,CUATRIMESTRE,COSTEBASICO,IDPROFESOR,IDTITULACION,CURSO) values ('076767','Ampliación de informática gráfica',                  '6','1','658,89','P500','110053','4');
Insert into ASIGNATURA (IDASIGNATURA,NOMBRE,CREDITOS,CUATRIMESTRE,COSTEBASICO,IDPROFESOR,IDTITULACION,CURSO) values ('097343','Algoritmos paralelos',                               '6','1','78','P500','110054','3');
Insert into ASIGNATURA (IDASIGNATURA,NOMBRE,CREDITOS,CUATRIMESTRE,COSTEBASICO,IDPROFESOR,IDTITULACION,CURSO) values ('123536','Ampliación de estructura de computadores',           '4,5','2','68,89','P600','110054','3');
Insert into ASIGNATURA (IDASIGNATURA,NOMBRE,CREDITOS,CUATRIMESTRE,COSTEBASICO,IDPROFESOR,IDTITULACION,CURSO) values ('130113','Programación I',                                     '9','1','60','P101','130110','1');
Insert into ASIGNATURA (IDASIGNATURA,NOMBRE,CREDITOS,CUATRIMESTRE,COSTEBASICO,IDPROFESOR,IDTITULACION,CURSO) values ('130122','Análisis II',                                        '9','2','60','P203','130110','2');
Insert into ASIGNATURA (IDASIGNATURA,NOMBRE,CREDITOS,CUATRIMESTRE,COSTEBASICO,IDPROFESOR,IDTITULACION,CURSO) values ('150212','Química Física',                                     '4,5','2','70','P304','150210','1');
Insert into ASIGNATURA (IDASIGNATURA,NOMBRE,CREDITOS,CUATRIMESTRE,COSTEBASICO,IDPROFESOR,IDTITULACION,CURSO) values ('160002','Contabilidad',                                       '6','1','70','P117','160000','1');
Insert into ASIGNATURA (IDASIGNATURA,NOMBRE,CREDITOS,CUATRIMESTRE,COSTEBASICO,IDPROFESOR,IDTITULACION,CURSO) values ('213123','Automatización industrial',                          '6','2','78,89','P303','110052','2');
Insert into ASIGNATURA (IDASIGNATURA,NOMBRE,CREDITOS,CUATRIMESTRE,COSTEBASICO,IDPROFESOR,IDTITULACION,CURSO) values ('232325','Ampliación de redes',                                '6','1','78,9','P888','110054','3');
Insert into ASIGNATURA (IDASIGNATURA,NOMBRE,CREDITOS,CUATRIMESTRE,COSTEBASICO,IDPROFESOR,IDTITULACION,CURSO) values ('323336','Algoritmos y estructuras de datos II',               '4,5','2','45,67','P500','110053','3');
Insert into ASIGNATURA (IDASIGNATURA,NOMBRE,CREDITOS,CUATRIMESTRE,COSTEBASICO,IDPROFESOR,IDTITULACION,CURSO) values ('324234','Aplicaciones específicas de red',                    '4,5','1','67,67','P888','110054','3');
Insert into ASIGNATURA (IDASIGNATURA,NOMBRE,CREDITOS,CUATRIMESTRE,COSTEBASICO,IDPROFESOR,IDTITULACION,CURSO) values ('455457','Álgebra',                                            '4,5','1','78','P415','110054','2');
Insert into ASIGNATURA (IDASIGNATURA,NOMBRE,CREDITOS,CUATRIMESTRE,COSTEBASICO,IDPROFESOR,IDTITULACION,CURSO) values ('484847','Ampliación de arquitectura de computadores',         '9','2','45,89','P600','110053','3');
Insert into ASIGNATURA (IDASIGNATURA,NOMBRE,CREDITOS,CUATRIMESTRE,COSTEBASICO,IDPROFESOR,IDTITULACION,CURSO) values ('634437','Administración avanzada de sistemas informáticos',   '9','1','110,89','P415','110054','3');
Insert into ASIGNATURA (IDASIGNATURA,NOMBRE,CREDITOS,CUATRIMESTRE,COSTEBASICO,IDPROFESOR,IDTITULACION,CURSO) values ('765376','Antecedentes y evolución de la informática',         '6','2','87,56','P202','110054','2');
Insert into ASIGNATURA (IDASIGNATURA,NOMBRE,CREDITOS,CUATRIMESTRE,COSTEBASICO,IDPROFESOR,IDTITULACION,CURSO) values ('786476','Análisis de datos',                                  '9','2','76,89','P999','110055','2');
Insert into ASIGNATURA (IDASIGNATURA,NOMBRE,CREDITOS,CUATRIMESTRE,COSTEBASICO,IDPROFESOR,IDTITULACION,CURSO) values ('856557','Algoritmos y estructuras de datos I',                '9','2','67','P500','110053','2');
Insert into ASIGNATURA (IDASIGNATURA,NOMBRE,CREDITOS,CUATRIMESTRE,COSTEBASICO,IDPROFESOR,IDTITULACION,CURSO) values ('872464','Ampliación de electrónica',                          '6','1','56,09','P203','110052','2');
Insert into ASIGNATURA (IDASIGNATURA,NOMBRE,CREDITOS,CUATRIMESTRE,COSTEBASICO,IDPROFESOR,IDTITULACION,CURSO) values ('896476','Arquitecturas avanzadas',                            '9','2','34,89','P600','110055','3');
Insert into ASIGNATURA (IDASIGNATURA,NOMBRE,CREDITOS,CUATRIMESTRE,COSTEBASICO,IDPROFESOR,IDTITULACION,CURSO) values ('897478','Ampliación de inteligencia artificial',              '9','2','56,89','P600','110055','4');
Insert into ASIGNATURA (IDASIGNATURA,NOMBRE,CREDITOS,CUATRIMESTRE,COSTEBASICO,IDPROFESOR,IDTITULACION,CURSO) values ('976677','Análisis matemático',                                '6','2','764,89','P203','130110','3');
Insert into ASIGNATURA (IDASIGNATURA,NOMBRE,CREDITOS,CUATRIMESTRE,COSTEBASICO,IDPROFESOR,IDTITULACION,CURSO) values ('986796','Arquitectura e Ingenieria de los computadores',      '6','2','45,89','P600','110055','3');

Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A010101','150212','1');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A020202','130113','1');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A020202','150212','2');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A030303','130113','3');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A030303','130122','2');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A030303','150212','1');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A040404','130122','1');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A121212','000115','1');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A122143','130113','1');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A122143','130122','2');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A122143','976677','3');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A131313','160002','4');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A232358','076767','3');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A232358','323336','2');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A232358','856557','1');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A256346','786476','2');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A256346','896476','4');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A256346','897478','1');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A256346','986796','3');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A344746','213123','2');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A344746','872464','1');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A444378','097343','3');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A444378','123536','4');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A444378','232325','5');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A444378','324234','5');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A444378','455457','2');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A444378','634437','1');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A444378','765376','5');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A465665','786476','2');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A465665','896476','4');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A465665','897478','1');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A465665','986796','3');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A653344','213123','2');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A653344','872464','1');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A654455','097343','3');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A654455','123536','4');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A654455','455457','2');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A654455','634437','1');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A747647','213123','2');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A747647','872464','1');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A754576','130113','1');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A754576','130122','2');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A754576','976677','3');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A796476','130113','1');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A796476','130122','2');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A796476','976677','3');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A834532','213123','2');
Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A834532','872464','1');

COMMIT;

I have created an object type, called 'AsignaturaObj ', that maps rows from the table 'Asignatura' and I would like to know if it is possible to insert objects into the table without having to specify all its attributes:

SET SERVEROUTPUT ON

declare
  contador pls_integer;
begin -- tengo que borrar antiguas dependencias entre objetos para poder recrear los míos
  select count(*) into contador from user_objects where object_name=upper('TablaAsignatura');
  if contador = 1 then
    execute immediate 'drop type TablaAsignatura';
  end if;
  select count(*) into contador from user_objects where object_name=upper('AsignaturaObj');
  if contador = 1 then
    execute immediate 'drop type AsignaturaObj';
  end if;
end;
/

CREATE TYPE AsignaturaObj AS OBJECT(
  idAsignatura    varchar2(6),
  nombre          varchar2(50),
  curso           number(1,0), -- en el original curso y cuatrimestre son varchar2, lo he cambiado por probar
  cuatrimestre    number(1,0),
  créditos        number(3,1),
  coste           number(6,2), -- no necesitamos un número de 16 dígitos como en el original
  idProfesor      varchar2(4),
  idTitulación    varchar2(6)
);
/

CREATE OR REPLACE TYPE TablaAsignatura AS TABLE OF AsignaturaObj;
/

declare
  conjuntoAsignaturas tablaAsignatura := TablaAsignatura();
  miAsignatura        AsignaturaObj;
begin
  conjuntoAsignaturas.extend(3);
  conjuntoAsignaturas(1) := asignaturaObj('222222', 'Pulpos', 2, 1, '4,5', 120, 'Q000', '111111');
  conjuntoAsignaturas(2) := asignaturaObj('222223', 'Pólipos', 2, 1, '3', 80, 'Q000', '222222');
  conjuntoAsignaturas(3) := asignaturaObj('130114', 'Programación II', 2, 1, '9', 80, 'P101', '130110');
  miAsignatura := asignaturaObj('130114', 'Programación II', 2, 1, '9', 80, 'P101', '130110');

  -- THIS WORKS OBVIOUSLY
  insert into asignatura(idAsignatura, nombre, curso, cuatrimestre, creditos, costebasico, idProfesor, idTitulacion)
    values ('130114', 'Programación II', 2, 1, '9', 80, 'P101', '130110'); 

  -- THIS WORKS TOO, BUT IT'S NOT VERY COMFORTABLE TO SPECIFY "OBJECTNAME DOT ATTRIBUTE", NOT ONLY COS THE NUMBER OF ATTRIBUTES CAN BE HIGH BUT ALSO THINK ABOUT USING ANOTHER OBJECT
  insert into asignatura(idAsignatura, nombre, curso, cuatrimestre, creditos, costebasico, idProfesor, idTitulacion)
    values (miAsignatura.idAsignatura, miAsignatura.nombre, miAsignatura.curso, miAsignatura.cuatrimestre, miAsignatura.créditos, miAsignatura.coste, miAsignatura.idProfesor, miAsignatura.idTitulación);*/

  -- BUT THIS DOES NOT :(
  insert into asignatura(idAsignatura, nombre, curso, cuatrimestre, creditos, costebasico, idProfesor, idTitulacion)
    values (miAsignatura.*);

end;
/

--select * from asignatura where idtitulacion = '130110';

rollback;

Please do note that the the order and name of the object fields is not exactly the same as in the table e.g. AsignaturaObj.idTitulación (with accent) and asignatura.idTitulacion.

The following code is in relation with @Alex-Poole's comment on his own answer about what my motivation was for using FORALL.

declare
  conjuntoAsignaturas tablaAsignatura := TablaAsignatura();
begin
  conjuntoAsignaturas.extend(4);
  conjuntoAsignaturas(1) := asignaturaObj('130114', 'Programación II', 2, 1, '9', 80, 'P101', '130110');
  conjuntoAsignaturas(2) := asignaturaObj('222222', 'Teoría de Compiladores', 2, 1, '4,5', 120, 'Q000', '130110');
  conjuntoAsignaturas(3) := asignaturaObj('222223', 'Pólipos', 2, 1, '3', 80, 'P101', '222222');

  DECLARE
    l_error_count  NUMBER; 
    ex_dml_errors EXCEPTION;
    PRAGMA EXCEPTION_INIT(ex_dml_errors, -24381);
  BEGIN
  forall i in 1 .. conjuntoAsignaturas.count SAVE EXCEPTIONS
    insert into asignatura(idAsignatura, nombre, curso, cuatrimestre, creditos, costebasico, idProfesor, idTitulacion)
      values (TREAT(conjuntoAsignaturas(i) AS AsignaturaObj).idAsignatura,  TREAT(conjuntoAsignaturas(i) AS AsignaturaObj).nombre, 
              TREAT(conjuntoAsignaturas(i) AS AsignaturaObj).curso,         TREAT(conjuntoAsignaturas(i) AS AsignaturaObj).cuatrimestre,  
              TREAT(conjuntoAsignaturas(i) AS AsignaturaObj).créditos,      TREAT(conjuntoAsignaturas(i) AS AsignaturaObj).coste, 
              TREAT(conjuntoAsignaturas(i) AS AsignaturaObj).idProfesor,    TREAT(conjuntoAsignaturas(i) AS AsignaturaObj).idTitulación);
  EXCEPTION
    WHEN ex_dml_errors THEN
      l_error_count := SQL%BULK_EXCEPTIONS.count;
      DBMS_OUTPUT.put_line('Número de errores: ' || l_error_count);
      FOR i IN 1 .. l_error_count LOOP
        DBMS_OUTPUT.put_line('Error: ' || i || 
          ' Índice de error: ' || SQL%BULK_EXCEPTIONS(i).error_index ||
          ' Mensaje: ' || SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE));
      END LOOP;
  END;
end;
/
4
  • I have voted up because you have posted a test case. Nice. Commented Apr 30, 2015 at 12:59
  • Can you use %rowtype instead of object? If yes, it is probably duplicate of stackoverflow.com/questions/13866915/… Commented Apr 30, 2015 at 14:27
  • @Dmitry - it's similar, but the object aspect of this question makes it different enough to not be a duplicate, I think. Commented Apr 30, 2015 at 14:30
  • Exactly, I already saw the post indicated by @Dmitry. However the purpose is using objects, which is not present in the other post. Commented Apr 30, 2015 at 15:00

2 Answers 2

3

You can't avoid referring to the attributes somewhere, but you could hide them within the object.

One option is to have a member function that returns the attribute values in the order they appear in the table, using a ref cursor:

CREATE TYPE AsignaturaObj AS OBJECT(
...
  MEMBER FUNCTION attrsAsCols RETURN sys_refcursor
);
/

CREATE OR REPLACE TYPE BODY AsignaturaObj AS 
  MEMBER FUNCTION attrsAsCols RETURN sys_refcursor IS
    temp_rc sys_refcursor;
  BEGIN
    OPEN temp_rc FOR
      SELECT SELF.idAsignatura, SELF.nombre, SELF.créditos, SELF.cuatrimestre,
        SELF.coste, SELF.idProfesor, SELF.idTitulación, SELF.curso
      FROM DUAL;
    RETURN temp_rc;
  END attrsAsCols;
END;
/

Then in your anonymous block fetch that ref cursor into a rowtype variable and use that for the insert:

declare
  temp_row asignatura%rowtype;
  temp_rc sys_refcursor;
...
begin
...
  temp_rc := conjuntoAsignaturas(3).attrsAsCols;
  fetch temp_rc into temp_row;

  insert into asignatura
  values temp_row;
end;
/

anonymous block completed

select * from asignatura where idtitulacion = '130110';

IDASIGNATURA NOMBRE                                               CREDITOS CUATRIMESTRE COSTEBASICO IDPROFESOR IDTITULACION CURSO
------------ -------------------------------------------------- ---------- ------------ ----------- ---------- ------------ -----
130113       Programación I                                              9 1                     60 P101       130110       1    
130122       Análisis II                                                 9 2                     60 P203       130110       2    
976677       Análisis matemático                                         6 2                 764,89 P203       130110       3    
130114       Programación II                                             9 1                     80 P101       130110       2    

Of course that relies on your object putting the attributes in the right order for your table definition, and it makes the object more complicated; but sort of simplifies the insert.

Another option is to encapsulate the insert operation in a member procedure:

CREATE TYPE AsignaturaObj AS OBJECT(
...
  MEMBER PROCEDURE doInsert
);
/

CREATE OR REPLACE TYPE BODY AsignaturaObj AS 
  MEMBER PROCEDURE doInsert IS
  BEGIN
    insert into asignatura(idAsignatura, nombre, curso, cuatrimestre,
      creditos, costebasico, idProfesor, idTitulacion)
    values (SELF.idAsignatura, SELF.nombre, SELF.curso, SELF.cuatrimestre,
      SELF.créditos, SELF.coste, SELF.idProfesor, SELF.idTitulación);
  END doInsert;
END;
/

And then your insert becomes just:

declare
...
  conjuntoAsignaturas(3).doInsert;
end;
/

anonymous block completed

select * from asignatura where idtitulacion = '130110';

IDASIGNATURA NOMBRE                                               CREDITOS CUATRIMESTRE COSTEBASICO IDPROFESOR IDTITULACION CURSO
------------ -------------------------------------------------- ---------- ------------ ----------- ---------- ------------ -----
130113       Programación I                                              9 1                     60 P101       130110       1    
130122       Análisis II                                                 9 2                     60 P203       130110       2    
976677       Análisis matemático                                         6 2                 764,89 P203       130110       3    
130114       Programación II                                             9 1                     80 P101       130110       2    

Which means the object still relies on the table existing, if not on the column order.

Sign up to request clarification or add additional context in comments.

7 Comments

Thanks a lot for your answer. However, although in a normal context this solutions will work, if you want to do the inserts with FORALL (and avoid the pls-00436), how would you do it?
I was thinking of inserting into the table 'Asignatura' a collection of objects 'AsignaturaObj' inside a 'TablaAsignatura' table with the FORALL.
@Álvaro - yes, it isn't terribly flexible, and not necessarily efficient; I don't think you can use bulk binding (as with forall). You can do the inserts in a normal for loop with either approach though. Or use a normal loop to populate a local table of PL/SQL records and then use that with forall, but that's a bit messy. Or list the attributes in a normal insert inside the forall, but that's what you're trying to avoid. Oh.. PLS-00436, right, I hadn't noticed you were still on 10g, that isn't an issue in 11g.
@Álvaro - I'd avoided asking what your motivation was, but is your original question really about PLS-00436 and using forall? If so does the treat trick work for you; forall i in ... insert (idAsignatura, ...) values (treat(conjuntoAsignaturas(i) as AsignaturaObj).idAsignatura, ...) ? I don't have a 10g instance to play with this at the moment.
I have added new code on my original post. In fact the real question behind this post was how to achieve that forall in a more elegant and simple way not having to especify all atributes. I'm sorry that new piece of code is so short, but stackoverflow has a limit on the characters per post.
|
0

I don't know if this answers a part of you question, or maybe it is something you could make use of.

But in you example, I see you use a lot of:

Insert into ALUMNO_ASIGNATURA (IDALUMNO,IDASIGNATURA,NUMEROMATRICULA) values ('A444378','232325','5');

Maybe it would be an idea to write a procedure for it that will insert data in the table, so that you don't have to call all columns every time.

For example: (I don't have a database by hand, so i hope this gives no errors, but it will give you an idea.)

CREATE OR REPLACE PROCEDURE addAlumnoAsignature(columnOne IN VARCHAR2, 
                        columnTwo IN VARCHAR2) 
AS
BEGIN
        INSERT INTO AlumnoAsignature(columOneName, columnTwoName)
        VALUES(columnOne, columnTwo)
END;
/

If you want to insert something in the table you only have to call the procedure.
For example:

addAlumnoAsignature('A444378', '232325')

I believe you also could make sure some value goes to a certain input part:
But again, I don't have a database by hand, so it might give you more of an idea. :-)

addAlumnoAsignature(columnOne => 'A444378', columnTwo => '232325')

If you drop the table more often, you would like to restore the data in the table.
You can make a file with:

BEGIN
       addAlumnoAsignature('A444378', '232325')
END;
/

So you just have to run that file to input all the data in the table again.

If you would like it when you input something in tableA, and you want the info to also inserted/updated in tableB you could make use of a Trigger. Put a Trigger on tableA that activates when an INSERT or UPDATE has taken place.

You could make the Trigger that it extracts the data from TableA, and gives that to a procedure that will store in in table B.

2 Comments

I don't think this addresses the object aspect really, and you'd either have to pass the object to the procedure, or still list all the object attributes out in the procedure cal (or the insert procedure could be a member procedure in the object type); and doesn't help with the forall aspect?
Alex is right. The solution should be a one and elegant line so that the Oracle DB does all the mapping of the attributes beneath automatically. Maybe the problem lies in that what I wanted is a yet unimplemented feature in Oracle :( ¿do you know how to indicate Oracle to implement a certain feature?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.