¿Qué significa esto y cómo puedo evitarlo?Oracle: secuencia MySequence.currval aún no está definida en esta sesión
SELECT MySequence.CURRVAL FROM DUAL;
Resultado:
ORA-08002: MySequence.CURRVAL secuencia aún no se define en esta sesión
¿Qué significa esto y cómo puedo evitarlo?Oracle: secuencia MySequence.currval aún no está definida en esta sesión
SELECT MySequence.CURRVAL FROM DUAL;
Resultado:
ORA-08002: MySequence.CURRVAL secuencia aún no se define en esta sesión
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!
Resulta que no se puede utilizar CURRVAL hasta que haya utilizado NEXTVAL al menos una vez en su sesión.
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.
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
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'
¡Genial! Simplemente no entiendo por qué conviertes 'Last_number' en char. –
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
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
¡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í! –
Eso es un poco confuso, porque no es nextval tan garantizado? ¿Por qué no funciona currval como nextval? – user1958756