Ogni sequenza può essere utilizzata facendo semplicemente riferimento a due suoi parametri, NEXTVAL
e CURRVAL
. Il primo permette di conoscere e, al tempo stesso generare, il numero successivo.
Ottenere il numero successivo
SELECT <nome sequenza>.nextval FROM DUAL;
Il secondo parametro permette di ottenere l'ultimo valore generato.
Ottenere l'utimo valore generato
SELECT <nome sequenza>.currval FROM DUAL;
Inizializzazione delle sequenze
Non è possibile conoscere il valore del parametro CURRVAL
per una sequenza senza averla prima inizializzata.
As esempio interrogando la sequenza "myseq" che non ha ancora generato alcun numero, otterremo un messaggio di errore.
L'inizializzazione di una sequenza si effettua facendo generare il primo numero disponibile.
SQL> SELECT myseq.nextval FROM DUAL;
Utilizzare le sequenze per simulare i contatori
Possiamo usare le sequenze per generare contatori automatici di chiavi primarie (simili a quelli di MS-Access). Ad esempio facendo generare automaticamente un valore incrementale per la colonna numerica "idpadre" (definita PRIMARY KEY
) della tabella "padreseq".
Senza usare le sequenze dovremmo ricorrere ad un inserimento che ricalcoli ogni volta l'ultimo valore della chiave, ad esempio usando una subquery.
INSERT INTO padreseq VALUES ((SELECT MAX (idpadre) + 1 FROM padreseq), 'Pingitori Marco', TO_DATE ('31-10-1977', 'DD-MM-YYYY'));
È una scelta validissima ma avremmo un problema durante l'inserimento della prima riga. Infatti, quando in una tabella non è presente alcuna riga un'istruzione del tipo
SELECT MAX (<nome colonna>)+1 FROM <nome tabella>;
restituisce il valore NULL. Vediamo allora come usare una sequenza, ad esempio "myseq" che abbiamo già definito. Per ogni riga generiamo un valore con la funzion nextval
.
SQL> INSERT INTO padreseq VALUES (myseq.nextval, 'Pingitori Marco', 2 TO_DATE ('31-10-1977', 'DD-MM-YYYY'));
Otterremo record con chiavi a partire 2: la prima riga inserita non contiene il valore 1 per la colonna idpadre perché l'inizializzazione della sequenza (SELECT myseq.nextval FROM DUAL
) ha provveduto a far generare il primo valore disponibile per la sequenza.
Per fare un altro esempio creiamo una sequenza da utilizzare per la colonna idpadre della tabella "Padre". Considerato che la tabella contiene già delle righe dobbiamo necessariamente conoscere quale sarà il valore di partenza per la sequenza, ovvero il valore per la clausola START WITH
. Non possiamo scegliere, in questo specifico caso, un valore qualsiasi perché potremmo violare il vincolo di PRIMARY KEY
imposto alla colonna. Il valore di partenza sarà dato dal valore massimo già presente nella colonna idpadre incrementato di un'unità. In questo caso la sequenza dovrà partire da 6.
SQL> CREATE SEQUENCE fatherseq 2 START WITH 6 INCREMENT BY 1 3 NOMAXVALUE NOCYCLE;
A questo punto possiamo inserire nuove righe nella tabella "Padre" usando la nuova sequenza "fatherseq".