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;
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
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.
DROP GENERATOR <nome_generatore>;.
DELETE FROM RDB$GENERATORS WHERE RDB$GENERATOR_NAME='MYGEN';
UPDATE RDB$GENERATORS SET RDB$GENERATOR_NAME='NUOVO_GEN' WHERE RDB$GENERATOR_NAME='VECCHIO_GEN';