Oracle: la sequenza MySequence.currval non è ancora stata definita in questa sessione

StackOverflow https://stackoverflow.com/questions/809247

  •  03-07-2019
  •  | 
  •  

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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top