Bạn không thể sử dụng getGeneratedKeys()
với CallableStatement
. Tuy nhiên khi insert
của bạn bị "ẩn" trong hàm, bạn cũng không thể sử dụng PreparedStatement
thông thường với getGeneratedKeys()
bởi vì trình điều khiển sẽ thêm một RETURNING
mệnh đề cho câu lệnh SQL - câu lệnh này không hoạt động với một lệnh gọi hàm.
Tôi thấy hai giải pháp cho vấn đề của bạn:
1. Thay đổi hàm để trả về giá trị:
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;
Lưu ý rằng tôi đã xóa order_id
không sử dụng và đổi tên hai tham số còn lại - vì thường không phải là ý kiến hay nếu có các tham số trùng tên với cột.
Sau đó, trong mã của bạn, bạn có thể sử dụng chức năng như sau:
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. Truy vấn trình tự theo cách thủ công:
Sau khi gọi hàm của mình, bạn có thể chạy một câu lệnh khác để lấy giá trị trình tự được tạo cuối cùng:
ResultSet rs = stmt.executeQuery("select lastval()");
if (rs.next()) {
System.out.println("Generated ID is: " + rs.getInt(1));
}
Ở trên sẽ chỉ hoạt động nếu hàm không chèn vào nhiều bảng. Nếu có, bạn cần sử dụng currval()
với tên trình tự:
ResultSet rs = stmt.executeQuery("select currval('ordermaster.order_id_seq')");
if (rs.next()) {
System.out.println("Generated ID is: " + rs.getInt(1));
}