SEQUENCE

Una sequence è un sistema di generazione automatica di interi in ordine discendete o ascendente con un intervallo tra numeri di qualsiasi dimensione. La sequenza può ciclare quando si è raggiunto un limite.
Ha un nome e non è associato con una particolare tabella o colonna.
Per ottenere il successivo valore della sequenza basta far riferimento al suo nome.
Dopo che un numero viene rilasciato, non viene emesso di nuovo lo stesso a meno che la sequenza sia definita come ciclica.

S i n t a s s i
CREATE SEQUENCE <schema>.<nome_sequence>
START WITH   <N>
INCREMENT BY <N>
MINVALUE     <N> 
MAXVALUE     <N>  | NOMAXVALUE
CACHE        <N>  
[CYCLE | NOCYCLE]; 

MAXVALUE specifica il massimo valore che la sequenza può generare e deve essere più grande di MINVALUE che del valore di START. Di default vale 10^27 per sequenze ascendenti e -1 per discendenti.
MINVALUE specifica il minimo valore che la sequenza può generare e deve essere minore di MAXVALUE e minore o uguale del valore di START. Di default vale 1 per sequenze ascendenti e -10^26 per discendenti.
CYCLE quando la sequenza ascendente raggiunge il valore massimo, la sequence rilascia il valore minimo e viceversa per ordinamento discendente. Senza questa opzione una volta raggiunto il valore limite compare un messaggio di errore.
CACHE L'uso della cache migliora le prestazioni perché un set di numeri è preallocato in memoria per un accesso più veloce ma se c'è un "istance failure", la sequenza di numeri in cache non viene usata, causando un gap nella sequenza. Il più piccolo valore è 2; di default è 20.

Attivazione
Quando si crea una sequence, per definirla e inizializzarla nella sessione corrente occorre eseguire il comando nextval. Se si esegue invece il comando currval và in errore:
create sequence ord_seq2;
select ord_seq2.currval from dual;
ORA-08002: la sequenza ORD_SEQ2.CURRVAL non è ancora definita in questa sessione
08002. 00000 -  "sequence %s.CURRVAL is not yet defined in this session"
*Cause:    sequence CURRVAL has been selected before sequence NEXTVAL
*Action:   select NEXTVAL from the sequence before selecting CURRVAL

Il comando incr_seq.NEXTVAL incrementa la sequenza e restituisce il nuovo valore.
Il comando incr_seq.CURRVAL restituisce il valore corrente della sequenza, che è il valore restituito dall'ultimo riferimento a incr_seq.NEXTVAL.

Primary Key
La sequence è utile nel popolamento della Primary Key, per evitare l'inserimento di valori doppi.
E s e m p i o
CREATE TABLE Ordine (
id_ord NUMBER Primary Kery,
id_prodotto NUMBER,
desc_prodotto VARCHAR2(30));

Una volta creata una sequence di nome incr_seq possiamo associarla al valore id_ord con la seguente istruzione:
INSERT INTO Ordine VALUES ( incr_seq.NEXTVAL, 1562, 'Pasta');

GAP nelle Sequence
La presenza di un gap all'interno di una sequence può essere causata da una commit o da un rollback.
Ad esempio se viene eseguito il rollback di una istruzione contenente una sequence, il numero è perso. Se la Sequence memorizza i valori in cache, allora questi valori sono persi se si verifica un crash del sistema.

Una sequence non è associata ad una particolare tabella quindi la stessa può essere utilizzata per più tabelle ma in questo modo ogni tabella può contenere gap nella sequenza di numeri.

Quando viene raggiunto il limite MAXVALUE non possono essere aggiunti altri valori e si riceve un messaggio di errore indicando che la sequence ha raggiunto il valore massimo. Per incrementare il valore limite MAXVALUE è possibile usare il comando ALTER SEQUENCE.

Per rimuove una sequence usare il comando seguente

DROP SEQUENCE nome_sequence;

Post popolari in questo blog

ORA-12154: TNS: il listener non è attualmente a conoscenza del servizio richiesto nel descrittore di connessione

Create e Drop Pluggable Database