Mostrando entradas con la etiqueta Informix. Mostrar todas las entradas
Mostrando entradas con la etiqueta Informix. Mostrar todas las entradas

jueves, 19 de febrero de 2009

Evitar inicialización accidental de Informix

En mi opinión, una de las cosas que los señores de IBM debería corregir, cuando publiquen el esperado Infomix Cheetah, es el tema de la opción de inicialiación de las bases de datos con la opción -i del comando oninit.

Es relativamente fácil lanzar el comando oninit –i accidentalmente y perder las bases de datos, por lo que es recomendable enmascarar el programa oninit. Para esto renombraremos el comando oninit de $INFORMIXDIR/bin/oninit a $INFORMIXDIR/bin/oninit.cmd.

Luego creamos un script oninit que filtre el uso de la opción –i

# oninit
# Por CNG (www.trapallada.com).
#
# Script que enmascara el oninit de informix para
# evitar el oninit -i que inicializa la base de datos

ARGUMENTOS=""
LANZAR=1

while getopts ivyI opcion
do
case $opcion in
i) echo -e "\n   La opcion -i esta bloqueada para evitar inicializaciones"
echo "   accidentales de la base de datos. Utilice la opcion -I"
echo -e "   i mayuscula para inicializar la base de datos.\n"
LANZAR=0;;
v) ARGUMENTOS=v${ARGUMENTOS};;
y) ARGUMENTOS=y${ARGUMENTOS};;
I) ARGUMENTOS=i${ARGUMENTOS};;
esac
done

if ( test $LANZAR -eq 1 ) then
oninit.cmd -${ARGUMENTOS}
fi

jueves, 12 de febrero de 2009

Obtener los campos SERIAL de Informix tras un INSERT



Problema:

Tras hacer un INSERT en una tabla de Informix que contiene campos del tipo SERIAL nos encontramos con que tras realizarlo, tenemos todos los datos del registro excepto los autogenerados por la base de dato.

Solución:

// Por CNG (www.trapallada.com).
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;

String queryString = "INSERT INTO " + TABLA + " (" + CAMPOS +
") VALUES ( ?,?,?,? )";
preparedStatement = conn.prepareStatement(queryString,
Statement.RETURN_GENERATED_KEYS);

int i = 1;
// El primer campo de la tabla es SERIAL
preparedStatement.setInt(i++, 0);
preparedStatement.setString( i++, vo.getCampo2() );
preparedStatement.setString(i++, vo.getCampo3() );
preparedStatement.setString(i++, vo.getCampo4() );

int insertedRows = preparedStatement.executeUpdate();
resultSet = preparedStatement.getGeneratedKeys();

resultSet.next();
vo.setCampo1( resultSet.getInt(1) );

En el momento de crear el PreparedStatement incluimos el parámetro Statement.RETURN_GENERATED_KEYS para indicarle a la aplicación que recupere los valores de los SERIAL generados por la base de datos.

Tras ejecutar el INSERT, se recupera un ResultSet con los campos SERIAL generados con el método getGeneratedKeys() del PreparedStatement.

Tras eso, accedemos al ResultSet para obtener los valores.