lunes, 7 de diciembre de 2015

Oracle Database 12c: Manejo de secuencias a nivel de SESSION

En Oracle Database 12c, es posible crear una secuencia a nivel de sesión de usuario, que produce una salida de un valor único, durante la permanencia del usuario conectado a la base de datos. Una vez que el usuario se desconecta y vuelve a conectarse, volverá a reiniciar la secuencia con el primer valor entregable, según su definición.

Veamos un ejemplo.

Vamos a conectarnos con el usuario "hr" y su clave "hr" a nuestra base de datos de pruebas con Oracle Database 12c Standard Edition 2.

SQL> connect hr/hr@pdb1
Connected.

Ahora vamos a crear la secuencia. La diferencia radica en la sintaxis de la sentencia, durante la creación de la secuencia con la inclusión del parámetro "session" al final de la misma.

SQL> create sequence numero_consec_a_nivel_session
  2  start with 1 increment by 1
  3  session
  4  /

Sequence created.

Creamos una tabla de trabajo, que contenga dos columnas. Una para guardar el valor del consecutivo de la secuencia y otro para un valor caracter de diferenciación.

SQL> create table t2(secuencia number, descripcion char(1));

Table created.

A través de un simple bloque de código anónimo, vamos a insertar registros dentro de la tabla. Qué tal unos 100 registros en consecutivo utilizando la secuencia creada y el caracter "x".

SQL> begin
  2  for i in 1.. 100 loop
  3  insert into t2 select numero_consec_a_nivel_session.nextval, 'x' from dual;
  4  end loop;
  5  end;
  6  /

PL/SQL procedure successfully completed.

Salimos de la sesión conectada a la base de datos y nos volvemos a conectar.

SQL> exit
Disconnected from Oracle Database 12c Standard Edition Release 12.1.0.2.0 - 64bit Production
[oracle@oracle12cse2 ~]$ sqlplus hr/hr@pdb1

SQL*Plus: Release 12.1.0.2.0 Production on Mon Dec 7 16:02:04 2015

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

Last Successful login time: Mon Dec 07 2015 15:57:06 -06:00

Connected to:
Oracle Database 12c Standard Edition Release 12.1.0.2.0 - 64bit Production

Una vez conectados nuevamente, vamos a volver a insertar registros en la tabla "t2", pero esta vez con el caracter "y" para distinguir los registros ingresados en la primera sesión y luego los ingresados en esta nueva sesión.

SQL> begin
for i in 1.. 100 loop
insert into t2 select numero_consec_a_nivel_session.nextval, 'y' from dual;
end loop;
end;
/

Verifiquemos el contenido de la tabla "T2". Primero mostremos los primeros 5 registros únicamente.

SQL> select * from t2 fetch first 5 rows only;

 SECUENCIA D
---------- -
         1 x
         2 x
         3 x
         4 x
         5 x

Ahora, mostrando los 5 registros posteriores después de saltar 95 registros o lo que sería igual, los últimos 5 registros que ingresamos en la primera sesión del usuario HR.

SQL> select * from t2 offset 95 rows fetch next 5 rows only;

 SECUENCIA D
---------- -
        96 x
        97 x
        98 x
        99 x
       100 x

Continuamos verificando el funcionamiento de la secuencia a nivel de "SESSION". Ahora vamos a ver los 5 registros insertados después de los primeros 99.

SQL> select * from t2 offset 99  rows fetch next 5 rows only;

 SECUENCIA D
---------- -
       100 x
         1 y
         2 y
         3 y
         4 y

Como pueden observar, cuando ejecutamos por segunda vez el código del bloque anónimo para la inclusión de 100 nuevos registros, la secuencia devolvió para el primer registro ingresado con el control diferenciador "Y", el valor inicial con el cuál se creo la secuencia, o sea el valor 1.

Por último, vamos a ver los últimos registros ingresados en el segundo "INSERT" realizado.

SQL> select * from t2 offset 195 rows fetch next 5 rows only;

 SECUENCIA D
---------- -
        96 y
        97 y
        98 y
        99 y
       100 y
SQL>

Por si no lo sabían, ahí tienen una nueva funcionalidad de la base de datos.

Posdata: Agradecimiento a Alex Zaballa, por dar a conocer esta funcionalidad en el ORAMEX de Guadalajara, recién pasado.

No hay comentarios:

Publicar un comentario en la entrada

Te agradezco tus comentarios. Te esperamos de vuelta.