PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Java -postgresql id yang terakhir dimasukkan saat penyisipan tidak mendapatkan

Anda tidak dapat menggunakan getGeneratedKeys() dengan CallableStatement . Namun sebagai insert "tersembunyi" dalam fungsinya, Anda juga tidak dapat menggunakan PreparedStatement biasa dengan getGeneratedKeys() karena driver akan menambahkan RETURNING klausa ke pernyataan SQL - yang tidak berfungsi dengan pemanggilan fungsi.

Saya melihat dua solusi untuk masalah Anda:

1. Ubah fungsi untuk mengembalikan nilai:

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;

Perhatikan bahwa saya menghapus order_id yang tidak digunakan parameter dan mengganti nama dua parameter lainnya - karena biasanya bukan ide yang baik untuk memiliki parameter dengan nama yang sama dengan kolom.

Kemudian dalam kode Anda, Anda dapat menggunakan fungsi seperti ini:

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. Kueri urutannya secara manual:

Setelah memanggil fungsi Anda, Anda dapat menjalankan pernyataan lain untuk mendapatkan nilai urutan yang dihasilkan terakhir:

ResultSet rs = stmt.executeQuery("select lastval()");
if (rs.next()) {
  System.out.println("Generated ID is: " + rs.getInt(1));
}

Di atas hanya akan berfungsi jika fungsinya tidak dimasukkan ke dalam beberapa tabel. Jika ya, Anda perlu menggunakan currval() dengan nama urutan:

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. JPA flush vs komit

  2. Apakah ada cara agar PostgreSQL tidak menciutkan tanda baca dan spasi saat menyusun menggunakan bahasa?

  3. Muat dump Postgres setelah docker-compose up

  4. hibernate tidak bisa mendapatkan nilai urutan berikutnya

  5. Kesalahan:tidak dapat menentukan versi PostgreSQL dari '10.3' - Django di Heroku