आप 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));
}