PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

जावा -postgresql प्रविष्टि पर अंतिम डाली गई आईडी नहीं मिल रही है

आप getGeneratedKeys() का उपयोग नहीं कर सकते हैं एक CallableStatement के साथ . हालांकि आपके insert . के रूप में फ़ंक्शन में "छिपा हुआ" है, आप एक नियमित PreparedStatement का भी उपयोग नहीं कर सकते getGeneratedKeys() . के साथ क्योंकि ड्राइवर एक RETURNING जोड़ देगा SQL कथन का खंड - जो फ़ंक्शन कॉल के साथ काम नहीं करता है।

मुझे आपकी समस्या के दो समाधान दिखाई दे रहे हैं:

<एच3>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 . को हटा दिया है पैरामीटर और अन्य दो पैरामीटर का नाम बदल दिया - क्योंकि आमतौर पर कॉलम के समान नाम वाले पैरामीटर रखना एक अच्छा विचार नहीं है।

फिर अपने कोड में आप इस तरह के फ़ंक्शन का उपयोग कर सकते हैं:

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));
}
<एच3>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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. लिक्विबेस सभी कार्यों को छोड़ देता है - postgresql

  2. मैं PostgreSQL का उपयोग करके पिछले महीने का अंतिम दिन कैसे निर्धारित करूं?

  3. कमांड लाइन का उपयोग करके पोस्टग्रेज बैकअप फ़ाइल को पुनर्स्थापित करें?

  4. क्या एक प्रश्न में प्रत्येक पंक्ति के लिए अलग-अलग स्थितियां संभव हैं?

  5. माइग्रेशन में रॉ क्वेरी निष्पादित करें - सीक्वेलाइज़ 3.30