PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

java -postgresql ultimo ID inserito all'inserimento che non viene ricevuto

Non puoi usare getGeneratedKeys() con un CallableStatement . Tuttavia, come tuo insert è "nascosto" nella funzione, inoltre non puoi utilizzare un normale PreparedStatement con getGeneratedKeys() perché l'autista aggiungerà un RETURNING clausola all'istruzione SQL, che non funziona con una chiamata di funzione.

Vedo due soluzioni al tuo problema:

1. Modifica la funzione per restituire il valore:

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;

Nota che ho rimosso il order_id inutilizzato parametro e rinominato gli altri due parametri, perché di solito non è una buona idea avere parametri con lo stesso nome delle colonne.

Quindi nel tuo codice puoi usare la funzione in questo modo:

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. Interroga manualmente la sequenza:

Dopo aver chiamato la tua funzione, puoi eseguire un'altra istruzione per ottenere l'ultimo valore di sequenza generato:

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

Quanto sopra funzionerà solo se la funzione non si inserisce in più tabelle. Se lo fa, devi usare currval() con il nome della sequenza:

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