preparedstatement - El uso de Oracle RETURNING INTO en Java(JDBC, declaración preparada)
preparedstatement pst (2)
Para obtener la clave generada automáticamente, tenemos el método método getGeneratedKeys en preparestatement, que arroja resultados que contienen el valor clave. Todo lo que necesitamos es pasar el nombre de la columna de clave a preparestatement.
pstm = con.prepareStatement("insert query",new String[]{primarykeycolumnname});
int i = pstm.executeUpdate();
if (i > 0)
{
ResultSet rs = pstm.getGeneratedKeys();
while(rs.next())
{
System.out.println(rs.getString(1));
}
}
Estoy usando JDBC para ejecutar la declaración de Oracle que se ve así:
"INSERT INTO MYTABLE(MYDATA) VALUES(?) RETURNING MY_CALCULATED_DATA INTO ?"
// MYTABLE''s def makes MY_CALCULATED_DATA be auto-generated by DB on insert
Encontré varias formas de llamar a la declaración anterior en Java, principalmente:
Usando OraclePreparedStatement:
ps = (OraclePreparedStatement)conn.prepareStatement(sql); ps.setString(1, "myvalue"); ps.registerReturnParameter(2, Types.VARCHAR); ps.execute(); rs = ps.getReturnResultSet(); rs.next(); System.out.print(rs.getString(1));
Usando CallableStatement:
cs = conn.prepareCall(sql); cs.setString(1, "myvalue"); cs.registerOutParameter(2, Types.VARCHAR); cs.execute(); System.out.print(cs.getString(1));
Preguntas:
- El Método n. ° 2 arroja "SQLException: No todos los parámetros de devolución registrados" , PERO , si envuelvo la declaración SQL en " BEGIN..END; " - entonces el método n. ° 2 funciona bien.
- ¿Por qué el método # 1 funciona sin " BEGIN..END " pero el método # 2 requiere " BEGIN..END " para funcionar?
- ¿Qué tipo de "magia" " BEGIN..END " hace a la declaración para que el problema "no todos los parámetros registrados" se resuelva repentinamente?
- ¿Hay algún tercer método mejor para hacer lo anterior?
Gracias, AG.
Debido a que los parámetros especificados en las cláusulas de devolución se manejan de una manera diferente en comparación con los parámetros de salida normales (getReturnResultSet vs getResultSet vs return parameters en un callablestatement).
Deben manejarse con OraclePreparedStatement. En el segundo caso, cuando ajusta la instrucción de inserción en begin..end la base de datos maneja la inserción y al jdbc ve que hay un bloque de plsql anónimo.
http://docs.oracle.com/cd/E11882_01/java.112/e16548/oraint.htm#BABJJDDA