Riferimento sequenza

Un riferimento di sequenza è un'espressione che fa riferimento ad una sequenza definita al server delle applicazioni.

sequence-reference
Read syntax diagramSkip visual syntax diagramnextval-expressionprevval-expression
nextval-expression
Read syntax diagramSkip visual syntax diagramNEXT VALUE FORsequence-name
prevval-expression
Read syntax diagramSkip visual syntax diagramPREVIOUS VALUE FORsequence-name
VALORE SUCCESSIVO PER sequenza - nome
Un'espressione NEXT VALUE genera e restituisce il valore successivo per la sequenza specificata da nome sequenza.
VALORE PRECEDENTE PER sequenza - nome
Un'espressione PREVIOUS VALUE restituisce il valore generato più di recente per la sequenza specificata per una precedente istruzione all'interno del processo di applicazione corrente. Questo valore può essere fatto riferimento ripetutamente utilizzando le espressioni PREVIOUS VALUE che specificano il nome della sequenza. Possono esserci più istanze di espressioni PREVIOUS VALUE che specificano lo stesso nome di sequenza all'interno di un'unica istruzione; tutti restituiscono lo stesso valore. In un ambiente di database partizionato, un'espressione PREVIOUS VALUE potrebbe non restituire il valore generato più di recente.

Un'espressione PREVIOUS VALUE può essere utilizzata solo se un'espressione NEXT VALUE che specifica lo stesso nome di sequenza è già stata referenziata nel processo di applicazione corrente, nella transazione corrente o precedente (SQLSTATE 51035).

