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

Características Objeto Relacionales en Oracle

  • Upload
    kalani

  • View
    50

  • Download
    0

Embed Size (px)

DESCRIPTION

Características Objeto Relacionales en Oracle. Francisco Moreno Universidad Nacional. Métodos. Son de dos tipos: Procedimientos Funciones Los procedimientos y funciones se pueden invocar desde otros procedimientos o desde otras funciones. - PowerPoint PPT Presentation

Citation preview

Page 1: Características Objeto Relacionales en Oracle

Características Características Objeto Relacionales Objeto Relacionales en Oracleen Oracle

Francisco Moreno

Universidad Nacional

Page 2: Características Objeto Relacionales en Oracle

MétodosSon 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).

Page 3: Características Objeto Relacionales en Oracle

idlibroidlibro títulotítulo cantidadcantidad precio_baseprecio_base imp_baseimp_base génerogénero

LIBROLIBRO

impuesto()descuento(tiquete)

Atributos

Métodos

Sea

Page 4: Características Objeto Relacionales en Oracle

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

Estos datos se guardan en una tabla así:

Page 5: Características Objeto Relacionales en Oracle

DROP TABLE rangoimp;CREATE TABLE rangoimp(liminf NUMBER(8) PRIMARY KEY,limsup NUMBER(8) UNIQUE NOT NULL,impto NUMBER(8),CHECK (liminf < limsup));

INSERT INTO rangoimp VALUES(0,99,5);INSERT INTO rangoimp VALUES(100,1000000,10);

Page 6: Características Objeto Relacionales en Oracle

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í:

Page 7: Características Objeto Relacionales en Oracle

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);

Page 8: Características Objeto Relacionales en Oracle

CREATE OR REPLACE TYPE libro_tip AS OBJECT(--Atributos idlibroidlibro NUMBER(5), titulotitulo VARCHAR2(30), cantidadcantidad NUMBER(4), precio_baseprecio_base NUMBER(6), imp_base imp_base NUMBER(3), generogenero VARCHAR2(20),--Métodos: MEMBER FUNCTION impuesto RETURN

NUMBER, MEMBER FUNCTION descuentodescuento(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

Page 9: Características Objeto Relacionales en Oracle

CREATE OR REPLACE TYPE BODYBODY libro_tip ASMEMBER FUNCTION impuesto RETURN

NUMBER ISi NUMBER(8);BEGINSELECT ((imp_base + impto) * precio_base)/100

INTO iFROM rangoimpWHERE cantidad BETWEEN liminf AND limsup;RETURN i;EXCEPTIONWHEN OTHERS THEN RETURN ((imp_base) * precio_base)/100; END impuesto; Nota: El body continúa en Nota: El body continúa en

la próxima diapositivala próxima diapositivaSi hay error solo se aplica el impuesto base

Atributos del objeto

Columna de rangoimp

Page 10: Características Objeto Relacionales en Oracle

MEMBER FUNCTION descuentodescuento(tiquete IN NUMBER)

RETURN NUMBER ISd NUMBER(8,2);BEGINSELECT (precio_base * val)/100 INTO dFROM dtiqWHERE cod = tiquete;RETURN d;EXCEPTIONWHEN OTHERS THEN RETURN 0; END descuentodescuento; END; --Fin del BODY/

Parámetro

Atributo del objeto

Columna de dtiq

Page 11: Características Objeto Relacionales en Oracle

Tabla tipada de libros:

DROP TABLE libro;CREATE TABLE libro OF libro_tip(idlibro PRIMARY KEY);INSERT INTO libro VALUES (libro_tiplibro_tip(785,'Billy el Mico',200,5000,5,'Novela'));INSERT INTO libro VALUES (libro_tiplibro_tip(795,'Beauty Disrupted',100,50000,5,'Biografía'));

Al insertar en una tabla tipada no es necesario invocar al constructor explícitamente:

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');

Page 12: Características Objeto Relacionales en Oracle

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 impuestoFROM libro l;

Page 13: Características Objeto Relacionales en Oracle

¿Qué hacen las siguientes consultas?

a)

SELECT idlibro, titulo, precio_base, (l.precio_base - l.descuento(1) + l.impuesto()) AS precio_finalFROM libro l;

Page 14: Características Objeto Relacionales en Oracle

b)

SELECT idlibro, tituloFROM libro lWHERE (l.precio_base - l.descuento(2)

+ l.impuesto()) <= 10000;

Page 15: Características Objeto Relacionales en Oracle

c)

SELECT genero, COUNT(*) AS cuantos, SUM(precio_base) AS total_basico, SUM(precio_base - l.descuento(0) +

l.impuesto()) AS total_finalFROM libro lGROUP BY generoHAVING COUNT(*) > 1;

Page 16: Características Objeto Relacionales en Oracle

Supóngase que el precio finalprecio 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

Page 17: Características Objeto Relacionales en Oracle

ALTER TYPE libro_tipADD 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

Page 18: Características Objeto Relacionales en Oracle

Se debe crear de nuevo todo el BODY agregando el siguiente código:

MEMBER FUNCTION precio_finalprecio_final(tiquete IN NUMBER) RETURN NUMBER ISBEGIN RETURN (precio_base - descuento(tiquete)

+ impuesto);END precio_finalprecio_final; Acá no

requiere ()

Page 19: Características Objeto Relacionales en Oracle

Ahora ya es posible:

SELECT titulo, l.precio_final(1) AS pfinalFROM libro lWHERE l.precio_final(1) > 10000;

NotasNotas: 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

Page 20: Características Objeto Relacionales en Oracle

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(dato PRIMARY KEY);

Page 21: Características Objeto Relacionales en Oracle

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;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…

Page 22: Características Objeto Relacionales en Oracle

Sea el árbol:

731722721

7372

7

Page 23: Características Objeto Relacionales en Oracle

Primero se insertan las hojas 721, 722 y 731:

INSERT INTO nodo VALUES(NULL, 721721, NULL);INSERT INTO nodo VALUES(NULL, 722722, NULL);INSERT INTO nodo VALUES(NULL, 731731, NULL);

Ahora las subraíces 72 y 73:

INSERT INTO nodo VALUES((SELECT REF(n) FROM nodo n WHERE dato =

721), 7272, (SELECT REF(n) FROM nodo n WHERE dato = 722));

INSERT INTO nodo VALUES(NULL, 7373, (SELECT REF(n) FROM nodo n WHERE dato = 731));

Page 24: Características Objeto Relacionales en Oracle

--Ahora la raíz:

INSERT INTO nodo VALUES((SELECT REF(n) FROM nodo n WHERE dato =

72), 77, (SELECT REF(n) FROM nodo n WHERE dato = 73));

Finalmente, la consulta:

SELECT n.dato, n.inorden() AS rec_inordenFROM nodo n;

Page 25: Características Objeto Relacionales en Oracle

¿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;

Se podría prevenir con un trigger…