sql >> データベース >  >> RDS >> PostgreSQL

java-postgresql挿入時に最後に挿入されたIDが取得されない

    getGeneratedKeys()は使用できません CallableStatementを使用 。ただし、insertとして 関数内で「非表示」になっている場合、通常のPreparedStatementを使用することもできません。 getGeneratedKeys()を使用 ドライバーがRETURNINGを追加するためです SQLステートメントの句-これは関数呼び出しでは機能しません。

    私はあなたの問題に対する2つの解決策を見ます:

    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を削除したことに注意してください パラメータを変更し、他の2つのパラメータの名前を変更しました-通常、列と同じ名前のパラメータを使用することはお勧めできません。

    次に、コードで次のような関数を使用できます。

    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. mysql同じテーブルの2つの行の違いを見つけて、一致しないレコードを一覧表示する方法は? mysqlがテーブル内の一致しない行を検索

    2. 親テーブルと子テーブルを結合する最良の方法

    3. SQLServerの単一行から複数​​の文字列を抽出する方法

    4. MySqlクエリは実行されますが、spでは機能しません