PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

java -postgresql ostatnio wstawiony identyfikator przy wstawianiu nie jest pobierany

Nie możesz użyć getGeneratedKeys() z CallableStatement . Jednak jako insert jest "ukryty" w funkcji, nie możesz również użyć zwykłego PreparedStatement z getGeneratedKeys() ponieważ sterownik dołączy RETURNING klauzula instrukcji SQL — która nie działa z wywołaniem funkcji.

Widzę dwa rozwiązania twojego problemu:

1. Zmień funkcję, aby zwrócić wartość:

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;

Zauważ, że usunąłem nieużywany order_id i zmieniono nazwy pozostałych dwóch parametrów - ponieważ zwykle nie jest dobrym pomysłem posiadanie parametrów o tej samej nazwie co kolumny.

Następnie w swoim kodzie możesz użyć funkcji w następujący sposób:

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. Zapytanie o sekwencję ręcznie:

Po wywołaniu funkcji możesz uruchomić inną instrukcję, aby uzyskać ostatnią wygenerowaną wartość sekwencji:

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

Powyższe zadziała tylko wtedy, gdy funkcja nie wstawia się do wielu tabel. Jeśli tak, musisz użyć currval() z nazwą sekwencji:

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. Wstępna konfiguracja Postgresql:Jak uzyskać dostęp jako użytkownik postgres?

  2. Zapisywanie kolumny JSON do Postgresa za pomocą Pandas .to_sql

  3. Klucze obce + dziedziczenie tabel w PostgreSQL?

  4. konfiguracja PostgreSQL z projektem django

  5. Sprawdź, czy klucz istnieje w JSON z PL/pgSQL?