Sie sind auf Seite 1von 32

Guía de Laboratorio

Programación en Base de Datos – Programación PL/SQL VI


1
______________________________________________________________________
_________________________

Programación en Base de Datos Oracle


PROGRAMACIÓN PL/SQL VI

Semana 14 y 15

OBJETIVO DEL LABORATORIO

Construye programas avanzados utilizando el lenguaje PL/SQL en beneficio a la lógica del negocio.

MARCO TEÓRICO
El lenguaje utilizado para acceder a las bases de datos relacionales es el llamado Lenguaje Estructurado de Consulta (SQL,
Structured Query Language), que es muy flexible y transparente, es decir, sencillo y poderoso. SQL es un lenguaje de
cuarta generación, lo cual quiere decir que describe lo que quiere hacerse. Ayudará de manera factible al estudiante a
relacionar el mundo real con las bases de datos a desarrollar usando programación orientado a negocio.

PL / SQL es un lenguaje de procedimiento diseñado específicamente para incluir declaraciones SQL dentro de su
sintaxis. Las unidades de programa PL / SQL son compiladas por el servidor de Oracle Database y almacenadas dentro de
la base de datos. Y en tiempo de ejecución, tanto PL / SQL como SQL se ejecutan dentro del mismo proceso del servidor,
brindando una eficiencia óptima. PL / SQL hereda automáticamente la solidez, seguridad y portabilidad de la base de datos
Oracle.

RECURSOS

Hardware
 Sistema. Oracle en Windows requiere un PC Intel x86, AMD64 o Intel EM64T
 Memoria. Al menos 1 GB de RAM y el doble en virtual.
 Espacio en disco duro. Al menos 6 GB para la instalación (algunas instalaciones requieren menos). Además,
necesitamos poder almacenar 500 MB en la carpeta TEMP del sistema.
 Tarjeta gráfica. Debe de ser capaz de mostrar 1024 por 768 píxeles como mínimo y 256 colores.

Software
Sistema Operativo.
 Windows 2003 Server y 2003 Server R2.
 Windows XP Professional.
 Windows Vista, pero no la versión Home Edition.
 Windows Server 2008 y 2012. No la versión Server Core.

Compiladores. Se usan para la gente que crean aplicaciones en Oracle usando lenguajes como Pro C, Pro COBOL,
JAVA.
o Visual C++.NET 2005 8.0 o Intel 10.1 C, .Net Express.

Navegador. Para configurar algunos servicios de Oracle. Debe de ser navegador moderno (Internet Explorer 6 o
superior, Firefox 2.0 o superior, Safari 3.1 o superior, Chrome 3.0 o superior)
Usar dirección IP única en la máquina en la que se instala Oracle. Es decir, no usar DHCP para direccionar la IP
en el servidor de Oracle. No es un requisito obligatorio, pero es muy recomendable.
Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
2
______________________________________________________________________
_________________________
DESCARGAR EL ARCHIVO Semana17_PL_SQL_1.sql,
ESTE SCRIPT CONTIENE LA ESTRUCTURA DE TABLAS DEL MODELO RELACIONAL.

Programación Orientada a Objetos

Introducción POO en Oracle.

Los TYPE de Oracle son tipos de datos que  declara el usuario, y que puede ser utilizado para la declaración de variables,
tanto en procedimientos, como en funciones, o incluso en tablas.

Con el tiempo, los type de Oracle,  han derivado en lo que en Java o C++ se denominan clases. Es decir que cada tipo está
formado por sus objetos y sus atributos:

 Los objetos son variables, que a su vez pueden pertenecer a otros tipos.
 Los atributos son procedimientos o funciones que pertenecen al type.

A parte, los type de Oracle tienen todas las características propias de la programación orientada a objetos:

 Encapsulación: El type contiene dentro todos los objetos y atributos correspondientes, siendo estos últimos
transparentes para el usuario.
 Herencia: Un type puede heredar todos los objetos y atributos de otro.
 Polimorfismo: El type de Oracle, una vez heredado puede añadir nuevos objetos y atributos.

