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));
}