Oracle utiliza el operador "REF" , que devuelve el id de los objetos de una tabla de objetos. Un atributo de tipo "REF" guarda la referencia a un objeto del tipo definido e implementa una relacion entre los dos tipos de objetos. Esta referencia permite acceder a los objetos referenciados y modificar la información , pero no se puede operar directamente sobre la referencia. (dicho con otras palabras, no es un puntero) .
Explicacion para tontos:
Tienes una tabla A que guarda objetos A, y una tabla B que guarda objetos B, en la clase A tienes un atributo que hace referencia a un objeto B , pero no necesariamente tiene que existir dentro de la tabla B.
entonces , si quieres que en la tabla A solo se guarden objetos con referencia a objetos B , QUE SÍ EXISTEN, y se guardan en la tabla B, tienes que especificarlo con el operador "SCOPE" , de esta forma se evita guardar espacio en memoria para un ipotetico objeto B que aun no existe en la tabla B.
El siguiente ejemplo muestra como se restringe que dentro de la tabla B solo se puedan añadir objetos que sí existen dentro de la tabla A
Ejemplo :
CREATE TYPE obj_A AS OBJECT( .... .... .... ); /* Clase A*/
CREATE TABLE tab_A OF obj_A;
CREATE TYPE obj_B AS OBJECT ( /* Clase B*/
ordnum NUMBER,
cliente REF obj_A,
fechpedido DATE,
direcentrega direccion_t);
CREATE TABLE tab_B OF obj_B (
PRIMARY KEY (ordnum),
SCOPE FOR (cliente) IS tab_A);
);
PROBLEMA : al borrar un objeto de la tabla A , en la tabla B los objetos aun mantienen la referencia al objeto borrado, y al hacer un select , Oracle muestra un error de referencia colgada (dangling references)
, para evitar esto se pude deshacer la referencia con "DEREF", pero la solución más facil es hacer esa referencia que sea una clave externa (foreign key) . La tabla B quedaría de esta forma:
CREATE TABLE tab_B OF obj_B (
PRIMARY KEY (ordnum),
FOREIGN KEY (cliente) REFERENCES tab_A,
ON DELETE CASCADE /*si se borrar un objeto A se borran todos los B que estén relacionados */
);
Este comentario ha sido eliminado por el autor.
ResponderEliminarEste comentario ha sido eliminado por el autor.
ResponderEliminarGracias, tu ejemplo me ha aclarado las dudas que tenia :D
ResponderEliminarHola Shiroi Ōkami,
ResponderEliminarMe alegro mucho.