db2_sql

Oggetti SEQUENCE in SQL DB2 for i

db2_sqlGli 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
(Letto 1.244 volte di cui 1 negli ultimi 30gg)
twitterlinkedinmailby feather

One thought on “Oggetti SEQUENCE in SQL DB2 for i

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *