oracle - Update of nested table -
i have following objects , nested tables
set serveroutput on declare contador pls_integer; begin select count(*) contador user_objects object_name=upper('matriculación'); if contador = 1 execute immediate 'drop table matriculación'; end if; select count(*) contador user_objects object_name=upper('matrícula'); if contador = 1 execute immediate 'drop table matrícula'; end if; select count(*) contador user_objects object_name=upper('alumnoobj'); if contador = 1 execute immediate 'drop type alumnoobj'; end if; select count(*) contador user_objects object_name=upper('tablatitulación'); if contador = 1 execute immediate 'drop type tablatitulación'; end if; select count(*) contador user_objects object_name=upper('titulaciónobj'); if contador = 1 execute immediate 'drop type titulaciónobj'; end if; select count(*) contador user_objects object_name=upper('tablaasignatura'); if contador = 1 execute immediate 'drop type tablaasignatura'; end if; select count(*) contador user_objects object_name=upper('asignaturaobj'); if contador = 1 execute immediate 'drop type asignaturaobj'; end if; end; / create type asignaturaobj object( idasignatura varchar2(6), nombre varchar2(50), curso number(1,0), -- en el original curso y cuatrimestre son varchar2, lo 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) ); / create or replace type tablaasignatura table of asignaturaobj; / show errors create type titulaciónobj object( idtitulación varchar2(6), nombre varchar2(30), asignaturas tablaasignatura ) ;--nested table asignaturas store asignatura_tabla return value; -- esto no / create or replace type tablatitulación table of titulaciónobj; / create type alumnoobj object( dni varchar2(9), idalumno varchar2(7), nombre varchar2(20), apellido varchar2(30), dirección varchar2(35), -- calle {coma espacio} número --> 30+2+3=35 ciudad varchar2(20), teléfono varchar2(9) ); / -- el objetivo es guardar una tabla que contenga por cada alumno cada titulación en la que esté, y por cada titulación las asignaturas en las que está matriculado -- nota: en este nuevo ejemplo por cada alumno se crea una nueva entrada (fila), cada fila contendrá una o varias titulaciones y su vez cada titulación una o varias asignaturas create table matriculación ( num_matrícula number(5,0) constraint matriculación_pk primary key, alumno alumnoobj constraint matriculación_alumno_nn not null, titulación tablatitulación ) nested table titulación store titulaciones_tabla (nested table asignaturas store asignatura_tabla);
with data:
insert matriculaciÓn (num_matrÍcula,alumno,titulaciÓn) values (1,alumnoobj('12345678a','a000000','juan','pérez quintanilla','calle quintana, 23','madrid','913217712'),tablatitulaciÓn(titulaciÓnobj('111111','ciencias del mar',tablaasignatura(asignaturaobj('222222','pulpos',2,1,4.5,120,'q000'),asignaturaobj('222223','pólipos',2,1,3,80,'q000'))),titulaciÓnobj('222222','geología',tablaasignatura(asignaturaobj('922222','cuevas',2,1,4.5,120,'q900'),asignaturaobj('922223','resistencia de materiales',2,1,10,80,'q900'))))); insert matriculaciÓn (num_matrÍcula,alumno,titulaciÓn) values (2,alumnoobj('21212121a','a010101','rosa','garcía','alegría, 16','haro','941161616'),tablatitulaciÓn(titulaciÓnobj('150210','químicas',tablaasignatura(asignaturaobj('150212','química física',1,2,4.5,70,'p304'))))); insert matriculaciÓn (num_matrÍcula,alumno,titulaciÓn) values (3,alumnoobj('18181818a','a020202','pepe','pérez','percebe, 13','madrid','913131313'),tablatitulaciÓn(titulaciÓnobj('130110','matemáticas',tablaasignatura(asignaturaobj('130113','programación i',1,1,9,60,'p101'))),titulaciÓnobj('150210','químicas',tablaasignatura(asignaturaobj('150212','química física',1,2,4.5,70,'p304'))))); insert matriculaciÓn (num_matrÍcula,alumno,titulaciÓn) values (4,alumnoobj('20202020a','a030303','luis','jiménez','cigüeña, 15','nájera','941151515'),tablatitulaciÓn(titulaciÓnobj('130110','matemáticas',tablaasignatura(asignaturaobj('130122','análisis ii',2,2,9,60,'p203'),asignaturaobj('130113','programación i',1,1,9,60,'p101'))),titulaciÓnobj('150210','químicas',tablaasignatura(asignaturaobj('150212','química física',1,2,4.5,70,'p304'))))); insert matriculaciÓn (num_matrÍcula,alumno,titulaciÓn) values (5,alumnoobj('26262626a','a040404','elena','gonzález','percebe, 20','logroño','941202020'),tablatitulaciÓn(titulaciÓnobj('130110','matemáticas',tablaasignatura(asignaturaobj('130122','análisis ii',2,2,9,60,'p203'))))); insert matriculaciÓn (num_matrÍcula,alumno,titulaciÓn) values (6,alumnoobj('16161616a','a121212','luis','ramírez','pez, 34','haro','941111111'),tablatitulaciÓn(titulaciÓnobj('170056','turismo',tablaasignatura(asignaturaobj('000115','seguridad vial',1,1,4.5,30,'p204'))))); insert matriculaciÓn (num_matrÍcula,alumno,titulaciÓn) values (7,alumnoobj('21123124r','a122143','javier','maganto','fax, 23','madrid','917643653'),tablatitulaciÓn(titulaciÓnobj('130110','matemáticas',tablaasignatura(asignaturaobj('130122','análisis ii',2,2,9,60,'p203'),asignaturaobj('130113','programación i',1,1,9,60,'p101'),asignaturaobj('976677','análisis matemático',3,2,6,764.89,'p203'))))); insert matriculaciÓn (num_matrÍcula,alumno,titulaciÓn) values (8,alumnoobj('17171717a','a131313','laura','beltrán','gran vía, 23','madrid','912121212'),tablatitulaciÓn(titulaciÓnobj('160000','empresariales',tablaasignatura(asignaturaobj('160002','contabilidad',1,1,6,70,'p117'))))); insert matriculaciÓn (num_matrÍcula,alumno,titulaciÓn) values (9,alumnoobj('07634664i','a232358','benito','encinas','polar, 67','madrid','916436467'),tablatitulaciÓn(titulaciÓnobj('110053','informática sistemas',tablaasignatura(asignaturaobj('856557','algoritmos y estructuras de datos i',2,2,9,67,'p500'),asignaturaobj('076767','ampliación de informática gráfica',4,1,6,658.89,'p500'),asignaturaobj('323336','algoritmos y estructuras de datos ii',3,2,4.5,45.67,'p500'))))); insert matriculaciÓn (num_matrÍcula,alumno,titulaciÓn) values (10,alumnoobj('32456245h','a256346','gustavo','pérez','numancia, 234','valencia','947676576'),tablatitulaciÓn(titulaciÓnobj('110055','ingeniero en informática',tablaasignatura(asignaturaobj('897478','ampliación de inteligencia artificial',4,2,9,56.89,'p600'),asignaturaobj('896476','arquitecturas avanzadas',3,2,9,34.89,'p600'),asignaturaobj('786476','análisis de datos',2,2,9,76.89,'p999'),asignaturaobj('986796','arquitectura e ingenieria de los computadores',3,2,6,45.89,'p600'))))); insert matriculaciÓn (num_matrÍcula,alumno,titulaciÓn) values (11,alumnoobj('76453435g','a344746','joaquín','carmona','caracas, 12','valencia','937634566'),tablatitulaciÓn(titulaciÓnobj('110052','ingeniero industrial',tablaasignatura(asignaturaobj('213123','automatización industrial',2,2,6,78.89,'p303'),asignaturaobj('872464','ampliación de electrónica',2,1,6,56.09,'p203'))))); insert matriculaciÓn (num_matrÍcula,alumno,titulaciÓn) values (12,alumnoobj('57632786g','a444378','susana','moral','gran vía, 35','guadalajara','915762646'),tablatitulaciÓn(titulaciÓnobj('110054','informática gestión',tablaasignatura(asignaturaobj('123536','ampliación de estructura de computadores',3,2,4.5,68.89,'p600'),asignaturaobj('765376','antecedentes y evolución de la informática',2,2,6,87.56,'p202'),asignaturaobj('634437','administración avanzada de sistemas informáticos',3,1,9,110.89,'p415'),asignaturaobj('232325','ampliación de redes',3,1,6,78.9,'p888'),asignaturaobj('324234','aplicaciones específicas de red',3,1,4.5,67.67,'p888'),asignaturaobj('097343','algoritmos paralelos',3,1,6,78,'p500'),asignaturaobj('455457','Álgebra',2,1,4.5,78,'p415'))))); insert matriculaciÓn (num_matrÍcula,alumno,titulaciÓn) values (13,alumnoobj('44212123j','a465665','paloma','morales','gotan, 34','madrid','917636436'),tablatitulaciÓn(titulaciÓnobj('110055','ingeniero en informática',tablaasignatura(asignaturaobj('986796','arquitectura e ingenieria de los computadores',3,2,6,45.89,'p600'),asignaturaobj('897478','ampliación de inteligencia artificial',4,2,9,56.89,'p600'),asignaturaobj('896476','arquitecturas avanzadas',3,2,9,34.89,'p600'),asignaturaobj('786476','análisis de datos',2,2,9,76.89,'p999'))))); insert matriculaciÓn (num_matrÍcula,alumno,titulaciÓn) values (14,alumnoobj('86546543r','a653344','rufino','mellado','rufino, 45','sevilla','948765676'),tablatitulaciÓn(titulaciÓnobj('110052','ingeniero industrial',tablaasignatura(asignaturaobj('872464','ampliación de electrónica',2,1,6,56.09,'p203'),asignaturaobj('213123','automatización industrial',2,2,6,78.89,'p303'))))); insert matriculaciÓn (num_matrÍcula,alumno,titulaciÓn) values (15,alumnoobj('84545680f','a654455','daniel','chavero','jázmin, 34','madrid','917664764'),tablatitulaciÓn(titulaciÓnobj('110054','informática gestión',tablaasignatura(asignaturaobj('123536','ampliación de estructura de computadores',3,2,4.5,68.89,'p600'),asignaturaobj('634437','administración avanzada de sistemas informáticos',3,1,9,110.89,'p415'),asignaturaobj('097343','algoritmos paralelos',3,1,6,78,'p500'),asignaturaobj('455457','Álgebra',2,1,4.5,78,'p415'))))); insert matriculaciÓn (num_matrÍcula,alumno,titulaciÓn) values (16,alumnoobj('63456432g','a747647','esther','barahona','valencia, 123','valencia','935476548'),tablatitulaciÓn(titulaciÓnobj('110052','ingeniero industrial',tablaasignatura(asignaturaobj('872464','ampliación de electrónica',2,1,6,56.09,'p203'),asignaturaobj('213123','automatización industrial',2,2,6,78.89,'p303'))))); insert matriculaciÓn (num_matrÍcula,alumno,titulaciÓn) values (17,alumnoobj('76666436d','a754576','gerardo','prado','del olmo, 145','madrid','917643643'),tablatitulaciÓn(titulaciÓnobj('130110','matemáticas',tablaasignatura(asignaturaobj('130113','programación i',1,1,9,60,'p101'),asignaturaobj('130122','análisis ii',2,2,9,60,'p203'),asignaturaobj('976677','análisis matemático',3,2,6,764.89,'p203'))))); insert matriculaciÓn (num_matrÍcula,alumno,titulaciÓn) values (18,alumnoobj('54343433t','a796476','alfonso','cuevas','valencia, 45','valencia','937845754'),tablatitulaciÓn(titulaciÓnobj('130110','matemáticas',tablaasignatura(asignaturaobj('976677','análisis matemático',3,2,6,764.89,'p203'),asignaturaobj('130122','análisis ii',2,2,9,60,'p203'),asignaturaobj('130113','programación i',1,1,9,60,'p101'))))); insert matriculaciÓn (num_matrÍcula,alumno,titulaciÓn) values (19,alumnoobj('12354123t','a834532','gregorio','llamas','ro, 67','sevilla','942133336'),tablatitulaciÓn(titulaciÓnobj('110052','ingeniero industrial',tablaasignatura(asignaturaobj('872464','ampliación de electrónica',2,1,6,56.09,'p203'),asignaturaobj('213123','automatización industrial',2,2,6,78.89,'p303')))));
1) how can update the field "titulación" (university degree) inside table "matriculación" (enrollment), of field "titulación" subfield "nombre" (name)? if try
update table(select titulación matriculación ) set nombre = 'aaa';
i error sql: ora-01427: "single-row subquery returns more 1 row"
there no other way use pl/sql?
2) same update of question 1, update "titulación"s have specific name.
this solution using pl/sql objective avoid it, use pure sql statements
declare type referencias_matrícula table of pls_integer; matrículas referencias_matrícula; type referencias_titulación table of varchar2(6); titulaciones referencias_titulación; begin select num_matrícula, titu.idtitulación bulk collect matrículas, titulaciones matriculación m, table(m.titulación) titu nombre = 'matemáticas'; índice in matrículas.first .. matrículas.last loop update table(select titulación matriculación num_matrícula = matrículas(índice)) set nombre = 'ingeniería de núm. perfectos' idtitulación = titulaciones(índice); end loop; end; /
i did not work nested tables much, worked me:
update /*+ nested_table_get_refs */ titulaciones_tabla -- <- storage table set nombre = 'aaa' nombre = 'matemáticas';
from site oracle sql hints:
nested_table_get_refs
usage: nested_table_get_refs
description: hint, user can access nested table directly.
you may interested in clauses return locator
, return value
.
Comments
Post a Comment