sql >> Databasteknik >  >> RDS >> PostgreSQL

java -postgresql senast infogade id vid infogning får inte

Du kan inte använda getGeneratedKeys() med en CallableStatement . Men som din insert är "dold" i funktionen kan du inte heller använda en vanlig PreparedStatement med getGeneratedKeys() eftersom föraren kommer att lägga till en RETURNING klausul till SQL-satsen - som inte fungerar med ett funktionsanrop.

Jag ser två lösningar på ditt problem:

1. Ändra funktionen för att returnera värdet:

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;

Observera att jag tog bort det oanvända order_id parameter och döpte om de andra två parametrarna - eftersom det vanligtvis inte är en bra idé att ha parametrar med samma namn som kolumner.

Sedan kan du i din kod använda funktionen så här:

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. Fråga efter sekvensen manuellt:

Efter att ha anropat din funktion kan du köra en annan sats för att få det senast genererade sekvensvärdet:

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

Ovanstående fungerar bara om funktionen inte infogas i flera tabeller. Om det gör det måste du använda currval() med sekvensnamnet:

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



  1. kommer pg_restore att skriva över de befintliga tabellerna?

  2. Lägg till unik begränsning baserat på fältvärde

  3. Postgres unika flerkolumnsindex för sammanfogningstabell

  4. mysql, ändra kolumn ta bort primärnyckel och automatisk inkrementering