Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 36 di 41
  • livello principiante
Indice lezioni

Utilizzare le sequenze

Sfruttare le sequenze per generare automaticamente campi PRIMARY KEY
Sfruttare le sequenze per generare automaticamente campi PRIMARY KEY
Link copiato negli appunti

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.

Risultato della query

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'));
Risultato della query

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.

Risultato della query

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.

Ricerca del massimo valore per la chiave
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".

Esempio di inserimento con sequenza

Ti consigliamo anche