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

Popular posts from this blog

java - Custom OutputStreamAppender not run: LOGBACK: No context given for <MYAPPENDER> -

java - UML - How would you draw a try catch in a sequence diagram? -

c++ - No viable overloaded operator for references a map -