Debes tener en cuenta que no se puede acceder directamente a los atributos de un objeto referenciado que se encuentre almacenado en una tabla. Para ello, puedes utilizar la función DEREF
.
Esta función toma una referencia a un objeto y retorna el valor de ese objeto.
Vamos a verlo en un ejemplo suponiendo que disponemos de las siguientes variable declaradas:
u_ref REF Usuario;
u1 Usuario;
Si u_ref
hace referencia a un objeto de tipo Usuario
que se encuentra en la tabla UsuariosObj
, para obtener información sobre alguno de los atributos de dicho objeto referenciado, hay que utilizar la función DEREF
.
Esta función se utiliza como parte de una consulta SELECT
, por lo que hay que utilizar una tabla tras la cláusula FROM
. Esto puede resultar algo confuso, ya que las referencias a objetos apuntan directamente a un objeto concreto que se encuentra almacenado en una determinada tabla. Por tanto, no debería ser necesario indicar de nuevo en qué tabla se encuentra. Realmente es así. Podemos hacer referencia a cualquier tabla en la consulta, y la función DEREF
nos devolverá el objeto referenciado que se encuentra en su tabla correspondiente.
La base de datos de Oracle ofrece la tabla DUAL
para este tipo de operaciones. Esta tabla es creada de forma automática por la base de datos, es accesible por todos los usuarios, y tiene un solo campo y un solo registro. Por tanto, es como una tabla comodín.
SELECT DEREF(u_ref) INTO u1 FROM Dual;
dbms_output.put_line(u1.nombre);
Por tanto, para obtener el objeto referenciado por una variable REF
, debes utilizar una consulta sobre cualquier tabla, independientemente de la tabla en la que se encuentre el objeto referenciado. Sólo existe la condición de que siempre se obtenga una solo fila como resultado. Lo más cómodo es utilizar esa tabla DUAL
. Aunque se use esa tabla comodín, el resultado será un objeto almacenado en la tabla UsuariosObj.
DECLARE
US USUARIO;
U_REF REF USUARIO;
BEGIN
SELECT REF(U) INTO U_REF FROM UsuObj u WHERE u.login = 'luitom64';
SELECT DEREF(u_ref) INTO us FROM dual;
dbms_output.put_line(us.nombre);
END;