Los identificadores únicos asignados por Oracle a los objetos que se almacenan en una tabla, permiten que éstos puedan ser referenciados desde los atributos de otros objetos o desde las columnas de tablas. El tipo de datos proporcionado por Oracle para soportar esta facilidad se denomina REF. Un atributo de tipo REF almacena una referencia a un objeto del tipo definido, e implementa una relación de asociación entre los dos tipos de objetos. Estas referencias se pueden utilizar para acceder a los objetos referenciados y para modificarlos; sin embargo, no es posible operar sobre ellas directamente. Para asignar o actualizar una referencia se debe utilizar siempre REF o NULL.
Cuando se define una columna de un tipo a REF, es posible restringir su dominio a los objetos que se almacenen en cierta tabla. Si la referencia no se asocia a una tabla sino que sólo se restringe a un tipo de objeto, se podrá actualizar a una referencia a un objeto del tipo adecuado con independencia de la tabla donde se almacene. En este caso su almacenamiento requerirá más espacio y su acceso será menos eficiente. El siguiente ejemplo define un atributo de tipo REF y restringe su dominio a los objetos de cierta tabla.
CREATE TABLE clientes_tab OF cliente_t;
CREATE TYPE ordenes_t AS OBJECT (
ordnum NUMBER,
cliente REF clientes_t,
fechpedido DATE,
direcentrega direccion_t);
CREATE TABLE ordenes_tab OF ordenes_t (
PRIMARY KEY (ordnum));
No es posible navegar a través de referencias en procedimientos SQL. Para esto es necesario utilizar el operador DEREF (abreviatura del término inglés dereference : derreferenciar un puntero es obtener el valor al cual apunta). DEREF toma como argumento una referencia a un objeto y devuelve el valor de dicho objeto. Si la referencia está colgada, DEREF devuelve el valor NULL.
En el ejemplo que sigue se derreferencia una referencia a un objeto Person de la tabla DUAL2. En estas circunstancias, no es necesario especificar una tabla de objetos ni un criterio de búsqueda ya que cada objeto almacenado en una tabla de objetos cuenta con un identificador de objeto único e inmutable que es parte de
cada referencia a un objeto.
DECLARE
p1 Person ;
p_ref REF Person ;
name VARCHAR2(15) ;
BEGIN
...
/*Supongamos que p_ref contiene una referencia valida a un objeto almacenado en una tabla de objetos*/
SELECT DEREF( p_ref) INTO p1 FROM DUAL;
name := p1.last_n ame ;
CREATE TYPE PersonRef AS OBJECT (pref REF Person) ;
/
DECLARE
name VARCHAR2(15) ;
pr_ref REF Pe r sonRe f ;
pr PersonRef ;
p Person ;
BEGIN
. . .
/*Supongamos que pr_ref contiene una referencia valida*/
SELECT DEREF( pr_ref ) INTO pr FROM DUAL;
SELECT DEREF( pr.p_ref ) INTO p FROM DUAL;
name := p.last_name ;
...
END;
/