getGeneratedKeys()
は使用できません CallableStatement
を使用 。ただし、insert
として 関数内で「非表示」になっている場合、通常のPreparedStatement
を使用することもできません。 getGeneratedKeys()
を使用 ドライバーがRETURNING
を追加するためです SQLステートメントの句-これは関数呼び出しでは機能しません。
私はあなたの問題に対する2つの解決策を見ます:
1。関数を変更して値を返します:
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;
未使用のorder_id
を削除したことに注意してください パラメータを変更し、他の2つのパラメータの名前を変更しました-通常、列と同じ名前のパラメータを使用することはお勧めできません。
次に、コードで次のような関数を使用できます。
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。シーケンスを手動でクエリします:
関数を呼び出した後、別のステートメントを実行して、最後に生成されたシーケンス値を取得できます。
ResultSet rs = stmt.executeQuery("select lastval()");
if (rs.next()) {
System.out.println("Generated ID is: " + rs.getInt(1));
}
上記は、関数が複数のテーブルに挿入されない場合にのみ機能します。含まれている場合は、currval()
を使用する必要があります シーケンス名:
ResultSet rs = stmt.executeQuery("select currval('ordermaster.order_id_seq')");
if (rs.next()) {
System.out.println("Generated ID is: " + rs.getInt(1));
}