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!
fonte
2009-05-01 10:35:13
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
È 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ì! –
Questo è un po 'di confusione, perché non è nextval così garantito? Perché currval non può funzionare come nextval? – user1958756