PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

java -postgresql dernier identifiant inséré lors de l'insertion ne pas obtenir

Vous ne pouvez pas utiliser getGeneratedKeys() avec un CallableStatement . Cependant, comme votre insert est "caché" dans la fonction, vous ne pouvez pas non plus utiliser un PreparedStatement normal avec getGeneratedKeys() car le pilote ajoutera un RETURNING clause à l'instruction SQL - qui ne fonctionne pas avec un appel de fonction.

Je vois deux solutions à votre problème :

1. Modifiez la fonction pour renvoyer la valeur :

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;

Notez que j'ai supprimé le order_id inutilisé paramètre et renommé les deux autres paramètres - car ce n'est généralement pas une bonne idée d'avoir des paramètres avec le même nom que les colonnes.

Ensuite, dans votre code, vous pouvez utiliser la fonction comme celle-ci :

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. Interrogez la séquence manuellement :

Après avoir appelé votre fonction, vous pouvez exécuter une autre instruction pour obtenir la dernière valeur de séquence générée :

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

Ce qui précède ne fonctionnera que si la fonction ne s'insère pas dans plusieurs tables. Si c'est le cas, vous devez utiliser currval() avec le nom de la séquence :

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