You are on page 1of 23

Bases de Datos Objeto Relacional

La tabla relacional "personas" se puede crear con la siguiente declaracin: CREATE TABLE personas (nombre VARCHAR2(30), telefono VARCHAR2(20) ); Una tabla objeto-relacional para los mismos datos se crea en dos pasos.
1.

Creacin de tipos de objetos y tablas objeto-relacional

Un tipo de objeto se define. Llamamos a este tipo "persona. (La barra "/" slo se necesita en SQLPLUS para indicar el final de la declaracin de tipo.) CREATE OR REPLACE TYPE persona AS OBJECT (nombre VARCHAR2(30), telefono VARCHAR2(20) ); / 2. Un object table es creado, el cual almacena los datos actuales u objetos. CREATE TABLE tabla_persona OF persona;

Las Tablas de objetos se pueden utilizar tanto de manera relacional, como de forma objeto relacional.
Insertando valores en una tabla de objetos de una manera relacional (dos valores se insertan):

Ingresando valores

INSERT INTO tabla_persona VALUES ('Juan perez', '42225652' );


Insertando valores de forma objeto relacional (un valor se inserta, pero este valor es un objeto de tipo "persona", que a su vez tiene dos valores):

INSERT INTO tabla_persona VALUES (persona ('Maria Reyes', '2232526') );

Ejercicios:
Crear un tipo de nombre "trabajo" con cuatro columnas: "idTrabajo" INT, "Titulo" VARCHAR (20), salario INT y aosExperiencia" INT. Crear una tabla de objetos "tabla_trabajo" de este tipo. Insertar 5 filas en esta tabla.

create type trabajo as object ( idTrabajo int, titulo varchar(20), salario int, aniosExperiencia int ); / Create table tabla_trabajo of trabajo;

begin insert into tabla_trabajo values (0, 'ingeniero', 30000,4); insert into tabla_trabajo values (1, 'programador', 35000,3); insert into tabla_trabajo values (2, 'analista', 20000,15); insert into tabla_trabajo values (3, 'disenador', 25000,2); insert into tabla_trabajo values (4, 'ingeniero', 33000,5); end; /

Select
Tambin hay dos mtodos para seleccionar de una tabla de objetos. En una seleccin de relacin, dos columnas son seleccionadas. El uso de alias ("p" en este caso) no es necesario. SELECT p.nombre, p.telefono FROM tabla_persona p.nombre = 'Juan perez'; p WHERE

En una seleccin objeto-relacional, una columna est seleccionada. La funcion VALOR() recupera los objetos y sus valores. En este caso el uso de un alias ("p") se requiere. SELECT VALUE(p) FROM tabla_persona p WHERE p.nombre = 'Juan perez';

Tipos Objeto definidos como tipos de datos


Tambin es posible utilizar tipos de objetos como tipos de datos. Esto significa que los objetos pueden ocupar columnas de la tabla o pueden servir como atributos de otros objetos. Estos se llaman objetos de columna.

Tabla relacional: Informacin de una direccin: (calle, numero, ciudad, casilla) Si calle y nmero estn mas relacionadas, la misma informacin en una tabla objeto puede ser almacenada: ((calle, numero), ciudad, casilla)

CREATE TYPE calle AS OBJECT (nombre VARCHAR2(30), numero NUMBER ); / CREATE TYPE direccion AS OBJECT (calleYnumero calle, ciudad VARCHAR2(30), casilla VARCHAR2(8)); /

Drop (tipos y tablas)


DROP TABLE DROP TYPE Tomar en cuenta las despendencias Eliminar persona y tabla_persona Crear el tipo "persona" que contiene nombre, apellido, telefono(negocio, casa, celular) y direccion(la del ejercicio anterior). Asegrese que nombre y apellido estn relacionados y que los nmeros de telfono estn relacionados..

Drop table tabla_persona; Drop type persona; CREATE TYPE telefono AS OBJECT ( casa VARCHAR(15), negocio VARCHAR(15), celular VARCHAR(15)); /

CREATE TYPE nombre AS OBJECT ( nombreP VARCHAR(15), apellido VARCHAR(15)); / CREATE TYPE persona AS OBJECT ( nombreP nombre, telefonoP telefono, direccionP direccion); /

Crear una tabla objeto "tabla_persona" que corresponda a "persona". Insertar dos filas de datos en "persona de la forma objecto-relaciona.

CREATE TABLE tabla_persona OF persona; Begin INSERT INTO tabla_persona VALUES ( nombre('John', 'Smith'), telefono('123-4567', NULL,'73746-56'), direccion(calle('Morningside', 342), 'Edinburgh', 'EH10 5DT')); INSERT INTO tabla_persona VALUES ( nombre('Mary ', 'Miller'), telefono ('354-5643', '453-5746','73346-56'), direccion(calle('Princess St.', 6), 'Edinburgh', 'EH1'));

