2009-04-30 49 views

Respuesta

40

mysequence.CURRVAL devuelve el último valor que se obtiene a partir de la secuencia mysequence en su sesión de, y por lo tanto no está definido hasta que haya obtenido un valor utilizando mysequence.NEXTVAL al menos una vez en la sesión. El propósito de CURRVAL es permitirle usar el valor de secuencia más de una vez en su código, p.

insert into parent (parent_id, ...) values (mysequence.NEXTVAL, ...); 

insert into child (parent_id, ...) values (mysequence.CURRVAL, ...); 

Si CURRVAL acabamos de volver el último valor obtenido a partir de la secuencia de cualquier sesión, entonces sería inútil en el código anterior, y de hecho podría dar lugar a daños en los datos!

+0

Eso suena como una excusa. Si pudieras estar seguro de que ninguna otra sesión estaba usando la secuencia, en teoría no puedes, pero en la práctica puedes hacerlo, entonces sería extremadamente útil como lo sería si quisieras saber cuál fue el último valor devuelto en una sesión. aunque esa no es una situación particularmente común, es en la que yo estaba cuando tropecé con esta respuesta. Voy a tener que seguir usando una variable para almacenar el valor de la secuencia, supongo. – user1958756

+1

¡Es más que una excusa! Un currival que sea global sería inútil a menos que pueda garantizarse que se mantenga cierto, lo que implica la serialización de las transacciones, lo que conduce a la falta de escalabilidad, que es una de las principales ventajas de las secuencias. ¡Realmente no quieres que currval funcione así! –

+0

Eso es un poco confuso, porque no es nextval tan garantizado? ¿Por qué no funciona currval como nextval? – user1958756

20

Resulta que no se puede utilizar CURRVAL hasta que haya utilizado NEXTVAL al menos una vez en su sesión.

3

Doug,

La verdadera pregunta es por qué necesita el currval cuando no se ha utilizado un nextval en su sesión? Puede mirar la columna LAST_NUMBER de la vista USER/ALL/DBA_SEQUENCES, pero piense en los problemas de concurrencia cuando comience a usar eso.

Saludos, Rob.

+2

Debido a que algunos desarrolladores no estaban usando la secuencia al insertar filas, la secuencia se había caído de sincronización. Estaba tratando de obtener el valor actual para poder determinar el incremento correcto para una SECUENCIA DE ALTERACIÓN. Una vez que me di cuenta de que necesitaba un NEXTVAL primero, acabo de usar NEXTVAL en su lugar, ya que también se adaptaba a mis propósitos. – Doug

10

uso de este

select sequence_name, 
    to_char(min_value) min_value, 
    to_char(max_value) max_value, 
    increment_by, 
    cycle_flag, 
    order_flag, 
    cache_size, 
    to_char(Last_number) last_number 
from user_sequences 
where sequence_name='MYSEQUENCE' 
+0

¡Genial! Simplemente no entiendo por qué conviertes 'Last_number' en char. –

2
select * from user_sequences  where sequence_name='SEQ_V_WORKORDER_RECNO'; 

en la consulta anterior SEQ_V_WORKORDER_RECNO mi nombre secuencia de sustituirlo por el nombre de la secuencia

Cuestiones relacionadas