PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

java -postgresql id được chèn lần cuối khi chèn không nhận được

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Docker Compose và Postgres:Tên không giải quyết được

  2. Không thể tạo cơ sở dữ liệu mới bằng cách sử dụng pgadmin4

  3. Làm cách nào để ghép hai từ cuối cùng trong một câu trong PostgreSQL?

  4. Cách chọn bản ghi từ 24 giờ qua trong PostgreSQL

  5. Có một lần truy cập hiệu suất sử dụng các kiểu dữ liệu thập phân (MySQL / Postgres)