Oracle: la sequenza MySequence.currval non è ancora stata definita in questa sessione
Domanda
Cosa significa e come posso aggirarlo?
SELECT MySequence.CURRVAL FROM DUAL;
Risultato:
ORA-08002: sequenza MySequence.CURRVAL non è ancora stata definita in questa sessione
Soluzione
mysequence.CURRVAL restituisce l'ultimo valore ottenuto dalla sequenza mysequence nella tua sessione, e quindi non viene definito fino a quando non hai ottenuto un valore usando mysequence.NEXTVAL almeno una volta nella sessione. Lo scopo di CURRVAL è di permetterti di usare il valore della sequenza più di una volta nel tuo codice, ad es.
insert into parent (parent_id, ...) values (mysequence.NEXTVAL, ...);
insert into child (parent_id, ...) values (mysequence.CURRVAL, ...);
Se CURRVAL ha appena restituito l'ultimo valore ottenuto dalla sequenza da qualsiasi sessione, sarebbe inutile nel codice sopra, e di fatto potrebbe portare alla corruzione dei dati!
Altri suggerimenti
Si scopre che non è possibile utilizzare CURRVAL fino a quando non si è utilizzato NEXTVAL almeno una volta nella sessione.
usa questo
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'
Doug,
La vera domanda è perché hai bisogno del currval quando non hai usato un nextval nella tua sessione? Puoi guardare la colonna LAST_NUMBER della vista USER / ALL / DBA_SEQUENCES, ma pensare ai problemi di concorrenza quando inizi a usarla.
Saluti, Rob.
select * from user_sequences where sequence_name='SEQ_V_WORKORDER_RECNO';
nella query precedente SEQ_V_WORKORDER_RECNO
il nome della mia sequenza lo sostituisce con il nome della sequenza