Cómo recuperar el valor actual de una secuencia de oracle sin incrementarlo?


Existe una instrucción SQL para recuperar el valor de una secuencia que no la incrementa.

Gracias.

EDITAR Y CONCLUSIÓN

Como dijo Justin Cave, no es útil tratar de "guardar" el número de secuencia, por lo que

select a_seq.nextval from dual;

Es lo suficientemente bueno para comprobar un valor de secuencia.

Todavía mantengo la respuesta de Ollie como la buena porque respondió a la pregunta inicial. pero pregúntate sobre la necesidad de no modificar la secuencia si alguna vez quieres hacer se.

Author: wolφi, 2012-04-18

3 answers

SELECT last_number
  FROM all_sequences
 WHERE sequence_owner = '<sequence owner>'
   AND sequence_name = '<sequence_name>';

Puede obtener una variedad de metadatos de secuencia de user_sequences, all_sequences y dba_sequences.

Estas vistas funcionan a través de las sesiones.

EDITAR:

Si la secuencia está en su esquema predeterminado entonces:

SELECT last_number
  FROM user_sequences
 WHERE sequence_name = '<sequence_name>';

Si quieres todos los metadatos entonces:

SELECT *
  FROM user_sequences
 WHERE sequence_name = '<sequence_name>';

Espero que ayude...

EDIT2:

Una forma larga de hacerlo de manera más confiable si su tamaño de caché no es 1 sería:

SELECT increment_by I
  FROM user_sequences
 WHERE sequence_name = 'SEQ';

      I
-------
      1

SELECT seq.nextval S
  FROM dual;

      S
-------
   1234

-- Set the sequence to decrement by 
-- the same as its original increment
ALTER SEQUENCE seq 
INCREMENT BY -1;

Sequence altered.

SELECT seq.nextval S
  FROM dual;

      S
-------
   1233

-- Reset the sequence to its original increment
ALTER SEQUENCE seq 
INCREMENT BY 1;

Sequence altered.

Solo tenga cuidado de que si otros están utilizando el secuencia durante este tiempo-ellos (o usted) pueden obtener

ORA-08004: sequence SEQ.NEXTVAL goes below the sequences MINVALUE and cannot be instantiated

Además, es posible que desee establecer la caché en NOCACHE antes del restablecimiento y luego volver a su valor original después para asegurarse de que no ha almacenado en caché muchos valores.

 138
Author: Ollie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-18 14:20:00

select MY_SEQ_NAME.currval from DUAL;

Tenga en cuenta que solo funciona si ejecutó select MY_SEQ_NAME.nextval from DUAL; en las sesiones actuales.

 104
Author: RonK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-18 13:23:12

Mi respuesta original era objetivamente incorrecta y me alegro de que se eliminara. El siguiente código funcionará bajo las siguientes condiciones a) usted sabe que nadie más modificó la secuencia b) la secuencia fue modificada por su sesión. En mi caso, me encontré con un problema similar en el que estaba llamando a un procedimiento que modificó un valor y estoy seguro de que la suposición es cierta.

SELECT mysequence.CURRVAL INTO v_myvariable FROM DUAL;

Lamentablemente, si no modificaste la secuencia en tu sesión, creo que otros están en lo correcto al afirmar que NEXTVAL es el único camino a seguir.

 0
Author: georgejo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-13 14:08:46