2009-04-30 12 views

risposta

40

mysequence.CURRVAL restituisce il valore più recente che è stato ottenuto dalla sequenza mysequence in la sessione, e quindi non è definito fino ad ottenere un valore utilizzando mysequence.NEXTVAL almeno una volta nella sessione. Lo scopo di CURRVAL è quello di farti 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 appena restituito l'ultimo valore ottenuto dalla sequenza da qualsiasi sessione, allora sarebbe inutile nel codice di cui sopra, e di fatto potrebbe portare alla corruzione dei dati!

+0

Sembra una scusa. Se potessi essere sicuro che nessun'altra sessione stia usando la sequenza - in teoria non puoi farlo ma in pratica puoi farlo - allora sarebbe estremamente utile come sarebbe se volessi sapere qual è stato l'ultimo valore restituito in ogni sessione - anche se questa non è una situazione particolarmente comune, è proprio quella in cui mi sono imbattuto in questa risposta. Dovrò attenermi all'utilizzo di una variabile per memorizzare il valore della sequenza, suppongo. – user1958756

+1

È più di una scusa! Una valenza globale sarebbe inutile a meno che non si potesse garantire che rimanesse vera, il che implica la serializzazione delle transazioni, il che porta alla mancanza di scalabilità, che è uno dei principali vantaggi delle sequenze. Davvero non vuoi che currval funzioni così! –

+0

Questo è un po 'di confusione, perché non è nextval così garantito? Perché currval non può funzionare come nextval? – user1958756

20

Si scopre che non è possibile utilizzare CURRVAL finché non è stato utilizzato NEXTVAL almeno una volta nella sessione.

3

Doug,

La vera domanda è perché è necessario il currval quando non è stato utilizzato un nextval nella sessione? Puoi guardare la colonna LAST_NUMBER della vista USER/ALL/DBA_SEQUENCES, ma pensa ai problemi di concorrenza quando inizi ad usarlo.

Cordiali saluti, Rob.

+2

Dal momento che alcuni sviluppatori non sono stati utilizzando la sequenza in cui l'inserimento di righe, la sequenza era caduto fuori di sincronizzazione. Stavo cercando di ottenere il valore corrente in modo da poter determinare l'incremento corretto per una SEQUENZA ALTER. Una volta capito che avevo bisogno di un NEXTVAL per primo, usavo solo NEXTVAL, in quanto si adattava anche ai miei scopi. – Doug

10

uso 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' 
+0

Ottimo! Semplicemente non capisco perché converti 'Last_number' in char. –

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

nella query precedente SEQ_V_WORKORDER_RECNO mio nome sequenza di sostituirlo con il tuo nome sequenza

Problemi correlati