Sie können getGeneratedKeys()
nicht verwenden mit einem CallableStatement
. Allerdings als Ihr insert
in der Funktion "versteckt" ist, können Sie auch kein reguläres PreparedStatement
verwenden mit getGeneratedKeys()
weil der Treiber ein RETURNING
anhängt -Klausel zur SQL-Anweisung - was bei einem Funktionsaufruf nicht funktioniert.
Ich sehe zwei Lösungen für Ihr Problem:
1. Ändern Sie die Funktion, um den Wert zurückzugeben:
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;
Beachten Sie, dass ich die unbenutzte order_id
entfernt habe -Parameter und die beiden anderen Parameter umbenannt - da es normalerweise keine gute Idee ist, Parameter mit demselben Namen wie Spalten zu haben.
Dann können Sie in Ihrem Code die Funktion wie folgt verwenden:
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. Fragen Sie die Sequenz manuell ab:
Nachdem Sie Ihre Funktion aufgerufen haben, können Sie eine weitere Anweisung ausführen, um den zuletzt generierten Sequenzwert abzurufen:
ResultSet rs = stmt.executeQuery("select lastval()");
if (rs.next()) {
System.out.println("Generated ID is: " + rs.getInt(1));
}
Das obige funktioniert nur, wenn die Funktion nicht in mehrere Tabellen einfügt. Wenn dies der Fall ist, müssen Sie currval()
verwenden mit dem Sequenznamen:
ResultSet rs = stmt.executeQuery("select currval('ordermaster.order_id_seq')");
if (rs.next()) {
System.out.println("Generated ID is: " + rs.getInt(1));
}