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