Objetos en bases de datos Oracle

Oracle puede manejar objetos con características similares a las de cualquier lenguaje orientado a objetos. Dichos objetos pueden encontrarse en diferentes lugares en una aplicación Oracle: pueden estar almacenados en una tabla, declararse localmente en un bloque PL/SQL o mantenerse en una caché del lado del cliente. Dependiendo de donde esté localizado, un objeto tiene diferentes propiedades y se puede realizar con diferentes operaciones. Normalmente, una aplicación desplazará los objetos entre esas ubicaciones como parte de su ejecución.

Objetos transitorios Objetos persistentes Objetos cliente
Contienen instancias que son locales al bloque o paquete PL/SQL Contienen instancias que se almacenan en una tabla de la BD Contienen instancias que se almacenan en la caché cliente de un programa OCI o Pro*C
Se manipulan usando instrucciones PL/SQL Se manipulan usando instrucciones SQL Se manipulan usando instrucciones OCI o Pro*C
No pueden ser referenciados Pueden ser referenciados (sólo objetos de fila) Pueden ser referenciados
Existen mientras que la variable PL/SQL que les hace referencia sea visible Existen hasta que se borran explícitamente de la base de datos Existen hasta que son borrados de la caché

Objeto transitorio

Un objeto transitorio es local de un bloque PL/SQL y se deasigna cuando la variable donde se almacena deja de ser visible. Los objetos transitorios no se almacenan en la BD y su existencia no puede ser más larga que la de una sesión de base de datos. La siguiente sesión PL/SQL ilustra varios objetos transitorios:

CREATE OR REPLACE TYPE Punto AS OBJECT(

— Un punto se representa mediante su localización en

— una cuadrícula cartesiana X-Y

x NUMBER,

Y NUMBER,

— Devuelve una cadena ‘(x,y)’

MEMBER FUNCTION toString RETURN VARCHAR2,

PRAGMA RESTRICT_REFERENCES(toString, RNDS, WNDS, RNPS, WNPS)

);

/

CREATE OR REPLACE TYPE BODY Punto AS

— Devuelve una cadena ‘(x,y)’

MEMBER FUNCTION toString RETURN VARCHAR2 IS

v_Result VARCHAR2(20);

v_xString VARCHAR2(8) := SUBSTR(TO_CHAR(x),1,8);

v_yString VARCHAR2(8) := SUBSTR(TO_CHAR(y),1,8);

BEGIN

v_Result:='(‘ || v_xString || ‘, ‘;

v_Result:=v_Result || v_yString || ‘)’;

RETURN v_Result;

END toString;

END;

/

DECLARE v_Punto1 Punto := Punto(0,0);

BEGIN

DBMS_OUTPUT.PUT_LINE(‘Punto 1 es ‘ || v_Punto1.toString);

— v_Punto1 ya no será visible después de este bloque y,

— por tanto se deasignará.

END;

Punto 1 es (0, 0)

Sentencia procesada.

CREATE OR REPLACE PACKAGE PkgPunto AS

v_Punto2 Punto := Punto(-7,-8);

END PkgPunto;

/

— Dado que v_Punto2 está en una cabecera de paquete, se conservará

— hasta el final de la sesión. Por ejemplo, podemos hacer referencia

— a esta variable en otro bloque anónimo:

BEGIN

DBMS_OUTPUT.PUT_LINE(

‘Punto 2 es’ || PkgPunto.v_Punto2.toString);

END;

Punto 2 es(-7, -8)

Sentencia procesada.

Los objetos transitorios se manipulan usando instrucciones PL/SQL. Las instrucciones SQL se usan para almacenar objetos transitorios en la base de datos que así se convierten en persistentes.

Objetos persistentes

Es un objeto que se almacena en la BD y está disponible hasta que se borra. Estos objetos se almacenan al igual que los tipos escalares predefinidos. Hay dos formas distintas de almacenar un objeto en una tabla: como objeto de fila o de columna.

Un objeto de columna se almacena como una columna de BD, al igual que los tipos escalares. Para crear una tabla con un objeto de columna, simplemente se usa el tipo del objeto para el tipo de columna en la instrucción de creación de la tabla. Una tabla puede tener una combinación de tipos escalares y de objetos de columna. Por ejemplo, podemos crear una tabla que almacene puntos de la siguiente forma:

CREATE TABLE puntos(

clave NUMBER PRIMARY KEY,

punto Punto);

Ahora veamos como podemos insertar puntos en esta tabla:

INSERT INTO puntos VALUES(1,Punto(1,1));

INSERT INTO puntos VALUES(2,Punto(1,-1));

INSERT INTO puntos VALUES(3,Punto(-1,-1));

INSERT INTO puntos VALUES(4,Punto(-1,1));

Observar que se usa el constructor para insertar el tipo de objeto. Las tablas con objetos de columna no pueden visualizarse en el modelo relacional. Aun así, SQL*Plus dará formatos en las consultas a los objetos de columna de forma que sean legibles:

SELECT * FROM PUNTOS WHERE CLAVE=1;

CLAVE PUNTO(X, Y)

————- ———-

1 PUNTO(1, 1)

Objetos de fila

Por otra parte, un objeto de fila ocupa una fila completa de la tabla. Dicha fila contiene únicamente el objeto y no tiene ninguna otra columna. Una tabla definida de este modo se conoce como tabla de objetos y se crea usando la sintaxis siguiente:

CREATE TABLE nombre_tabla OF tipo_objeto;

Por ejemplo, una tabla de filas de objeto de tipo punto:

CREATE TABLE tabladepuntos OF Punto;

Cada fila de una tabla de objetos contiene una instancia de su tipo de objeto, por lo que sólo se pueden insertar objetos de dicho tipo en la tabla. El siguiente ejemplo muestra una instrucción INSERT de ejemplo para la tabla. Observar el uso del constructor para el tipo de objeto:

INSERT INTO tabladepuntos VALUES(Punto(1,1));

Una tabla de objetos es muy similar a una tabla relacional estándar. De hecho, todas las operaciones relacionales funcionarán en ella. Por ejemplo, también podemos realizar inserciones en la tabla de la siguiente forma:

INSERT INTO tabladepuntos(x,y) VALUES(-1,1);

La lista de columnas es opcional, de igual modo que en una operación de inserción en una tabla relacional.

* Transcrito del libro Programación Avanzada con PL/SQL de Scott Urman

Deja una respuesta