LOS OBJETOS PERMITEN MODELAR MEJOR LAS RELACIONES “PARTE – TODO”

MODELO ORIENTADO A OBJETOS

MODELO RELACIONAL.

Estructura de un tipo objeto.

La estructura de un tipo de objeto está dividida en 2 partes:


 Interface publica
 Implementación privada.
Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
3
______________________________________________________________________
_________________________
INTERFACE PÚBLICA.
En esta parte se declaran los atributos y los métodos a usar.

Ejemplo de interfaz pública o declarativa.

IMPLEMENTACION PRIVADA.
Es aquí donde se crea la acción de los métodos, basado en una lógica de código.

Ejemplo del cuerpo o implementación del comportamiento de los métodos.


Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
4
______________________________________________________________________
_________________________
REGLAS:
 Los parámetros no deben restringirse en tamaño
 Se invocan igual que se recupera un campo
o Especificando los parámetros si fuera el caso
 Definir un tipo no implica reservar espacio para objetos del tipo

Tablas de objetos.

Las tablas tipadas son:


 Tablas que almacenan objetos del tipo sobre el que han sido definidas
o Cada fila almacena un objeto
 También podemos verlas como
o Una tabla con una única columna del tipo objeto
o Una tabla con tantas columnas como el tipo objeto

 Almacenan un objeto en cada fila y permiten acceder a los campos del objeto cómo si fueran columnas de la tabla
 Las restricciones se definen sobre la tabla y se aplicarán SÓLO sobre aquellos objetos almacenados en dicha tabla
Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
5
______________________________________________________________________
_________________________
Métodos.

Implementan el comportamiento de los objetos del tipo

Existen 3 tipos: MEMBER, STATIC, CONSTRUCTOR.

Métodos MEMBER:
Los atributos son la columna o campo en el que se almacenan los datos. Cada atributo se asignará al tipo de datos que
define el tipo de procesamiento y almacenamiento para ese atributo. El atributo puede ser de cualquier tipo de datos PL /
SQL válido, o puede ser de otro tipo de objeto.
Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
6
______________________________________________________________________
_________________________

Métodos STATIC:
Operaciones globales, que no son de los objetos, si no del tipo
Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
7
______________________________________________________________________
_________________________

Constructores:
Cada vez que se crea un tipo de objeto, Oracle crea automáticamente un método constructor.

 Identificado por el mismo nombre del tipo


 Es una función que devuelve una nueva instancia del tipo definido por el usuario y establece los valores de sus
atributos.
 Recibe como parámetros los atributos del tipo
 Debe ser siempre explícitamente invocado cada vez que se desee crear un objeto del tipo
Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
8
______________________________________________________________________
_________________________
Métodos Constructor:

Declarar e Inicializar Objetos

Podemos usar un tipo de objeto igual que cualquier otro tipo de dato.

Una buena práctica es inicializar los objetos al declararlos.


Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
9
______________________________________________________________________
_________________________
Acceso a los atributos de un objeto

Para acceder a las propiedades de un objeto se utiliza la notación punto (.)

Variable de Correlación.

 Son un tipo especial de variable PL/SQL

 En general, las correlation variables se identifican con los alias de tabla


o Son opcionales,
o Podemos omitirlas

 Pero cuando trabajamos con UDTs es OBLIGATORIO utilizarlas para acceder a los campos del UDT
Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
10
______________________________________________________________________
_________________________
 Igual mente para acceder a los campos UDT por separado hay que utilizar las correlation variables

 Las correlations variables permiten resolver ambigüedades

o Cliente es un nombre de usuario, Coche es una tabla y Marca una columna


o Cliente es un nombre de tabla, Coche de columna y Marca un campo de esa columna

 El uso de la variable resuelve el problema

