Sequence
CREARE UNA SEQUENCE CREATE SEQUENCE nome [INCREMENT BY n] [START WITH n] [MAXVALUE n | NOMAXVALUE] [MINVALUE n | NOMINVALUE] [CYCLE | NOCYCLE] [CACHE | NOCACHE]; Automaticamente crea numeri sequenziali
CREARE UNA SEQUENCE INCREMENT BY n specifica lintervallo fra i numeri generati dalla sequence (se omesso lincremento è di 1) START WITH n indica il primo numero che verrà generato dalla sequence (se omesso la sequence parte da 1) MAXVALUE n indica il valore massimo che la sequence può generare NOMAXVALUE specifica 10^27 per sequence ascendenti e -1 per sequence discendenti MINVALUE n indica il minimo valore della sequence NOMINVALUE specifica 1 per le sequence ascendenti e -10^26 per sequence discendenti CYCLE | NOCYCLE specifica se la sequence continuerà a generare valori dopo il raggiungimento del massimo o minimo valore CACHE | NOCACHE specifica quanti valori Oracle server prealloca e tiene in memoria (come default Oracle server tiene 20 valori in cache)
CREARE UNA SEQUENCE Creare una sequenza DEPT_DEPTID_SEQ che deve essere usata come chiave primaria della tabella DEPARTMENTS. CREATE SEQUENCE dept_deptid_seq INCREMENT BY 10 START WITH 120 MAXVALUE 9999 NOCACHE NOCYCLE; Non usare lopzione CYCLE quando si creano valori per la chiave primaria.
CREARE UNA SEQUENCE È possibile controllare i valori della sequence nella tabella USER_SEQUENCES del dizionario dati. SELECT sequence_name, min_value, max_value, increment_by, last_number FROM user_sequence; Il campo LAST_NUMBER visualizza il prossimo numero della sequence disponibile se viene specificata lopzione NOCACHE
NEXTVAL E CURRVAL sono pseudocolonne NEXTVAL restituisce il prossimo valore della sequence. Restituisce un unico valore ogni volta che è richiamata, anche con utenti differenti – sequence.NEXTVAL CURRVAL restituisce il valore corrente della sequence, lultimo valore generato per la sequence – sequence.CURRVAL quando di chiama NEXTVAL viene generato un nuovo numero per la sequence e viene posto nella CURRVAL
Quando usare NEXTVAL e CURRVAL nella SELECT list di uno statement SELECT che non è una subquery o parte di essa nella SELECT list di una subquery quando è in un INSERT nella clausola VALUES di una INSERT nella clausola SET di un UPDATE
Quando NON usare NEXTVAL e CURRVAL nella SELECT list di una vista nella SELECT con la keyword DISTINCT nella SELECT con GROUP BY, HAVING o ORDER BY nelle subquery in SELECT, DELETE, UPDATE statement nellespressione DEFAULT in CREATE TABLE o ALTER TABLE
USARE UNA SEQUENCE INSERT INTO departments (department_id, department_name, location_id) VALUES (dept_deptid_seq.NEXTVAL, Support, 2500); - inserisce nel campo department_id i valori della sequence. SELECT dept_deptid_seq.CURRVAL FROM dual; - visualizza il valore corrente della sequence
USARE UNA SEQUENCE mettere i valori della sequence in cache permette di accedere più velocemente ai valori. La cache viene popolata quando viene fatto il primo accesso alla sequence. Ai successivi riferimenti verrà fatto accesso alla cache. possono verificarsi vuoti nella generazione dei valori quando: - quando viene fatto un rollback di uno statement contente una sequence - il sistema va in crash e vengono persi i valori che la sequence mette in cache - la sequence è usata in unaltra tabella
MODIFICARE UNA SEQUENCE è possibile modificare il valore di incremento, il massimo e minimo valore, lopzione cycle e lopzione cache ALTER SEQUENCE dept_deptid_seq INCREMENT BY 20 MAXVALUE NOCACHE NOCYCLE; Quando si supera il MAXVALUE non verranno creati altri valori e verrà generato un errore che indica che la sequence eccede il MAXVALUE. Per continuare ad usare la sequence occorre quindi modificarla con il comando di ALTER SEQUENCE.
COME MODIFICARE UNA SEQUENCE per modificare una sequence occorre essere il proprietario o avere i privilegi di ALTER per la sequence solo i numeri che verranno generati successivamente saranno affetti dalle modifiche fatte non è possibile modificare il parametro di START WITH, la sequence deve essere cancellata e ricreata per farla ricominciare da un numero differente è possibile fare qualche controllo. Per esempio non è possibile impostare un nuovo MAXVALUE minore del valore corrente
CANCELLARE UNA SEQUENCE DROP SEQUENCE dept_deptid_seq; cancella la sequence dal dizionario dati per cancellare la sequence occorre essere il proprietario o avere il privilegio DROP ANY SEQUENCE