La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional.

Presentaciones similares


Presentación del tema: "Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional."— Transcripción de la presentación:

1 Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional

2 Métodos Son de dos tipos: Procedimientos Funciones - Los procedimientos y funciones se pueden invocar desde otros procedimientos o desde otras funciones. - Las funciones también se pueden invocar desde operaciones DML (pero los procedimientos no).

3 idlibro título cantidad precio_base imp_base género género LIBRO impuesto() descuento(tiquete) Atributos Métodos Sea

4 Ejemplo: Para determinar el precio final de un libro se considera un impuesto y un descuento. El impuesto se obtiene del precio base del libro así: (imp_base + 5%) si hay menos de 100 unidades del libro (imp_base + 10%) si hay más de 99 unidades del libro

5 El descuento se obtiene del precio base del libro a partir de un tiquete que el cliente puede presentar, así: Tiquete tipo 1 descuento del 5% Tiquete tipo 2 descuento del 7.5% Tiquete tipo 3 descuento del 10% Sin tiquete descuento del 0% Estos datos se guardan en una tabla así:

6 DROP TABLE dtiq; CREATE TABLE dtiq( cod NUMBER(1) PRIMARY KEY, val NUMBER(3,1) NOT NULL ); INSERT INTO dtiq VALUES(1, 5); INSERT INTO dtiq VALUES(2, 7.5); INSERT INTO dtiq VALUES(3, 10);

7 CREATE OR REPLACE TYPE libro_tip AS OBJECT( --Atributos idlibro idlibro NUMBER(5), titulo titulo VARCHAR2(30), cantidad cantidad NUMBER(4), precio_base precio_base NUMBER(6), imp_base imp_base NUMBER(3), genero genero VARCHAR2(20), --Métodos: MEMBER FUNCTION impuesto RETURN NUMBER, descuento MEMBER FUNCTION descuento (tiquete IN NUMBER) RETURN NUMBER ); / Notas: Los nombres de los métodos deben ser diferentes a los nombres de los atributos. Se permite sobrecarga de métodos y constructores de usuario, se ven más adelante

8 BODY CREATE OR REPLACE TYPE BODY libro_tip AS MEMBER FUNCTION impuesto RETURN NUMBER IS BEGIN IF cantidad < 100 THEN RETURN ((5 + imp_base) * precio_base)/100; ELSE RETURN ((10 + imp_base) * precio_base)/100; END IF; END impuesto ; Nota: El body continúa en la próxima diapositiva

9 descuento MEMBER FUNCTION descuento (tiquete IN NUMBER) RETURN NUMBER IS d NUMBER(7,1); BEGIN SELECT (precio_base * val) / 100 INTO d FROM dtiq WHERE cod = tiquete; RETURN d; EXCEPTION WHEN OTHERS THEN RETURN 0; descuento END descuento; END; --Fin del BODY / Parámetro Atributo del objeto Columna de dtiq

10 Tabla tipada de libros: CREATE TABLE libro OF libro_tip(idlibro PRIMARY KEY); INSERT INTO libro VALUES(523,'Azul',25,10000,10,'Poesía'); INSERT INTO libro VALUES(655,'Versos',70,15000,10,'Poesía'); INSERT INTO libro VALUES(625,'Dragón',700,5000,8,'Novela'); Al insertar en una tabla tipada no es necesario, pero es válido, invocar al constructor explícitamente : INSERT INTO libro VALUES libro_tip (libro_tip(785,'Billy el Mico',200,5000,5,'Novela')); INSERT INTO libro VALUES libro_tip (libro_tip(795,'Beauty Disrupted',100,50000,5,'Biografía'));

11 Ahora ya se pueden formular consultas como: Imprimir el código de cada libro, su precio base, su impuesto y su descuento con tiquete 1: SELECT idlibro, titulo, precio_base, l.descuento(1) AS descuento, l.impuesto() AS impuesto FROM libro l;

