为什么无效转换请求错误代码:17132?

我正在尝试使用JDBC预处理语句插入时获取最后插入的行ID。 我有一个自动增量主键列作为表中的标识列。 我的代码如下:

public static String insertMeetingToDB(String organizer,String subject,String location,String start_date_time,String end_date_time,String description) throws Exception { Connection dbConnection = null; PreparedStatement preparedStatement = null; Integer last_inserted_id=0; String insertTableSQL = "INSERT INTO MEETINGS" + "(ORGANIZER_EMAIL, SUBJECT, MEETING_LOCATION, START_DATE_TIME, END_DATE_TIME, MEETING_DESCRIPTION) VALUES" + "(?,?,?,?,?,?)"; SimpleDateFormat from = new SimpleDateFormat("yyyyMMdd'T'HHmmss"); from.setTimeZone(TimeZone.getTimeZone("IST")); //--CONVERTING DATE/TIME TO INDIAN STANDARD TIME SimpleDateFormat datetimeFormat = new SimpleDateFormat("yyyy-MM-dd' 'HH:mm:ss"); Date input_start_date_val = from.parse(start_date_time); Date input_end_date_val = from.parse(end_date_time); String input_start_date = datetimeFormat.format(input_start_date_val); String input_end_date = datetimeFormat.format(input_end_date_val); try { dbConnection = getConnection(); //--INSERTING MEETING DETAILS preparedStatement = dbConnection.prepareStatement(insertTableSQL, preparedStatement.RETURN_GENERATED_KEYS); preparedStatement.setString(1, organizer); preparedStatement.setString(2, subject); preparedStatement.setString(3, location); preparedStatement.setTimestamp(4, java.sql.Timestamp.valueOf(input_start_date)); preparedStatement.setTimestamp(5, java.sql.Timestamp.valueOf(input_end_date)); preparedStatement.setString(6, description); // execute insert SQL stetement preparedStatement.executeUpdate(); ResultSet rs = preparedStatement.getGeneratedKeys(); if(rs.next()) { last_inserted_id = rs.getInt(1); } return last_inserted_id.toString(); } catch (SQLException e) { return e.getMessage()+" ERROR CODE: "+e.getErrorCode(); } finally { if (preparedStatement != null) { preparedStatement.close(); } if (dbConnection != null) { dbConnection.close(); dbConnection = null; } } } 

如果我删除此行,那么我没有收到此错误:

 last_inserted_id = rs.getInt(1); 

但谷歌之后,这个代码似乎没问题,它应该返回我最后插入的行ID。

表说明:

 CREATE TABLE MEETINGS ( MEETING_ID NUMBER GENERATED ALWAYS AS IDENTITY, ORGANIZER_EMAIL VARCHAR2(100), SUBJECT VARCHAR2(250), START_DATE_TIME TIMESTAMP, END_DATE_TIME TIMESTAMP, ATTENDEES_LIST_CONFIDENTIAL CHAR(1), ATTENDEES_CONF_CONFIDENTIAL CHAR(1), ATTENDEES_COUNT_INTERNAL NUMBER(11), ATTENDEES_COUNT_EXTERNAL NUMBER(11), CONFIRMED_COUNT_INTERNAL NUMBER(11), CONFIRMED_COUNT_EXTERNAL NUMBER(11), PREVIOUS_MEETING_ID NUMBER(20), APPOINTMENT_SOURCE CHAR(1), MEETING_LOCATION VARCHAR(100), LATITUDE FLOAT(10), LONGITUDE FLOAT(10), MEETING_DESCRIPTION VARCHAR2(1000), PRIMARY KEY(MEETING_ID) ); 

Oracle JDBC文档说:

如果未明确指示键列,则Oracle JDBC驱动程序无法识别需要检索的列。 使用列名或列索引数组时,Oracle JDBC驱动程序可以识别哪些列包含要检索的自动生成的键。 但是,使用Statement.RETURN_GENERATED_KEYS整数标志时,Oracle JDBC驱动程序无法识别这些列。 当整数标志用于指示要返回自动生成的键时, ROWID伪列将作为键返回。 然后可以从ResultSet对象中获取ROWID并可以使用它来检索其他列。

您没有指定列(如示例代码所示),因此您正在检索ROWID ; 尝试使用getInt()获取它会导致您看到的错误。 (我实际上看到Invalid column type: getInt not implemented for class oracle.jdbc.driver.RowidAccessor ERROR CODE: 17004但我认为这Invalid column type: getInt not implemented for class oracle.jdbc.driver.RowidAccessor ERROR CODE: 17004不同的驱动程序版本)。

您需要指定获取自动生成值的列。 如果它被称为MEETING_ID那么你会做:

  String returnCols[] = { "MEETING_ID" }; preparedStatement = dbConnection.prepareStatement(insertTableSQL, returnCols); 

…传递列数组 – 在这种情况下只有一个 – 而不是RETURN_GENERATED_KEYS标志。

然后rs.getInt(1)将检索该数值。