sql >> Base de Datos >  >> RDS >> PostgreSQL

java -postgresql última identificación insertada en la inserción no se obtiene

No puedes usar getGeneratedKeys() con un CallableStatement . Sin embargo, como su insert está "oculto" en la función, tampoco puede usar un PreparedStatement regular con getGeneratedKeys() porque el controlador agregará un RETURNING cláusula a la instrucción SQL, que no funciona con una llamada de función.

Veo dos soluciones a su problema:

1. Cambie la función para devolver el valor:

CREATE OR REPLACE FUNCTION insert_orderhead(
    p_order_id integer, 
    p_order_dt text, 
    p_customer_id integer, 
    p_route_id integer, 
    p_routenum integer, 
    p_ordertype text, 
    p_create_station_id integer, 
    p_create_stationtype text, 
    p_create_time text, 
    p_create_user_id integer, 
    p_tran_time text, 
    p_tran_user_id integer)
  RETURNS integer AS
$BODY$
   INSERT INTO ordermaster 
     (order_dt, customer_id, route_id, routenum, ordertype, create_station_id, create_stationtype, create_time,create_user_id,tran_time, tran_user_id)
   values 
     (p_order_dt, p_customer_id, p_route_id, p_routenum, p_ordertype, p_create_station_id, p_create_stationtype, p_create_time, p_create_user_id, p_tran_time, p_tran_user_id) 
   returning  orderline_id;
$BODY$
  LANGUAGE sql VOLATILE
  COST 100;

Tenga en cuenta que eliminé el order_id no utilizado parámetro y cambió el nombre de los otros dos parámetros, porque generalmente no es una buena idea tener parámetros con el mismo nombre que las columnas.

Luego, en su código puede usar la función como esta:

PreparedStatement pstmt = con.prepareStatement("select insert_order(?,?)");
pstmt.setString(1, "foo");
pstmt.setInt(2, 42);

rs = pstmt.executeQuery();

if (rs.next()) {
  System.out.println("Generated ID is: " + rs.getInt(1));
}

2. Consulta la secuencia manualmente:

Después de llamar a su función, puede ejecutar otra instrucción para obtener el último valor de secuencia generado:

ResultSet rs = stmt.executeQuery("select lastval()");
if (rs.next()) {
  System.out.println("Generated ID is: " + rs.getInt(1));
}

Lo anterior solo funcionará si la función no se inserta en varias tablas. Si es así, debe usar currval() con el nombre de secuencia:

ResultSet rs = stmt.executeQuery("select currval('ordermaster.order_id_seq')");
if (rs.next()) {
  System.out.println("Generated ID is: " + rs.getInt(1));
}