jueves, 1 de julio de 2010

Sequence Oracle con START WITH dinámico

En Oracle no existe el atributo AUTO_INCREMENT de MySQL que permite asignar automáticamente un valor incremental al momento de insertar registros, en cambio hay que utilizar un objeto llamado SEQUENCE.

La sintáxis básica de creación es la siguiente:

CREATE SEQUENCE sequence_name
MINVALUE value
MAXVALUE value
START WITH value
INCREMENT BY value
CACHE value;


Hace poco tuve el requerimiento de crear una secuencia que comenzara a numerar desde un valor calculado a partir de un SELECT, en este caso tuve que utilizar SQL dinámico mediante la instrucción EXECUTE IMMEDIATE, por ejemplo:

DECLARE maxId NUMBER(19,0);
BEGIN
EXECUTE IMMEDIATE 'SELECT MAX(id) FROM Logs' INTO maxId;
EXECUTE IMMEDIATE 'CREATE SEQUENCE SEQ_NUM_LOG START WITH '||maxId;
COMMIT;
END;


El código anterior crea una secuencia llamada SEQ_NUM_LOG que comenzará a numerar con el máximo valor de la columna id de la tabla Logs.

Es interesante recordar el uso de la instrucción EXECUTE IMMEDIATE para los casos en que necesitamos ejecutar una sentencia DML armada dinámicamente.

Hasta el próximo post!!