sql - todas - ¿Cómo recuperar el valor actual de una secuencia de oráculo sin incrementarlo?
secuencias pl sql (3)
¿Hay una instrucción SQL para recuperar el valor de una secuencia que no lo incrementa?
Gracias.
EDITAR Y CONCLUSIÓN
Como dice Justin Cave No es útil intentar "guardar" el número de secuencia para
select a_seq.nextval from dual;
es lo suficientemente bueno para verificar un valor de secuencia.
Sigo manteniendo la respuesta de Ollie como la buena porque respondió la pregunta inicial. pero pregúntate sobre la necesidad de no modificar la secuencia si alguna vez quieres hacerlo.
Mi respuesta original fue objetivamente incorrecta y me alegro de que haya sido eliminada. 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 cuando 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;
Tristemente, si no modificó la secuencia en su sesión, creo que otros están en lo cierto al afirmar que NEXTVAL es la única manera de hacerlo.
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
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 en todas 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 eso ayude...
EDIT2:
Una manera 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 en cuenta que si otros usan la 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 el caché en NOCACHE
antes del restablecimiento y luego volver a su valor original después para asegurarse de que no ha almacenado en caché una gran cantidad de valores.