Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Funzioni e Operatori > Funzioni di manipolazione sequenze
PrecedenteFunzioni XMLEspressioni condizionaliSuccessivo

9.15. Funzioni di manipolazione sequenze

Questa sezione descrive le funzioni PostgreSQL™ per operare sulle oggetti di sequenza. Gli oggetti di sequenza (chiamati anche generatori di sequenza o soltanto sequenze) sono speciali tabelle a riga singola create con ???. Un oggetto di sequenza è normalmente usato per generare identificatori unique per le righe di una tabella. Le funzioni di sequenza, elencate nella tabella Tabella 9.39, «Funzioni di sequenza», forniscono metodi semplici, sicuri e multiutente per ottenere successivi valori di sequenza dagli oggetti di sequenza.

Tabella 9.39. Funzioni di sequenza

FunzioneTipo di ritornoDescrizione
currval(regclass)bigintIl valore di ritorno ottenuto più recentemente con nextval per la specifica sequenza
lastval()bigintIl valore di ritorno ottenuto più recentemente con nextval per ogni sequenza
nextval(regclass)bigintAvanza nella sequenza e restituisce il nuovo valore
setval(regclass, bigint)bigintImpsta il valore corrente della sequenza
setval(regclass, bigint, boolean)bigintImposta il valore corrente della sequenza e la flag is_called

La sequenza su cui operare è specificata da un argomento regclass, che è semplicemente l'OID della sequenza nel catalogo di sistema pg_class. Non si deve cercare l'OID a mano, comunque, dato che regclass lo farà per te. Basta scrivere il nome della sequenza racchiuso in singoli apici così che assomigli a una costante letterale. Per compatibilità con la gestione dei nomi comuni SQL, la stringa sarà convertita a minuscolo a meno che contenga doppi apici attorno al nome della sequenza. Così:

nextval('foo')      operates on sequence foo
nextval('FOO')      operates on sequence foo
nextval('"Foo"')    operates on sequence Foo

Il nome della sequenza può essere qualificato da uno schema, se necessario:

nextval('myschema.foo')     operates on myschema.foo
nextval('"myschema".foo')   same as above
nextval('foo')              searches search path for foo

Vedere Sezione 8.16, «Tipi identificatori di oggetto» per maggiori informazioni circa regclass.

[Nota]

Nota

Prima di PostgreSQL™ 8.1, gli argomenti delle funzioni di sequenza erano di tipo text, non regclass, e la conversione descritta sopra da una stringa di testo ad un valore OID doveva essere effettuata in fase di esecuzione durante ogni chiamata. Per la compatibilità all'indietro, questo strumento esiste ancora, ma internamente esso è ora gestito come una implicita coercizione da text a regclass prima che la funzione venga chiamata.

Quando si scrive l'argomento di una funzione di sequenza come una disadorna stringa letterale, essa diventa una costante di tipo regclass. Dato che è realmente proprio un OID, essa seguirà la sequenza originariamente identificata malgrado successivamente cambierà il nome, riassegnerà lo schema, ecc. Questo comportamento «early binding» è normalmente desiderabile per riferimenti a sequenze in colonne e viste predefinite. Ma a volte si potrà volere il «late binding» dove il riferimento alla sequenza viene risolto in fase di esecuzione. Per ottenere il comportamento late-binding, forzare la costante in modo che sia memorizzata come una costante text invece di regclass:

nextval('foo'::text)      foo is looked up at runtime

Notare che late binding era il solo comportamento supportato nei rilasci di PostgreSQL™ precedenti alla versione 8.1, per cui avrete bisogno di fare ciò per preservare la semantica nelle vecchie applicazioni.

Naturalmente, l'argomento di una funzione di sequenza può essere sia un'espressione che una costante. Se è una espressione di testo allora una coercizone implicita dovrà risultare in una ricerca in fase di esecuzione.

Le funzioni di sequenza disponibili sono:

nextval

Avanza l'oggetto di sequenza al suo nuovo valore e restituisce quel valore. Ciò viene fatto automaticamente: anche se multiple sessioni di nextval saranno in esecuzione concorrentemente, ognuna riceverà sicuramente un distinto valore di sequenza.

currval

Restituisce il valore più recente ottenuto da nextval per questa sequenza nella sessione corrente. (Viene segnalato un errore se nextval non è mai stato chiamato per questa sequenza in questa sessione). Notare che dato che questo estituisce un valore di sessione locale, esso dà una risposta prevedibile, indipendentemente dal fatto che altre sessioni hanno eseguito nextval quando lo ha fatto la sessione corrente.

lastval

Ritorna il valore più recente restituito da nextval nella sessione corrente. Questa funzione è identitca a currval, eccetto che, invece di prendere come argomento il nome della sequenza, essa prende il valore dell'ultima sequenza che nextval ha usato nella sessione corrente. È un errore chiamare lastval se nextval non è stato ancora chiamato nella sessione corrente.

setval

Resetta il valore del contatore dell'oggetto sequenza. La forma dei due parametri imposta il campo last_value della sequenza al valore specificato e imposta il suo campo is_called a true, significando che il successivo nextval deve avanzare la sequenza prima di restituire un valore. Il valore riportato da currval è anch'esso impostato al valore specificato. Nella forma a tre parametri, is_called può essere impostato sia a true che a false. Se impostato a true ha lo stesso effetto come nella forma a due parametri. Se è impostato a false, il successivo nextval restituirà esattamente il valore specificato e la sequenza avanzerà a partire dal successivo nextval. Inoltre, il valore riportato da currval in questo caso non viene cambiato (questo è stato cambiato rispetto al comportamento pre-8.3). Per esempio,

SELECT setval('foo', 42);           Next nextval will return 43
SELECT setval('foo', 42, true);     Same as above
SELECT setval('foo', 42, false);    Next nextval will return 42

Il risultato restituito da setval è esattamente il valore del suo secondo argumento.

Se un oggetto sequenza è stato creato con i parametri predefiniti, le chiamate a nextval ritorneranno valori successivi cominciando con 1. Altri comportamenti possono essere ottenuti usando speciali parametri nel comando ???; per maggiori informazioni vedere le pagine di riferimento relative al comando.

[Importante]

Importante

Per evitare il bloccaggio delle transazioni correnti che ottengono numeri dalla stessa sequenza, una operazione nextval non deve mai essere rolled back; in quanto, dopo che un valore è stato assegnato esso viene considerato usato, anche se la transazione che ha usato nextval, in seguito, si è abortita. Questo significa che le transazioni abortite possono lasciare «buchi» non utilizzati nella sequenza di valori assegnati. Neanche le operazioni setval dovranno mai essere sottoposte a rollback.

Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Funzioni e Operatori > Funzioni di manipolazione sequenze
PrecedenteFunzioni XMLEspressioni condizionaliSuccessivo