¿Existe una instrucción SQL para recuperar el valor de una secuencia que no la incrementa?
Gracias.
EDICIÓN Y CONCLUSIÓN
Como dijo Justin Cave, no es útil tratar de "guardar" el número de secuencia
select a_seq.nextval from dual;
es lo suficientemente bueno como para verificar un valor de secuencia.
Todavía mantengo a Ollie como la buena porque respondió la pregunta inicial. pero pregúntese sobre la necesidad de no modificar la secuencia si alguna vez quiere hacerlo.
nextval
la secuencia de la prueba? No estás asumiendo que las secuencias estarán libres de huecos, ¿verdad? Por lo tanto, "perder" un valor de secuencia no debería ser un problema.Respuestas:
Puede obtener una variedad de metadatos de secuencia de
user_sequences
,all_sequences
ydba_sequences
.Estas vistas funcionan a través de sesiones.
EDITAR:
Si la secuencia está en su esquema predeterminado, entonces:
Si quieres todos los metadatos, entonces:
Espero eso ayude...
EDIT2:
Una forma larga y sin aliento de hacerlo de manera más confiable si el tamaño de su caché no es 1 sería:
Solo tenga en cuenta que si otros usan la secuencia durante este tiempo, ellos (o usted) pueden obtener
Además, es posible que desee establecer la memoria caché
NOCACHE
antes del restablecimiento y luego volver a su valor original para asegurarse de que no haya almacenado en la memoria caché muchos valores.fuente
ALL_SEQUENCES
Es una vista. Si no tiene acceso a él, intente seleccionarUSER_SEQUENCES
si la secuencia está en su esquema predeterminado. (No necesitará lasequence_owner = '<sequence_owner>'
cláusula paraUSER_SEQUENCES
).LAST_NUMBER
enALL_SEQUENCES
no será el último número que una sesión se da realmente y no será el número que se devuelve desde una llamada asequence_name.nextval
en general. Suponiendo que haya configurado la secuencia enCACHE
más de 1 (el valor predeterminado es 20),LAST_NUMBER
será el último número que está en la memoria caché. No hay garantía de que este número se otorgue realmente a ninguna sesión.ALTER SEQUENCE seq INCREMENT BY -1;
va a ser un problema a menos que se pueda garantizar que ninguna otra sesión llameseq.nextval
. De lo contrario, la secuencia entregará valores duplicados, que generalmente no es lo que uno quiere.select MY_SEQ_NAME.currval from DUAL;
Tenga en cuenta que solo funciona si se ejecutó
select MY_SEQ_NAME.nextval from DUAL;
en las sesiones actuales.fuente
Mi respuesta original fue objetivamente incorrecta y me alegro de que se haya eliminado. El siguiente código funcionará en 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, encontré 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.
Lamentablemente, si no modificó la secuencia en su sesión, creo que otros tienen razón al afirmar que NEXTVAL es el único camino a seguir.
fuente
Esto no es una respuesta, realmente y lo habría ingresado como un comentario si la pregunta no hubiera sido bloqueada. Esto responde a la pregunta:
¿Por qué lo quieres?
Suponga que tiene una tabla con la secuencia como clave principal y la secuencia es generada por un activador de inserción. Si desea tener la secuencia disponible para actualizaciones posteriores del registro, debe tener una forma de extraer ese valor.
Para asegurarse de obtener el correcto, es posible que desee ajustar la consulta INSERT y RonK en una transacción.
La consulta de RonK:
En el escenario anterior, la advertencia de RonK no se aplica ya que la inserción y la actualización sucederían en la misma sesión.
fuente
También intenté usar CURRVAL, en mi caso para averiguar si algún proceso insertó nuevas filas en alguna tabla con esa secuencia como Clave primaria. Mi suposición fue que CURRVAL sería el método más rápido. Pero a) CurrVal no funciona, solo obtendrá el valor anterior porque está en otra sesión de Oracle, hasta que haga un NEXTVAL en su propia sesión. Y b) a
select max(PK) from TheTable
también es muy rápido, probablemente porque una PK siempre está indexada. Oselect count(*) from TheTable
. Todavía estoy experimentando, pero ambos SELECT parecen rápidos.No me importa una brecha en una secuencia, pero en mi caso estaba pensando en sondear mucho, y odiaría la idea de brechas muy grandes. Especialmente si un SELECT simple sería igual de rápido.
Conclusión:
fuente