Soluzioni informatiche per l'impresa
Principale Novità Chi siamo Soluzioni/Servizi Supporto/Download Opportunità Contattaci

Lavorare con i generatori

L'autore dell'articolo è Ivan Prenosil. L'originale, in inglese, è reperibile all'indirizzo: Ivan Prenosil's Firebird/InterBase site.

Come leggere, in una SP, il valore di un generatore

Per recuperare il valore di un generatore, molti utilizzano una tabella di una riga (qui rdb$database):
      SELECT GEN_ID(g,1) FROM rdb$database INTO :x;
    
Sebbene possa risultare utile in un applicativo (in quanto non risulterebbe possibile "eseguire" una espressione GEN_ID), non è assolutamente necessario nel caso di una stored procedure; per recuperare il valore successivo di un generatore basta scrivere:
      CREATE PROCEDURE ReadGen RETURNS (ret INTEGER) AS
      BEGIN
        ret = GEN_ID(MyGen, 1);
      END;
    

Come assegnare, in una SP, un valore ad un generatore

Dato che il comando SET GENERATOR … TO …; non è supportato all'interno di una stored procedure, l'unico modo è quello di leggere il valore corrente, tramite GEN_ID, ed utilizzarlo per la modifica (prestare attenzione al fatto che in un ambiente multiutente due chiamate a GEN_ID non costituiscono obbligatoriamente una operazione atomica).
      CREATE PROCEDURE SetGen (val INTEGER) AS
      BEGIN
        val = GEN_ID (MyGen, val - GEN_ID (MyGen,0) );
      END
    

Come creare, in una SP, un generatore

Dato che il comando CREATE GENERATOR rientra fra i comandi DDL, non può esser utilizzato in una stored procedure. Comunque, grazie alle tabelle di sistema, è possibile creare un generatore tramite "inserzione diretta":
      INSERT INTO RDB$GENERATORS (RDB$GENERATOR_NAME)
                          VALUES (UPPER('MYGEN'));
    
Il nuovo generatore è immediatamente disponibile, anche prima del commit (però in caso di rollback, il nome del generatore ed il suo id verranno persi). Non bisogna dimenticare che gran parte delle versioni di IB hanno un bug che impedisce la creazione di troppi generatori.

Come eliminare un generatore

A partire da Firebird 1 è possibile eliminare un generatore mediante il comando:

DROP GENERATOR <nome_generatore>;.

Nelle vecchie versioni di Interbase non esisteva questa possibilità e l'unico modo era cancellare la definizione del generatore dalle tabelle di sistema:

DELETE FROM RDB$GENERATORS WHERE RDB$GENERATOR_NAME='MYGEN';

Purtroppo questo metodo ha degli svantaggi:
Mappa del sito Collegamenti Riservatezza Note legali Accessibilità W3C
Tutti i marchi ed i copyright in questa pagina sono di proprietà dei rispettivi proprietari. Per il resto © EOS (Pisa). Ultimo aggiornamento: 2008-3-31.