Oggetti SEQUENCE in SQL DB2 for i
Gli oggetti sequence in SQL DB2 for i (AS/400) permettono di generare numeri sequenziali univoci. Vengono utilizzati per assegnare valori univoci a chiavi numeriche primarie (in alternativa ai campi IDENTITY ad incremento automatico) oppure ogni qualvolta si necessità di generare numeri garantendo l'univocità.
L'oggetto si crea con il seguente comando CREATE SEQUENCE. Esempio:
CREATE SEQUENCE my_lib/my_seq START WITH 1 INCREMENT BY 1 NO MAXVALUE CACHE 10
il significato delle opzioni indicate è abbastanza evidente (ce ne sono anche altre) ma tra queste sottolineo l'opzione CACHE: è specificato il valore 10, mentre di default il valore è 20 e sta ad indicare il range di numeri assegnato alla sessione di lavoro che sta utilizzando l'oggetto. In pratica quando utilizzo quell'oggetto mi viene calcolato e fornito un nuovo numero ma “prenoto” anche i successivi fino al raggiungimento del numero indicato in CACHE e nessun altro li potrà mai utilizzare.
Esempio: se chiedo di generare il numero mi verrà fornito il valore 1 ma avendo specificato CACHE 10 ho vincolato a me anche i valori da 2 a 10, quindi se un altro utilizza l'oggetto per generare un numero gli verrà fornito il valore 11 e vincolerà per se anche la sequenza da 12 a 20.
Per ottenere un nuovo valore è possibile utilizzare i seguenti medodi:
VALUES NEXT VALUE FOR my_lib/my_seq INTO :my_var
in questo caso viene assegnato il valore alla variabile my_var
SELECT NEXT VALUE FOR my_seq FROM sysibm/sysdummy1
in questo caso è sufficiente eseguire una FETCH per conoscere il valore generato
oppure
INSERT INTO OrdiniTes (NUMORD, CODCLI, MODPAG, ...) VALUES (NEXT VALUE FOR my_lib/my_seq, 'A05475', 'RB1', ...)
in questo caso il nuovo valore viene ricavato direttamente all'interno di un istruzione INSERT. A questo punto, se voglio conoscere il valore di NUMORD appena inserito, utilizzo la seguente istruzione:
VALUES PREVIOUS VALUE FOR my_lib/my_seq INTO :my_var
La stessa istruzione posso utilizzarla anche direttamente all'interno di un INSERT per una tabella che è relazionata con la precedente. Esempio:
INSERT INTO OrdiniRig (NUMORD, CODART, DESART, QTA, ...) VALUES (PREVIOUS VALUE FOR my_lib/my_seq, 'X987654', 'MIA DESCRIZIONE ARTICOLO', 100, ...)
Per eliminare un oggetto SEQUENZE si usa il comando:
DROP SEQUENCE my_lib/my_seq
One thought on “Oggetti SEQUENCE in SQL DB2 for i”