12 ¿Qué hacen las siguientes consultas? a) SELECT idlibro, titulo, precio_base, (l.precio_base - l.descuento(1) + l.impuesto()) AS precio_final FROM libro l;

13 b) SELECT idlibro, titulo FROM libro l WHERE (l.precio_base - l.descuento(2) + l.impuesto()) <= 10000;

14 c) SELECT genero, COUNT(*) AS cuantos, SUM(precio_base) AS total_basico, SUM(precio_base - l.descuento(0) + l.impuesto()) AS total_final FROM libro l GROUP BY genero HAVING COUNT(*) > 1;

15 precio final Supóngase que el precio final de un libro se requiere constantemente… Se puede crear una función llamada precio_final la cual invoca a las otras dos funciones para obtener el valor final del libro

16 ALTER TYPE libro_tip ADD MEMBER FUNCTION precio_final (tiquete IN NUMBER) RETURN NUMBER CASCADE; Ver otras opciones de modificación de tipos más adelante Evolución de tipos

17 Se debe crear de nuevo todo el BODY agregando el siguiente código: MEMBER FUNCTION precio_final precio_final(tiquete IN NUMBER) RETURN NUMBER IS BEGIN RETURN (precio_base - descuento(tiquete) + impuesto); precio_final END precio_final; Acá no requiere ()

18 Ahora ya es posible: SELECT titulo, l.precio_final(1) AS pfinal FROM libro l WHERE l.precio_final(1) > 10000; Notas Notas: Todavía se pueden invocar a las funciones descuento e impuesto y cada una se puede alterar independientemente … La función precio_final oculta todo el proceso del descuento y del impuesto

19 Un ejemplo con recursividad: Árboles Binarios CREATE OR REPLACE TYPE nodo_tipo AS OBJECT( izq REF nodo_tipo, dato NUMBER(5), der REF nodo_tipo, MEMBER FUNCTION inorden RETURN VARCHAR); / CREATE TABLE nodo OF nodo_tipo;

20 CREATE OR REPLACE TYPE BODY nodo_tipo AS MEMBER FUNCTION inorden RETURN VARCHAR AS in_izq VARCHAR2(100); in_der VARCHAR2(100); BEGIN IF izq IS NOT NULL THEN SELECT n.inorden() INTO in_izq FROM nodo n WHERE REF(n) = SELF.izq; END IF; IF der IS NOT NULL THEN SELECT n.inorden() INTO in_der FROM nodo n WHERE REF(n) = SELF.der; END IF; RETURN in_izq || ' ' || dato || ' ' || in_der; END; / Desafortunadamente, lo siguiente es inválido en PL/SQL: in_izq := izq.inorden(); o in_izq := SELF.izq.inorden(); Por eso se requiere el SELECT … INTO…que debería ser innecesario…

21 Sea el árbol: 731722721 7372 7

22 Primero se insertan las hojas 721, 722 y 731: INSERT INTO nodo VALUES(NULL, 721, NULL); INSERT INTO nodo VALUES(NULL, 722, NULL); INSERT INTO nodo VALUES(NULL, 731, NULL); Ahora las subraíces 72 y 73: INSERT INTO nodo VALUES((SELECT REF(n) FROM nodo n WHERE dato=721), 72, (SELECT REF(n) FROM nodo n WHERE dato=722)); INSERT INTO nodo VALUES(NULL, 73, (SELECT REF(n) FROM nodo n WHERE dato=731));

23 --Ahora la raíz: INSERT INTO nodo VALUES((SELECT REF(n) FROM nodo n WHERE dato=72), 7, (SELECT REF(n) FROM nodo n WHERE dato=73)); Finalmente, la consulta: SELECT n.dato, n.inorden() AS rec_inorden FROM nodo n;

24 ¿Qué pasa si se borra la tupla apuntada por un puntero? DELETE FROM nodo WHERE dato = 731; SELECT n.der.dato FROM nodo n WHERE dato = 73; SELECT dato FROM nodo WHERE der IS DANGLING;


Descargar ppt "Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional."

Presentaciones similares


Anuncios Google