registro regresando el num con el que fue registrado

aip
19 de Octubre del 2005
Tengo el problema siguiente:
Tengo una tabla de prueba en Informix con la estructura siguiente:

create table prueba_aip(
num serial not null,
paterno char(50),
materno char(50),
nombre char(50),
primary key (num)
);

Cuando ingreso un registro lo hago mediante la siguiente instrucción:

insert into prueba_aip
values(0,"ibanez","perez","alberto")

Y en mi tabla tengo queda registrado como:
1, ibanez, perez, Alberto

Y si registro otro:
2, ibanez, perez, Alberto

Esto es, me va dando un consecutivo.
Pero quisiera que en mi aplicación en jsp al momento de hacer el registro, el número que le asigna, se muestre con un letrero que diga

“El dato fue registrado con el numero ‘n’ ”

Para esto tengo dos caminos: el primero usando un bean y con el uso de la biblioteca con jdbc encontrar un método que me lo devuelva, el segundo camino usando un store procedure y que me devuelva el número que le asignó.

Para el primer camino:

Tengo dos opciones
Opción 1 del primer camino:
Tengo el código siguiente

try{
con = DriverManager.getConnection(url,"usuario","contrasenia");
Statement stmt = con.createStatement();
// Obtain the generated key that results from the query.
stmt.executeUpdate("INSERT INTO prueba_aip " +
"(num,paterno, materno, nombre) " +
"VALUES (0,'a', 'b','c')",
Statement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.getGeneratedKeys();
if ( rs.next() ) {
// Retrieve the auto generated key(s).
int key = rs.getInt(1);
System.out.println("Resultado = "+key);
}
rs.close();
stmt.close();
con.close();
}
catch(SQLException ex) {
System.err.println("SQLException: " + ex.getMessage());
}

Pero me marca el siguiente error:

SQLException: Method not supported with this server. : IfxStatement.executeUpdate(String, int)

Opción 1 del primer camino:
Tengo el código siguiente

try{
con = DriverManager.getConnection(url,"usuario","contrasenia");
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT * FROM prueba_aip");
rs.moveToInsertRow();
rs.updateInt("NUM",0);
rs.updateString("PATERNO", "Ibanez");
rs.updateString("MATERNO", "Perez");
rs.updateString("NOMBRE", "alberto");
rs.insertRow();
System.out.println("Tabla PRUEBA_AIP después de la inserción:");
while (rs.next()) {
int id = rs.getInt("NUM");
String paterno = rs.getString("PATERNO");
String materno = rs.getString("MATERNO");
String nombre = rs.getString("NOMBRE");
System.out.println("nombre: "+id+" "+paterno+" "+materno+" "+nombre);
}
rs.close();
stmt.close();
con.close();
}
catch(SQLException ex) {
System.err.println("SQLException: " + ex.getMessage());
}

No hay problema, registra pero me tiene que mostrar todos los registro y sólo quiero el que inserté.

Para el segundo camino es la solución con un store procedure

La estructura del store procedure es la siguiente
create procedure inserta(ppaterno char(50), pmaterno char(50), pnombre char(50))
returning int;
define ser int;
insert into prueba_aip(num, paterno, materno, nombre)
values(0,ppaterno, pmaterno, pnombre);
let ser = dbinfo("sqlca.sqlerrd1");
return ser;
end procedure;

que para ejecutarlo es con la siguiente instrucción
execute procedure inserta("ibanez","perez","alberto");

Pero cuando lo ejecuto con java:

try{
con = DriverManager.getConnection(url,"usuario","contrasenia");
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
stmt = con.createStatement();
String sql = "{call inserta('ibanez', 'perez', 'alberto')}";
CallableStatement cstmt = con.prepareCall(sql);
cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
ResultSet rs = cstmt.executeQuery();
int x = cstmt.getInt(1);
rs.close();
stmt.close();
con.close();
}
catch(SQLException ex) {
System.err.println("SQLException: " + ex.getMessage());
}

Me da el error siguiente:

SQLException: Function doesn't have an output parameter or the out parameter isn't returned.

¿Alguien me puede ayudar?

Saludos cordiales

edwinrjrc
19 de Octubre del 2005
Esta bien todo lo que has hecho, pero debes color

rs.next() // para que ubiques el cursor en el primera celda para que comienze a leer
despues de esto puedes jalar lo que estas jalando