PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

java -postgresql последният вмъкнат идентификатор при вмъкване не се получава

Не можете да използвате getGeneratedKeys() с CallableStatement . Въпреки това като вашия insert е „скрит“ във функцията, вие също не можете да използвате обикновен PreparedStatement с getGeneratedKeys() защото драйверът ще добави RETURNING клауза към SQL израза - което не работи с извикване на функция.

Виждам две решения на вашия проблем:

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 параметър и преименува другите два параметъра - защото обикновено не е добра идея да имате параметри със същото име като колони.

След това във вашия код можете да използвате функцията по следния начин:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Възел PostgreSQL таймаут на заявка от клиента

  2. Как да направим SUM без групиране по

  3. Django:изберете стойности с максимални времеви марки или се присъединете към същата таблица

  4. Postgres - Това ли е правилният начин за създаване на частичен индекс на булева колона?

  5. Rake спецификацията се проваля на повечето тестове, но rails работи добре на източника Diaspora