Secuencias en Oracle e iBatis

De ChuWiki

Secuencias en Oracle[editar]

Las bases de datos como MySQL tienen posibilidad de campos que se autoincrementan cada vez que se hace un insert en la tabla. Esto es bastante útil para las claves primarias de las tablas, ya que cada vez que hagamos un insert, automáticamente se calculará un valor único para la clave.

Oracle no tiene este tipo de campos, pero sí tiene lo que se llaman secuencias. Creando una secuencia en Oracle, tenemos una forma de conseguir números disintos en cada llamada, de forma que podemos usarlos como clave primaria de las tablas que queramos.

En Oracle, una secuencia se crea así

CREATE SEQUENCE nombre_secuencia
INCREMENT BY numero_incremento
START WITH numero_por_el_que_empezara
MAXVALUE valor_maximo | NOMAXVALUE
MINVALUE valor_minimo | NOMINVALUE
CYCLE | NOCYCLE
ORDER | NOORDER

y un ejemplo concreto, si queremos una secuencia que empiece en 100 y vaya de 1 en 1, pondremos

CREATE SEQUENCE mi_secuencia
INCREMENT BY 1
START WITH 100

A partir de ahí, podemos hacer cosas como esta

insert into una_tabla values (
mi_secuencia.NextVal,
'campo1',
2,
'otro campo') 

es decir, cada llamada a mi_secuencia.NextVal nos ira dando los números 100, 101, 102, etc que usaremos como clave primaria de una_tabla.


Integración con iBatis[editar]

iBatis es una herramienta que poniendo las sentencias sql en un fichero xml, nos permite desde java invocarlas, haciendo así nuestro código java más independiente de la base de datos.

Afortunadamente, iBatis contempla la posibilidad de obtener una clave en un insert y devolverla al código java, de forma que tras el insert, java tiene la clave generada, además de haberse hecho el insert. En concreto, podemos usar esta característica de iBatis con las secuencias Oracle de la siguiente forma.

En el fichero xml de iBatis donde está el insert ponemos algo como esto

<insert id="insertDato" parameterClass="com.chuidiang.ElDato" >
   <selectKey keyProperty="id" resultClass="java.lang.Integer">
      SELECT mi_secuencia.NextVal FROM DUAL
   </selectKey>

   insert into una_tabla
      (ID_TABLA, campo1, campo2, campo3)
   values
      (#id#, #campo1#, #campo2#, #campo3#)
</insert>

Luego, suponiendo una clase com.chuidiang.ElDato con atributos id, campo1, campo2, campo3 y sus correspondientes métodos get() y set(), llamaremos desde java a este insert con este código

ElDato dato = new ElDato();
dato.setCampo1('campo1');
dato.setCampo2(33);
dato.setCampo3('otro');
Integer clave = (Integer)sqlMapClient.insert ("insertDato", dato);

De esta forma, primero se ejecuta el "selectkey" del xml, obteniendo la clave con la secuencia java y guardándola como entero en el campo id de dato. Luego se usa para el insert del xml (por el #id#) y se devuelve como return en la llamada al método insert() en java.