OID. Objeto identificador.

 Cada fila de una tabla tipada (OR) tendrá un identificador del objeto fila  OID
 Para guardar esos identificadores Oracle utiliza un tipo REF
Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
11
______________________________________________________________________
_________________________
Tipos referencia.

 Cada fila (objeto fila) podrá ser referenciada como un objeto a través de su OID

 En cambio sí se pueden navegar en SQL


Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
12
______________________________________________________________________
_________________________
Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
13
______________________________________________________________________
_________________________
 Podemos restringir el conjunto de objetos a los que apuntará la REF a los contenidos en una única tabla

De esta forma el almacenamiento ocupará menos espacio y el acceso será más eficiente

Operador Value:

Para obtener el objeto almacenado en una fila (y no sólo el valor de los campos de dicho objeto) se necesita la función
VALUE
Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
14
______________________________________________________________________
_________________________
Gestión de Objetos

Al recuperar el objeto completo, se pueden realizar operaciones con él: modificarlo, insertarlo …

Ejemplos:

EJEMPLO 1:
Elaborar una clase con el Nombre Tipo_Cubo con los siguientes atributos y métodos.

Tipo_Cubo
Largo (int)
Ancho (int)
Alto (int)
Superficie ()
Volumen ()
Mostrar()
SOLUCION:
PASO 1:
Se crea la clase con sus respectivos atributos y métodos.
CREATE OR REPLACE TYPE Tipo_Cubo AS OBJECT (
Largo INTEGER,
Ancho INTEGER,
Alto INTEGER,
MEMBER FUNCTION Superficie RETURN INTEGER,
MEMBER FUNCTION Volumen RETURN INTEGER,
MEMBER PROCEDURE Mostrar);
Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
15
______________________________________________________________________
_________________________
PASO 2:
Se procede a crear el cuerpo del Tipo_Cubo, es decir aquí se redacta el código del comportamiento de los métodos.
CREATE OR REPLACE TYPE BODY Tipo_Cubo AS
MEMBER FUNCTION Volumen RETURN INTEGER IS
BEGIN
RETURN Largo * Ancho * Alto;
-- RETURN SELF.largo * SELF.ancho * SELF.alto;
END;

MEMBER FUNCTION Superficie RETURN INTEGER IS


BEGIN
RETURN 2 * (largo * ancho + largo * alto + ancho * alto);
END;

MEMBER PROCEDURE Mostrar


IS
BEGIN
DBMS_OUTPUT.PUT_LINE ('Largo : ' || Largo);
DBMS_OUTPUT.PUT_LINE ('Ancho : ' || Ancho);
DBMS_OUTPUT.PUT_LINE ('Alto : ' || Alto);
DBMS_OUTPUT.PUT_LINE ('Volumen : ' || Volumen);
DBMS_OUTPUT.PUT_LINE ('Superficie : ' || Superficie);
END;
END;

PASO 3:
Se realizan la prueba usando bloque anónimo.
SET SERVEROUTPUT ON;
DECLARE
Proceso Tipo_Cubo;
BEGIN
Proceso:= Tipo_Cubo (10, 5, 5);
Proceso.mostrar;
END;

Resultados:

Eliminando el tipo.
DROP TYPE Tipo_Cubo FORCE;

FIN DEL EJEMPLO 1.


Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
16
______________________________________________________________________
_________________________
EJEMPLO 2:
Elaborar una clase con el Nombre Tipo_Cubo con los siguientes atributos y métodos.
Tipo_Triangulo
Base (Number)
Altura (Number)
AreaT ()
Mostrar()
SOLUCION:

PASO 1:
Se crea la clase con sus respectivos atributos y métodos
CREATE OR REPLACE TYPE Tipo_Triangulo AS OBJECT (
Base NUMBER,
Altura NUMBER,
MEMBER FUNCTION AreaT RETURN NUMBER,
MEMBER PROCEDURE Mostrar );

PASO 2:
Se procede a crear el cuerpo del Tipo_Triangulo, es decir, aquí se redacta el código del comportamiento de los métodos.
CREATE OR REPLACE TYPE BODY Tipo_Triangulo AS

MEMBER FUNCTION AreaT RETURN NUMBER IS


BEGIN
RETURN (Base * Altura)/2;
-- RETURN SELF.largo * SELF.ancho * SELF.alto;
END;

