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