Convertir Relacional <==> Objeto

La sintaxis de la BBDD Oracle permite la conversión de información en formato objeto a relacional y viceversa. Por tanto, el formato de la información la podemos elejir en función de nuestras necesidades.

En este apartado veremos unos ejemplos de conversión.

Partiremos de los siguientes elementos.

CREATE TYPE struct_demo AS OBJECT (
A1 INTEGER,
A2 INTEGER,
A3 INTEGER)
/

CREATE TYPE varray_demo AS VARRAY(1000) OF INTEGER
/

CREATE TABLE t_struct (id INTEGER PRIMARY KEY, struct struct_demo)
/

CREATE TABLE t_varray (id INTEGER PRIMARY KEY, array varray_demo)
/
CREATE TABLE relacional (id INTEGER, orden INTEGER, valor INTEGER, PRIMARY KEY(id,orden))
/

Conversión de objetos (estructuras)

La conversión entre objetos estructuras y tipos elementales es simple:

Conversión de objetos estructura a relacional

La conversión de objetos a relacional se puede realizar simplemente accediendo a los elementos de los objetos:

SELECT t.struct.a1 a1, t.struct.a2 a2, t.struct.a3 a3 FROM t_struct t WHERE id = :valor;

Obsérvsese: se debe utilizar un alias para el nombre de la tabla. Así lo exige la sintaxis de objetos

También se puede crear una vista que esconda la conversión y utilizar la vista como una tabla relacional:

CREATE OR REPLACE VIEW v_struct AS
SELECT id, t.struct.a1 a1, t.struct.a2 a2, t.struct.a3 a3
FROM t_struct t
/

SELECT a1, a2, a3 FROM v_struct WHERE id = :valor;

En este caso, también debemos utilizar el alias para la tabla.

Conversión de relacional a objeto estructura

Esta conversión se realiza mediante el constructor del objeto:

INSERT INTO t_struct (id, struct) VALUES (3, struct_demo(5,6,7));
INSERT INTO t_struct (id, struct) VALUES (:id, struct_demo(:a1, :a2, :a3));

Si tenemos creada la vista anterior v_struct, se pueden crear triggers INSTEAD OF INSERT, UPDATE y DELETE para esconder totalmente los aspectos de objetos.

P.E.:

CREATE OR REPLACE TRIGGER trigger_insert_v_struct
INSTEAD OF INSERT
ON v_struct
AS
BEGIN
  INSERT INTO t_struct (id, struct) VALUES (:NEW.id, struct_demo(:NEW.a1, :NEW.a2, NEW:a3));
END;
/

Conversión de varrays

Esta conversión es un poco más compleja puesto que hay una relación m:n en el número de registros.

Conversión de varray a relacional

Dada una tabla con un campo varray, se puede obtener una vista relacional de la misma a través de una vista del tipo (obsérvense los alias: son obligatorios)

CREATE OR REPLACE VIEW v_varray (id, valor)   -- Se debe dar nombre a los campos, puesto que los elementos de un varray no tienen nombre
AS
SELECT t.id, a.*    -- Como los elementos no tienen nombre, se accede a ellos mediante '*'
FROM t_varray t, TABLE(t.array) a;

SELECT valor FROM v_varray WHERE id = :valor;

Conversión de varray a relacional

Esta conversión ya la hemos visto anteriormente: se puede realizar mediente PL y BULK COLLECT INTO:

DECLARE
array varray_demo;
BEGIN
  SELECT valor
  BULK COLLECT INTO array
  FROM relacional
  WHERE id = :valor
  ORDER BY orden;
END;
/