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.
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.
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.
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.
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