Tradueix

viernes, 7 de julio de 2017

Variables de sesión en Oracle

En Oracle se pueden crear variables de sesión. De esas cuyo alcance se limita a la sesión que la ha creado y por tanto cuando se cierre la sessión desaparecerà.
Veamos como se crean y en un post posterior veremos alguna posible aplicación práctica a modo de ejemplo:

Primero que nada, como usuario SYS debemos dar permiso al usuario que usemos para poder crear el contexto:

conn / as sysdba

grant create any context to usuario ;
grant execute on sys.dbms_session to usuario ;

Nos conectamos como el susodicho usuario y creamos el contexto :

CREATE OR REPLACE CONTEXT nombre_contexto USING context_package;

Con esto asociamos un nombre "nombre_contexto" a un paquete que vamos a crear a continuación y que le daremos el nombre "context_package" y que contendrá un procedure para instanciar variables dentro del contexto mediante la llamada a la funcion dbms_session.set_context:
  
create or replace package context_package
as
  procedure set_context_value(par in varchar2, val in varchar2);
end avl_context_package;


create or replace package body context_package
as
procedure set_context_value(par in varchar2, val in varchar2)
as
begin
  dbms_session.set_context('nombre_contexto',par,val);
end;
end avl_context_package;


Muy importante: Este problema me provocó verdaderos dolores de cabeza hasta que no lo descubrí. Oracle me devolvía el error ORA-01031: Insufficient privileges sin aparente sentido. Y es que el nombre del contexto que se establece en dbms_session.set_context('nombre_contexto',par,val); debe coincidir con el nombre de creación del contexto:
CREATE OR REPLACE CONTEXT nombre_contexto USING context_package;
Ahora me parece obvio pero, cuando se prueba sin pensar demasiado, no lo es tanto. 

Para añadir una variable y un valor llamaremos al procedure indicándole el valor que queremos asignar a una variable de sesión que queramos instanciar de la siguiente manera:

call CONTEXT_PACKAGE.SET_CONTEXT_VALUE('variable','VALOR');

A partir de ese momento, para consultar el valor de una variable instanciada en la sesión debemos usar la funcion SYS_CONTEXT tal que así:

select SYS_CONTEXT('nombre_contexto', 'variable') from dual;
deberia devolver:
'VALOR'

Nos vemos.

Seja o primeiro a comentar

Publicar un comentario

Oracle Wars © 2008. Template by Dicas Blogger.

TOPO