Note

  • Autorizzazione: Se in un comunicato viene utilizzato un riferimento di sequenza, i privilegi possediti dall'ID di autorizzazione dell'istruzione devono includere almeno uno dei seguenti privilegi:
    • Il privilegio USAGE sulla sequenza
    • Autorizzazione DATAACCESS
  • Viene generato un nuovo valore per una sequenza quando un'espressione NEXT VALUE specifica il nome di quella sequenza. Tuttavia, se ci sono più istanze di un'espressione NEXT VALUE che specifica lo stesso nome di sequenza all'interno di una query, il contatore per la sequenza viene incrementato solo una volta per ogni riga del risultato e tutte le istanze di NEXT VALUE restituiscono lo stesso valore per una riga del risultato.
  • Lo stesso numero di sequenza può essere utilizzato come valore chiave univoco in due tabelle separate facendo riferimento al numero di sequenza con espressione NEXT VALUE per la prima riga (questo genera il valore della sequenza), e un'espressione PREVIOUS VALUE per le altre righe (l'istanza di PREVIOUS VALUE si riferisce al valore di sequenza più recentemente generato nella sessione corrente), come mostrato nel seguente esempio:
       INSERT INTO order(orderno, cutno)
         VALUES (NEXT VALUE FOR order_seq, 123456);
    
       INSERT INTO line_item (orderno, partno, quantity)
         VALUES (PREVIOUS VALUE FOR order_seq, 987654, 1);
  • NEXT VALUE e le espressioni PREVIOUS VALUE possono essere specificate nei seguenti luoghi:
    • select - statement o SELECT INTO statement (all'interno della clausola di selezione, a condizione che l'istruzione non contenga una parola chiave DISTINTA, una clausola GROUP BY, una clausola ORDER BY, una parola chiave UNION, una parola chiave INTERSECT o TRANNE)
    • Istruzione INSERT (all'interno di una clausola VALUES)
    • Istruzione INSERT (all'interno della clausola di selezione del fullselect)
    • Istruzione UPDATE (all'interno della clausola SET (una ricerca o una istruzione UPDATE posizionata), tranne che NEXT VALUE non può essere specificato nella clausola di selezione della fullselect di un'espressione nella clausola SET)
    • SET Variable statement (tranne all'interno della clausola di selezione della fullselect di un'espressione; un'espressione NEXT VALUE può essere specificata in un trigger, ma un'espressione PREVIOUS VALUE non può)
    • VALORI IN istruzione (all'interno della clausola di selezione della fullselect di un'espressione)
    • Istruzione CREATE PROCEDURE (all'interno del corpo di routine di una procedura SQL)
    • CREARE TRIGGER all'interno dell'azione trigger (è possibile specificare un'espressione NEXT VALUE, ma un'espressione PREVIOUS VALUE non può)
  • NEXT VALUE e le espressioni PREVIOUS VALUE non possono essere specificate (SQLSTATE 428F9) nei seguenti luoghi:
    • condizione di join per una join esterna completa
    • valore DEFAULT per una colonna in un'istruzione CREATE TABLE oppure ALTER TABLE
    • definizione di colonna generata in un'istruzione CREATE TABLE oppure ALTER TABLE
    • Definizione della tabella di riepilogo in una istruzione CREATE TABLE o ALTER TABLE
    • condizione di un vincolo CHECK
    • CREAZIONE TRIGGER (è possibile specificare un'espressione NEXT VALUE, ma non è possibile un'espressione PREVIOUS VALUE)
    • Istruzione CREATE VIEW
    • Istruzione CREATE METHOD
    • Istruzione CREATE FUNCTION
    • Un elenco argomenti di un'espressione XMLQUERY, XMLEXISTS o XMLTABLE
  • Inoltre, non è possibile specificare un'espressione NEXT VALUE (SQLSTATE 428F9) nei seguenti luoghi:
    • Espressione CASE
    • Elenco parametri di una funzione aggregata
    • Sottoquery in un contesto diverso da quelli esplicitamente consentiti, come descritto in precedenza
    • istruzione SELECT per la quale SELECT esteriore contiene un operatore DISTINCT
    • condizione join di una join
    • istruzione SELECT per la quale SELECT esteriore contiene una clausola GROUP BY
    • SELECT istruzione per la quale l'esterna SELECT è combinata con un'altra istruzione SELECT utilizzando l'operatore UNION, INTERSECT o ECCETTO
    • espressione di tabella nidificata
    • Elenco parametri di una funzione di tabella
    • Clausola WHERE dell'istruzione esterna - più SELECT o di un'istruzione DELETE o UPDATE
    • clausola ORDER BY dell'istruzione SELECT più esteriore
    • selezionare - clausola della fullselect di un'espressione, nella clausola SET di un'istruzione UPDATE
    • SE, MENTRE, FARE... UNTIL o CASE in una routine SQL
  • Quando viene generato un valore per una sequenza, tale valore viene consumato e la prossima volta che viene richiesto un valore verrà generato un nuovo valore. Questo è vero anche quando la dichiarazione contenente l'espressione NEXT VALUE non riesce o viene arrotolata.

    Se un'istruzione INSERT include un'espressione NEXT VALUE nell'elenco VALUES per la colonna e se si verifica un errore a un certo punto durante l'esecuzione dell'INSERT (potrebbe essere un problema nella generazione del valore di sequenza successivo, oppure un problema con il valore per un'altra colonna), si verifica un errore di inserimento (SQLSTATE 23505) e il valore generato per la sequenza è considerato consumato. In alcuni casi, riemettere la stessa istruzione INSERT potrebbe portare al successo.

    Si consideri, ad esempio, un errore che è il risultato dell'esistenza di un indice univoco per la colonna per cui è stato utilizzato NEXT VALUE e il valore di sequenza generato già esiste nell'indice. È possibile che il valore successivo generato per la sequenza sia un valore che non esiste nell'indice e quindi la successiva INSERT ci riuscirebbe.

  • Scope di VALORE PRECEDENTE: Il valore di PREVIOUS VALUE persiste fino a quando non viene generato il valore successivo per la sequenza nella sessione corrente, la sequenza viene sganciata o alterata oppure la sessione di applicazioni termina. Il valore è inalterato dalle istruzioni COMMIT o ROLLBACK. Il valore di PREVIOUS VALUE non può essere impostato direttamente ed è un risultato dell'esecuzione dell'espressione NEXT VALUE per la sequenza.

    Una tecnica comunemente utilizzata, soprattutto per le prestazioni, è per un'applicazione o un prodotto per gestire una serie di connessioni e le transazioni di rotta ad una connessione arbitraria. In queste situazioni, la disponibilità del VALORE PRECEDENTE per una sequenza deve essere affidata solo fino alla fine della transazione. Esempi di dove questo tipo di situazione possono verificarsi includono applicazioni che utilizzano protocolli XA, utilizzare il pooling di connessione, utilizzare il concentratore di connessione e utilizzare HADR per ottenere il failover.

  • Se nella generazione di un valore per una sequenza viene superato il valore massimo per la sequenza (o il valore minimo per una sequenza discendente) e i cicli non sono ammessi, si verifica un errore (SQLSTATE 23522). In questo caso, l'utente potrebbe ALTER la sequenza per estendere la gamma di valori accettabili o abilitare i cicli per la sequenza, oppure DROP e CREATE una nuova sequenza con un tipo di dati diverso che ha una gamma di valori maggiore.

    Ad esempio, una sequenza potrebbe essere stata definita con un tipo di dati SMALLINT e alla fine la sequenza esaurisce i valori assegnabili. DROP e ricreare la sequenza con la nuova definizione per ridefinire la sequenza come INTEGER.

  • Un riferimento ad un'espressione NEXT VALUE nell'istruzione select di un cursore si riferisce ad un valore generato per una riga della tabella dei risultati. Viene generato un valore di sequenza per un'espressione NEXT VALUE per ogni riga che viene caricata dal database. Se il blocco viene effettuato al client, i valori possono essere stati generati al server prima del trattamento dell'istruzione FETCH. Questo può verificarsi quando c'è il blocco delle righe della tabella dei risultati. Se l'applicazione client non RICHIAMA esplicitamente tutte le righe che il database ha materializzato, allora l'applicazione non vedrà i risultati di tutti i valori di sequenza generati (per le righe materializzate che non sono state restituite).
  • Un riferimento ad un'espressione PREVIOUS VALUE nell'istruzione select di un cursore si riferisce ad un valore generato per la sequenza specificata prima dell'apertura del cursore. Tuttavia, la chiusura del cursore può influenzare i valori restituiti da PREVIOUS VALUE per la sequenza specificata nelle successive istruzioni o anche per la stessa istruzione nel caso in cui il cursore venga riaperto. Questo sarebbe il caso in cui la dichiarazione di selezione del cursore includa un riferimento a NEXT VALUE per lo stesso nome di sequenza.
  • Le alternative di sintassi: le seguenti sono supportate per la compatibilità con le versioni precedenti di Db2® e con altri prodotti di database. Queste alternative sono non standard e non devono essere utilizzate.
    • NEXTVAL e PREVVAL possono essere specificati al posto di NEXT VALUE e VALORE PRECEDENTE
    • nome sequenza.NEXTVAL può essere specificato al posto di NEXT VALUE FOR nome sequenza
    • nome sequenza.CURRVAL può essere specificato al posto di PREVIOUS VALUE FOR nome sequenza

Esempi

Supponiamo che ci sia una tabella chiamata "ordine", e che venga creata una sequenza chiamata "order_seq" come segue:
   CREATE SEQUENCE order_seq
     START WITH 1
     INCREMENT BY 1
     NO MAXVALUE
     NO CYCLE
     CACHE 24
Di seguito alcuni esempi di come generare un numero di sequenza "order_seq" con espressione NEXT VALUE:
   INSERT INTO order(orderno, custno)
     VALUES (NEXT VALUE FOR order_seq, 123456);
oppure
   UPDATE order
     SET orderno = NEXT VALUE FOR order_seq
     WHERE custno = 123456;
oppure
   VALUES NEXT VALUE FOR order_seq INTO :hv_seq;