MEMBER PROCEDURE Mostrar


IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Base del Triangulo : ' || Base);
DBMS_OUTPUT.PUT_LINE('Altura del Triangulo : ' ||
Altura);
DBMS_OUTPUT.PUT_LINE('Area del Triangulo : ' || AreaT);
END;
END;
PASO 3:
Se realiza la prueba, usando un bloque anónimo.
SET SERVEROUTPUT ON;
DECLARE
Proceso Tipo_Triangulo;
BEGIN
Proceso:= Tipo_Triangulo (10, 5);
Proceso.Mostrar;
END;
Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
17
______________________________________________________________________
_________________________
Resultados:

Eliminando el tipo.
DROP TYPE Tipo_Triangulo FORCE;
FIN DEL EJEMPLO 2.

EJEMPLO 3:
Elaborar una clase con el Nombre Tipo_Cubo con los siguientes atributos y métodos, asociados a una tabla de datos Cubo.
Tipo_Cubo
Largo (Number)
Ancho (Number)
Alto (Number)
Superficie ()
Volumen ()
Mostrar() Cubo
Largo (Number)
Ancho (Number)
SOLUCION: Alto (Number)
PASO 1:
Se crea la clase con sus respectivos atributos y métodos
CREATE OR REPLACE TYPE Tipo_Cubo AS OBJECT (
Largo INTEGER,
Ancho INTEGER,
Alto INTEGER,
MEMBER FUNCTION Superficie RETURN INTEGER,
MEMBER FUNCTION Volumen RETURN INTEGER,
MEMBER PROCEDURE Mostrar );

PASO 2:
Se procede a crear el cuerpo del Tipo_Cubo, es decir, aquí se redacta el código del comportamiento de los métodos.
CREATE OR REPLACE TYPE BODY Tipo_Cubo AS
MEMBER FUNCTION Volumen RETURN INTEGER IS
BEGIN
RETURN Largo * Ancho * Alto;
-- RETURN SELF.largo * SELF.ancho * SELF.alto;
END;

MEMBER FUNCTION Superficie RETURN INTEGER IS


BEGIN
RETURN 2 * (largo * ancho + largo * alto + ancho * alto);
END;

MEMBER PROCEDURE Mostrar


IS
BEGIN
DBMS_OUTPUT.PUT_LINE ('Largo : ' || Largo);
DBMS_OUTPUT.PUT_LINE ('Ancho : ' || Ancho);
DBMS_OUTPUT.PUT_LINE ('Alto : ' || Alto);
DBMS_OUTPUT.PUT_LINE ('Volumen : ' || Volumen);
DBMS_OUTPUT.PUT_LINE (‘Superficie : ' || Superficie);
END;
END;
Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
18
______________________________________________________________________
_________________________
PASO 3:
Ahora crearemos una tabla con el nombre CUBOS que será del tipo Tip_Cubo.
CREATE TABLE Cubos of Tipo_Cubo;

PASO 4:
Verificamos la existencia de la tabla CUBOS.
SELECT * FROM Cubos;

Se obtendrá lo siguiente:

PASO 5:
Ahora insertamos 2 o más filas de datos en la tabla Cubos.
INSERT INTO Cubos VALUES (Tipo_Cubo (10, 10, 10));
INSERT INTO Cubos VALUES (Tipo_Cubo (3, 4, 5));

PASO 6:
Nueva mente verificamos el contenido de la tabla CUBO, para verificar la inserción.
SELECT * FROM Cubos;

Ahora su contenido es:

PASO 7:
Ahora realizamos la primera prueba mediante la siguiente consulta.
SELECT c.volumen(), c.superficie () FROM cubos c
WHERE c.largo = 10;

Resultado:

SELECT c.volumen(), c.superficie () FROM cubos c


WHERE c.largo = 3;
Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
19
______________________________________________________________________
_________________________
Resultado:

PASO 8:
Segunda Prueba. Desde un bloque anónimo.
SET SERVEROUTPUT ON;
DECLARE
mi_cubo Tipo_Cubo;
BEGIN
-- Bloque PL/SQL para recuperar y mostrar la info de un cubo
SELECT VALUE(c) INTO mi_cubo FROM Cubos c
WHERE c.largo = 10;
mi_cubo.Mostrar ();
END;

Resultados:

PASO 9:
Eliminando el tipo y tabla.
DROP TYPE Tipo_Cubo FORCE;
DROP TABLE Cubo;

FIN DEL EJEMPLO 3.

EJEMPLO 4:
Ejemplo de Herencia.
En este ejemplo se crea a la clase PERSONA, con los atributos CODIGO, NOMBRE y APELLIDO, son valores que la
clase va a capturar, y un método llamado GET_NOMBRECOMPLETO, el cual devuelve el nombre completo de la
persona.
Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
20
______________________________________________________________________
_________________________
La clase EMPLEADO se extiende a la clase PERSONA, heredando sus atributos y métodos asociados.

La clase PERSONA está asociada a una tabla de datos con el nombre TEMPLEADO.
U N D E R (HERENCIA)
PERSONA
CODIGO (Number)
NOMBRE (Varchar2)
APELLIDO (Varchar2)
GET_NOMBRECOMPLETO EMPLEADO
SUELDO (Number)
SPU_ACTUALIZAR_SUELDO (PSUELDO NUMBER)
Alto (Number)

ASOCIADO A LA
TABLA

TEMPLEADO
CODIGO (Number)
NOMBRE (Varchar2)
APELLIDO (Varchar2)

SOLUCION:

PASO 1:
Creamos la clase PERSONA, con sus atributos y métodos asociados.
CREATE OR REPLACE TYPE PERSONA AS OBJECT
(
CODIGO NUMBER,
NOMBRE VARCHAR (20),
APELLIDO VARCHAR (25),
MEMBER FUNCTION GET_NOMBRECOMPLETO RETURN VARCHAR
) NOT FINAL;
1. Por default las clases son FINAL, lo cual indica que no permite usarse en herencias.
2. Asimismo podemos trabajar con herencia.

PASO 2:
Se procede a crear el cuerpo de la clase PERSONA. Programando el comportamiento de los métodos.
CREATE OR REPLACE TYPE BODY PERSONA IS
MEMBER FUNCTION GET_NOMBRECOMPLETO RETURN VARCHAR
IS
BEGIN
RETURN NOMBRE||' '||APELLIDO;
END;
END;
Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
21
______________________________________________________________________
_________________________
PASO 3:
Crear la clase EMPLEADO con sus atributos y métodos asociados.
CREATE OR REPLACE TYPE EMPLEADO UNDER PERSONA
(
SUELDO NUMBER,
OVERRIDING MEMBER FUNCTION GET_NOMBRECOMPLETO RETURN VARCHAR,
MEMBER PROCEDURE SPU_ACTUALIZAR_SUELDO (PSUELDO NUMBER)
) NOT FINAL;

Estamos creando la clase EMPLEADO heredando atributos y métodos de la clase PERSONA.

PASO 5:
Se procede a crear el cuerpo de la clase EMPLEADO. Con sus atributos, y Programando el comportamiento de los
métodos asociados.
CREATE OR REPLACE TYPE BODY EMPLEADO IS

OVERRIDING MEMBER FUNCTION GET_NOMBRECOMPLETO RETURN VARCHAR


IS
BEGIN
RETURN LOWER (NOMBRE||' '||APELLIDO);
END;

MEMBER PROCEDURE SPU_ACTUALIZAR_SUELDO (PSUELDO NUMBER) IS


BEGIN
SUELDO:= PSUELDO;
END;
END;

Overriding permite la sobre escritura de un subprograma del padre.

PASO 6:
También está permitido polimorfismo. En los siguientes pasos crearemos una tabla basada en nuestro objeto EMPLEADO
y lo manipularemos.

Creamos la tabla TEMPLEADO asociada al tipo EMPLEADO.


CREATE TABLE TEMPLEADO OF EMPLEADO;

Insertamos una fila de datos en la tabla TEMPLEADO.


INSERT INTO TEMPLEADO VALUES
(EMPLEADO (1,'FRANCISCO','RICCIO', 8000));

Verificamos la inserción de datos en la tabla TEMPLEADO, mediante una consulta


SELECT * FROM TEMPLEADO;

El resultado es:
Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
22
______________________________________________________________________
_________________________
Mediante una consulta solicitaremos información de nuestro objeto y tabla.
SELECT E.GET_NOMBRECOMPLETO(), E.* FROM TEMPLEADO E;

El resultado es:

Mediante un bloque anónimo solicitaremos información de nuestro objeto y tabla, y al mismo tiempo actualizaremos el
sueldo por 1000. De los 8000 que era antes.
SET SERVEROUTPUT ON
DECLARE
V_OBJETO EMPLEADO;
BEGIN
SELECT VALUE(E) INTO V_OBJETO FROM TEMPLEADO E;
V_OBJETO.SPU_ACTUALIZAR_SUELDO (1000);
DBMS_OUTPUT.PUT_LINE('EMPLEADO:'|| V_OBJETO.GET_NOMBRECOMPLETO());
DBMS_OUTPUT.PUT_LINE('SUELDO = '|| TO_CHAR(V_OBJETO.SUELDO));
END;

El resultado es:

Si hubiéramos creado la variable V_OBJETO como PERSONA, estaríamos trabajando con polimorfismo, de modo que la
variable se declara de una clase base y se crea con clases derivadas.

Eliminando tabla.y tipo.


DROP TABLE TEMPLEADO;
DROP TYPE EMPLEADO;
DROP TYPE PERSONA;

FIN DEL EJEMPLO 4.


https://magicplsql.blogspot.com/2016/12/metodos-en-tipos-de-objetos-oracle.html

http://www.programandoapasitos.com/2016/02/acceso-datos-oracle-database-sintaxis-y.html
Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
23
______________________________________________________________________
_________________________
CON RESPECTO A LA HERENCIA:

 Cada subtipo hereda todos los atributos y métodos del supertipo


 Los subtipos pueden añadir sus propios atributos* y métodos
 Los subtipos no pueden cambiar ni eliminar los atributos que heredan pero podrían redefinir los métodos que
heredan y pueden agregar métodos sobrecargados
 Los cambios hechos al supertipo se reflejan en los subtipos
3. Con nombres distintos de los de su supertipo
 Para que un tipo pueda generar subtipos se debe
declarar NOT FINAL (la opción predeterminada es FINAL)
 Para poder crear objetos de un tipo, este debe ser INSTANTIABLE (es la opción predeterminada, es decir, no
abstracto)
 Para que un tipo sea abstracto se debe declarar como NOT INSTANTIABLE:
Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
24
______________________________________________________________________
_________________________
No es válido:

Un método puede ser:


 FINAL: No puede ser redefinido por los hijos
 NOT FINAL: Puede ser redefinido por los hijos*
Y también puede ser:
 INSTANTIABLE: El tipo que declara el método lo implementa en su cuerpo*
 NOT INSTANTIABLE: El tipo que declara el método no lo implementa (delega la implementación a sus
descendientes)

* Es la opción predeterminada.
Nota: Tampoco es válido para un método la combinación NOT INSTANTIABLE FINAL.

 Si un tipo posee un método no instanciable el tipo debe ser a su vez no instanciable

 Si un subtipo no implementa métodos no instanciables heredados, debe ser a su vez un tipo no instanciable
Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
25
______________________________________________________________________
_________________________

DESARROLLO DEL EJEMPLO:


DROP TYPE persona_type FORCE;

CREATE OR REPLACE TYPE persona_type AS OBJECT (


cedula NUMBER (8),
nombre VARCHAR2 (20)
) NOT FINAL;
DROP TYPE profesor_type FORCE;

CREATE OR REPLACE TYPE profesor_type UNDER persona_type(


registro NUMBER (5)
) NOT FINAL;
DROP TYPE profplanta_type FORCE;

CREATE TYPE profplanta_type UNDER profesor_type(


salario NUMBER (8)
) NOT FINAL;
DROP TYPE profcat_type FORCE;

CREATE TYPE profcat_type UNDER profesor_type(


val_hora NUMBER (8)
) NOT FINAL;

 Principio de Sustitución: “Un objeto perteneciente a un supertipo puede ser remplazado por cualquiera de sus
subtipos”
 Intuitivamente, en el ejemplo anterior: Todo profesor es una persona.
 Lo contrario no siempre se cumple: Una persona no necesariamente es profesor.
 Por eso a un objeto se le puede asignar un objeto subtipo, porque este puede proveer todos los atributos que exige
el supertipo.
 Este proceso también se denomina “widening” (ampliación)

Si la tabla persona existiera será eliminada.


Creamos la tabla persona y la asociamos con el tipo persona_type. Y haremos que en dicha tabla el atributo cedula sea un
primary key.
DROP TABLE persona;

CREATE TABLE persona OF persona_type


(cedula PRIMARY KEY);

Insertamos algunos registros, en las diferentes clases, por intermedio de la tabla PERSONA.
INSERT INTO persona VALUES (101,'Lauren Mayberry');
INSERT INTO persona VALUES (persona_type (201,'Hayley Williams'));

--SORPRESA
INSERT INTO persona values (profesor_type (301,'Adam Duritz', 55));
INSERT INTO persona values (profplanta_type (6,'Matt Goss', 95, 15));
INSERT INTO persona values (profcat_type (61,'George Michael', 52, 10));
Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
26
______________________________________________________________________
_________________________
Verificamos el contenido.
--No se ven los atributos exclusivos del profesor...
SELECT * FROM persona;

--Para poderlos ver, usamos el comando VALUE.


SELECT VALUE (p) FROM persona p;

 Para “descubrir” los atributos exclusivos de profesor se usa la función TREAT:


--Para “descubrir” los atributos exclusivos
--de profesor se usa la función TREAT:
SELECT cedula, TREAT(VALUE(p) AS profesor_type).registro
FROM persona p;

--Ahora que pasa con:


SELECT TREAT(VALUE(p) AS profesor_type) FROM persona p;
Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
27
______________________________________________________________________
_________________________

TREAT no convierte un subtipo a supertipo:

CREATE TABLE prof OF profesor_type


(cedula PRIMARY KEY);

INSERT INTO prof values (profesor_type (1,'Rhianna Kenny', 50));

SELECT TREAT (VALUE (p) AS persona_type) FROM prof p;

Lo deja como profesor_type

Operador IS OF (Visualizando contenido de sub tipos)


--Imprimirá solo los profesores (o subtipos de profesores…)

SELECT VALUE (p) FROM persona p


WHERE VALUE (p) IS OF (profesor_type);

--Si se desean evitar los subtipos de profesor se puede


--usar el operador ONLY:

SELECT VALUE (p) FROM persona p


WHERE VALUE (p) IS OF (ONLY profesor_type);
Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
28
______________________________________________________________________
_________________________
Redefinición de métodos:

Son aquellos que usan la cláusula FINAL.


Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
29
______________________________________________________________________
_________________________

MODELO DE TIPO DE DATOS


Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
30
______________________________________________________________________
_________________________
DROP TYPE fig_typ FORCE;
DROP TYPE cir_typ FORCE;

CREATE TYPE fig_typ AS OBJECT (


nombre VARCHAR(10),
FINAL MEMBER FUNCTION imp_nom RETURN VARCHAR,
MEMBER FUNCTION descr RETURN VARCHAR
) NOT FINAL;

CREATE OR REPLACE TYPE BODY fig_typ AS


FINAL MEMBER FUNCTION imp_nom RETURN VARCHAR IS
BEGIN
RETURN 'Mi nombre es ' || nombre;
END;
MEMBER FUNCTION descr RETURN VARCHAR IS
BEGIN
RETURN 'No sé que tipo de figura soy';
END;
END;

CREATE TYPE cir_typ UNDER fig_typ(


radio NUMBER(5),
OVERRIDING MEMBER FUNCTION descr RETURN VARCHAR);

CREATE OR REPLACE TYPE BODY cir_typ AS


OVERRIDING MEMBER FUNCTION descr RETURN VARCHAR IS
BEGIN
RETURN 'Soy un círculo malo, mi radio es ' ||
TO_CHAR (radio) || ' y me voy a comer a las demás figuras';
END;
END;

CODIGO ORIGINAL:

REALIZANDO PRUEBAS.
--SI LA TABLA EXISTE, LA ELIMINAMOS.
DROP TABLE figura;

--CREAMOS LA TABLA FIGURA ASOCIADA A LA CLASE TIPO fig_typ.


CREATE TABLE figura OF fig_typ;

--INSERTAMOS UN REGISTRO
INSERT INTO figura VALUES ('Figura 1');

--REALIZAMOS UNA CONSULTA.


SELECT m.imp_nom(), m.descr() FROM figura m;

EL RESULTADO:
Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
31
______________________________________________________________________
_________________________
--SI LA TABLA EXISTE, LA ELIMINAMOS.
DROP TABLE circulo;

--CREAMOS LA TABLA CIRCULO ASOCIADA A LA CLASE TIPO cir_typ.


CREATE TABLE circulo OF cir_typ;

--INSERTAMOS UN REGISTRO
INSERT INTO circulo VALUES ('circulo 1',10);

--REALIZAMOS UNA CONSULTA.


SELECT c.imp_nom(), c.descr() FROM circulo c;

EL RESULTADO:

INVOCACION MEDIANTE UN BLOQUE ANONIMO.


DECLARE
c cir_typ;
BEGIN
SELECT VALUE (e) INTO c FROM circulo e;
DBMS_OUTPUT.PUT_LINE (c.descr);
DBMS_OUTPUT.PUT_LINE ((c AS fig_typ).descr);
END;

EL RESULTADO:

O ALTERNATIVAMENTE, GENERAR UN OBJETO FIG_TYP EN TIEMPO DE EJECUCIÓN:


SELECT fig_typ (c.nombre).descr() FROM circulo c;

EL RESULTADO:

CONCLUSIONES Y RECOMENDACIONES DE LA EXPERIENCIA


La codificación PL/SQL de Oracle es tan amplia, que ofrece a los estudiantes una alta gama de alternativas en la
Programación orientada a objetos POO en Oracle, para la resolución de problemas usando procedimientos y funciones
combinadas en la herencia y polimorfismo, no difíciles de entender, con la prioridad de manejar los datos con suma
responsabilidad por el programador Oracle.
Guía de Laboratorio
Programación en Base de Datos – Programación PL/SQL VI
32
______________________________________________________________________
_________________________
ACTIVIDAD VIRTUAL
Ingresa a la plataforma virtual, luego revisa y analiza el tema presentado en esta sesión para desarrollar la siguiente
actividad propuesta:

SE TIENE EL SIGUIENTE MODELO DE TIPO DE DATOS:

IMPORTANTE
ELABORE EL MODELO DE TIPO DE DATOS EN ESTE ARCHIVO
S17_PL_SQL_2.sql,
FAVOR DE DESCARGAR DICHO ARCHIVO Y LUEGO, DESARROLLAR LOS CASOS, FINALICE
SUBIENDO NUEVAMENTE EL ARCHIVO.

De acuerdo al material presentado Semana 17, Responda a las siguientes Preguntas:

RESOLVER:

1. ELABORE MODELO DE TIPO DE DATOS. PERSONA, EMPLEADO, ESTUDIANTE, PROFESOR.


2. ELABORAR UN EJEMPLO DE HERENCIA, BASADO EN LAS CLASES DE TIPOS: SUPER CLASE
“FIGURA”, SUB CLASES: “TRIANGULO” Y “CUADRADO”.

Das könnte Ihnen auch gefallen