martes, 22 de marzo de 2011

¿Cómo obtener el valor de una campo de una secuencia Oracle trabajando con ADF BC?

Un título largo y descriptivo que plantea perfectamente el problema a tratar. Resulta que cuando queremos que el valor de una campo se obtenga directamente de una secuencia Oracle y estamos utilizando ADF Business Components, es fácil que cometamos un error.

Cuando configuramos los atributos de un Entity Object, podemos seleccionar varios tipos de dato, entre los que se encuentra DBSequence. Cuando elegimos esta opción, el diálogo de jDeveloper muestra un par de campos nuevos en los que nos pide que indiquemos un nombre de secuencia, y un valor de comienzo. Es lógico pensar que si ponemos en ese campo, por ejemplo, SEQ_PERSONA, el framework se encargará de coger el valor correspondiente de la secuencia, e inyectarlo en el campo que estamos editando. Nada más lejos de la realidad...

El utilizar el tipo DBSequence para un campo indica a ADF que el valor para el mismo va a ser proporcionado por la base de datos, pero ADF no se va a encargar de obtenerlo. Lo que va a hacer es asignar un valor temporal al campo, y esperar a que la base de datos le proporcione el real a la hora de persistir la información. El valor temporal será un número negativo.

Esto implica que nos toca a nosotros obtener el valor de la secuencia y utilizarlo para informar el campo. Una forma sencilla de hacerlo es crear un trigger en la base de datos que se ejecute antes de cada inserción en la tabla correspondiente. De forma general el código tendría el siguiente aspecto.

CREATE OR REPLACE TRIGGER %NOMBRE_TRIGGER%
BEFORE INSERT ON %TABLA% FOR EACH ROW
BEGIN
IF :NEW.%CAMPO% IS NULL OR :NEW.%CAMPO% < 0 THEN
SELECT %NOMBRE_SECUENCIA%.NEXTVAL
INTO :NEW.%CAMPO%
FROM DUAL;
END IF;
END;

Y, entonces, ¿para qué nos pide el IDE el nombre de la secuencia? Pues este dato sólo tendrá utilidad si estamos utilizando un enfoque en el que creemos en primer lugar nuestros objetos de negocio, y a partir de ellos queramos generar el esquema de datos. En este caso, jDeveloper creará, además de la tabla, la secuencia indicada en la base de datos.

3 comentarios:

  1. Muchas es excelente el comentario....

    ResponderEliminar
  2. Habia tenido problemas con eso . pero despues de esta excplicacion queda bastante claro... Mil Gracias.

    ResponderEliminar
  3. Tengo problemas con mi secuencia, al tratar de insertar x primera vez datos en mi tabla me dice que se requiere mi campo "proveedor_id" primary key, que es secuencial, tengo mi trigger para mi secuencia, pero me da este error.

    ResponderEliminar

Cualquier aportación será bienvenida