Mtodos
Un tipo de objeto puede tener varios mtodos. Mtodos miembros (mtodos de instancia) Mtodos estticos ( mtodos de clase) Pueden ser funciones o procedimientos

El siguiente ejemplo muestra otro tipo de trabajo, declarando un mtodo evaluar_calificacion". CREATE OR REPLACE TYPE trabajo2 AS OBJECT (idTrabajo int, titulo varchar(20), salario int, aniosExperiencia int, MEMBER FUNCTION evaluar_calificacion RETURN STRING);

CREATE OR REPLACE TYPE BODY trabajo2 AS MEMBER FUNCTION evaluar_calificacion RETURN STRING IS BEGIN IF self.aniosExperiencia < 2 THEN RETURN 'mal'; ELSIF self.aniosExperiencia = 2 THEN RETURN 'OK'; ELSE RETURN 'bien!'; END IF; END evaluar_calificacion ; END;

Las variables de un mtodo deben ser declaradas entre IS y BEGIN. Los tipos de datos son STRING, REAL y NUMBER (no INT o VARCHAR). La palabra "self" se refiere al objeto actual, con el cual se llama al mtodo. Si t es el alias de una tabla de tipo trabajo2 el mtodo puede ser invocado con select t. evaluar_calificacion () from tabla_trabajo2 t;

Ejercicios
Agregar un segundo mtodo para la declaracin del tipo de Trabajo3. Este mtodo se llama fraccionSalario. Toma un nmero real N como argumento y devuelve el salario dividido por N. Por ejemplo, si N es 12, devuelve el sueldo mensual. El argumento de "REAL N" deber figurar entre parntesis entre el nombre del mtodo y el retorno (tanto en la declaracin de tipo y en el tipo de cuerpo). CREATE OR REPLACE TYPE trabajo2 AS OBJECT (idTrabajo int, titulo varchar(20), salario int, aniosExperiencia int, MEMBER FUNCTION fraccionSalario (n REAL) RETURN REAL, MEMBER FUNCTION evaluar_calificacion RETURN STRING); /

CREATE OR REPLACE TYPE BODY trabajo2 AS MEMBER FUNCTION fraccionSalario (n REAL) RETURN REAL IS BEGIN RETURN self.salario/n; END fraccionSalario ; MEMBER FUNCTION evaluar_calificacion RETURN STRING IS BEGIN IF self.aniosExperiencia < 2 THEN RETURN 'mal'; ELSIF self.aniosExperiencia = 2 THEN RETURN 'OK'; ELSE RETURN 'bien!'; END IF; END evaluar_calificacion ; END; /

Crear una tabla objeto para trabajo2 e inserte tres filas. Escriba un query que use evaluar_calificacion y salarios mensuales para todas las filas de la tabla. Escriba un query que selecciones todos los registros con valor 'OK' en evaluar_calificacion y un salario de seis meses de ms de 10000.

CREATE TABLE tabla_trabajo2 OF trabajo2; Begin INSERT INTO tabla_trabajo2 VALUES(0,'ingeniero',20000,1); INSERT INTO tabla_trabajo2 VALUES(1, 'db ',30000,2); INSERT INTO tabla_trabajo2 VALUES(2, 'analista',40000,5); end; / SELECT t.evaluar_calificacion(), t.fraccionSalario(12) FROM tabla_trabajo2 t;

SELECT * FROM tabla_trabajo2 t WHERE t.evaluar_calificacion () = 'OK' and t.fraccionSalario(2) > 10000;

Aadiendo mtodos a tipos existentes


ALTER TYPE trabajo ADD MEMBER FUNCTION evaluar_calificacion RETURN STRING CASCADE; CASCADE se asegura que cambios en el mtodo se apliquen a tablas de objetos dependientes;

Alterar el tipo persona para que tenga un mtodo imprimir_nombre. T Este mtodo imprime el apellido, una coma, espacio y el nombre. Para concatenar strings en PL/SQL el operador es ||.

ALTER TYPE persona ADD MEMBER FUNCTION imprimir_nombre RETURN STRING CASCADE; CREATE OR REPLACE TYPE BODY persona AS MEMBER FUNCTION imprimir_nombre RETURN STRING IS BEGIN RETURN self.nombreP.apellido || ', ' || self.nombreP.nombreP; END imprimir_nombre ; END; / select p.imprimir_nombre () from tabla_persona p;

You might also like