sql >> Database >  >> RDS >> PostgreSQL

java -postgresql laatst ingevoegde id bij invoeging krijgt niet

U kunt getGeneratedKeys() niet gebruiken met een CallableStatement . Maar als uw insert "verborgen" is in de functie, kunt u ook geen gewone PreparedStatement gebruiken met getGeneratedKeys() omdat de bestuurder een RETURNING . zal toevoegen clausule toe aan de SQL-instructie - die niet werkt met een functieaanroep.

Ik zie twee oplossingen voor uw probleem:

1. Wijzig de functie om de waarde terug te geven:

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;

Merk op dat ik de ongebruikte order_id heb verwijderd parameter en hernoemde de andere twee parameters - omdat het meestal geen goed idee is om parameters met dezelfde naam als kolommen te hebben.

Dan kun je in je code de functie als volgt gebruiken:

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. De reeks handmatig opvragen:

Nadat u uw functie hebt aangeroepen, kunt u een ander statement uitvoeren om de laatst gegenereerde reekswaarde te verkrijgen:

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

Het bovenstaande werkt alleen als de functie niet in meerdere tabellen wordt ingevoegd. Als dit het geval is, moet u currval() . gebruiken met de reeksnaam:

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



  1. orakel drop-index indien bestaat

  2. Laravel 5.4 Upgrade -- Integriteitsbeperkingsschending - Kolom kan niet null zijn

  3. Kan niet beslissen of normalisatie of de-normalisatie zou werken

  4. MySQL Database kan niet starten op XAMPP voor Mac