Saltar al contenido
Codifíca.me | Desarrollo web | Programación

Secuencias Oracle.

27 junio, 2012

Vamos a crear una secuencia en Oracle. Así os explicaré la nueva manera de poder acceder a los valores de ella en Oracle 11g.

DROP SEQUENCE SEQ_NXT
/
 
CREATE SEQUENCE SEQ_NXT
START WITH 1
MAXVALUE 99999
MINVALUE 1
CYCLE -- Cuando llegue al valor máximo comenzará desde el princio
NOCACHE
NOORDER
/

Estos son los valores que puede tener la creación de la secuencia:

– La cláusula “start with” indica el valor desde el cual comenzará la generación de números secuenciales. Si no se especifica, se inicia con el valor que indique “minvalue”.

– La cláusula “increment by” especifica el incremento, es decir, la diferencia entre los números de la secuencia; debe ser un valor numérico entero positivo o negativo diferente de 0. Si no se indica, por defecto es 1.

– “maxvalue” define el valor máximo para la secuencia. Si se omite, por defecto es 99999999999999999999999999.

– “minvalue” establece el valor mínimo de la secuencia. Si se omite será 1.

– La cláusula “cycle” indica que, cuando la secuencia llegue a máximo valor (valor de “maxvalue”) se reinicie, comenzando con el mínimo valor (“minvalue”) nuevamente, es decir, la secuencia vuelve a utilizar los números. Si se omite, por defecto la secuencia se crea “nocycle”.

Si no se especifica ninguna cláusula, excepto el nombre de la secuencia, por defecto, comenzará en 1, se incrementará en 1, el mínimo valor será 1, el máximo será 999999999999999999999999999 y “nocycle”.

– CACHE / NOCACHE el uso de CACHE permite indicar cuantos valores queremos que sean guardados en memoria para una acceso más rápido. El inconveniente que tiene es que en caso de una caida del sistema, los valores generados por la secuencia se pierden y quedarian “huecos”.

Ahora recuperaremos el valor actual y el siguiente de la secuencia para ellos utilizaremos:

NEXTVAL y CURRVAL
La pseudo columna NEXTVAL es utilizada para extraer un número sucesivo de la secuencia especificada. Se debe cualificar NEXTVAL con el nombre de la secuencia. Cuando utilizas sequence.NEXTVAL, un nuevo número de la secuencia es generado y el número de la secuencia actual es puesto en CURRVAL.
La pseudo columna CURRVAL es usada para referirse al número de la secuencia que el usuario ha generado. NEXTVAL debe ser usado para generar un número de secuencia en la sesión actual del usuario antes de que CURRVAL pueda ser utilizado.

Ahora os pondré un ejemplo para recuperar estos valores:

DECLARE
  l_start NUMBER;
  l_loops NUMBER;
  l_valor NUMBER;
BEGIN
  l_loops:=1000;
  l_start:= DBMS_UTILITY.get_time;
  -- Si utilizais una versión anterior a Oracle 11g debeis utilizar sólo esta forma para acceder a la secuencia.
  FOR i IN 1..l_loops LOOP
   <strong> SELECT SEQ_NXT.NEXTVAL INTO l_valor FROM DUAL;</strong>
  END LOOP;
  DBMS_OUTPUT.PUT_LINE ('NEXTVAL SELECT '||(DBMS_UTILITY.get_time - l_start) ||' hsecs ');
  l_start:= DBMS_UTILITY.get_time;
-- Esta se ha implementado a partir de Oracle 11g y también podeís acceder a ella así. Incluso, según comenta la página de Oracle, más rápido.
  FOR i IN 1..l_loops LOOP
   <strong> l_valor:= SEQ_NXT.NEXTVAL;</strong>
  END LOOP;
  DBMS_OUTPUT.PUT_LINE ('NEXTVAL = '||(DBMS_UTILITY.get_time - l_start) ||' hsecs ');
  l_start:= DBMS_UTILITY.get_time;
  FOR i IN 1..l_loops LOOP
    SELECT SEQ_NXT.CURRVAL INTO l_valor FROM DUAL;
  END LOOP;  
  DBMS_OUTPUT.PUT_LINE ('NEXTVAL SELECT '||(DBMS_UTILITY.get_time - l_start) ||' hsecs ');
  l_start:= DBMS_UTILITY.get_time;
  FOR i IN 1..l_loops LOOP
    l_valor:= SEQ_NXT.CURRVAL;
  END LOOP;
  DBMS_OUTPUT.PUT_LINE ('CURRVAL = '|| (DBMS_UTILITY.get_time - l_start) ||' hsecs ');
EXCEPTION
  WHEN OTHERS THEN
     DBMS_OUTPUT.PUT_LINE('ERROR :' || SQLERRM);
END;
/

Si veis los tiempos, tampoco hay mucha diferencia:

NEXTVAL SELECT 18 hsecs
NEXTVAL = 17 hsecs
NEXTVAL SELECT 1 hsecs
CURRVAL = 2 hsecs

PL/SQL procedure successfully completed.

Os dejo aquí lo que ocurriría al ejecutarlo en 10g o anteriores.

l_valor:= SEQ_NXT.NEXTVAL;
*
ERROR at line 14:
ORA-06550: line 14, column 24:
PLS-00357: Table,View Or Sequence reference ‘SEQ_NXT.NEXTVAL’ not allowed in
this context
ORA-06550: line 14, column 6:
PL/SQL: Statement ignored
ORA-06550: line 24, column 24:
PLS-00357: Table,View Or Sequence reference ‘SEQ_NXT.CURRVAL’ not allowed in
this context
ORA-06550: line 24, column 6:
PL/SQL: Statement ignored