为什么无效的转换请求了错误代码: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伪列作为键返回。然后ROWID可以从ResultSet对象中获取,并且可以将其用于检索其他列。

您没有指定列(如其示例代码中所示),因此正在检索ROWID;。尝试使用getInt()它会导致您看到错误。(我实际上看到了,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)则将检索该数值。

以上是 为什么无效的转换请求了错误代码:17132? 的全部内容, 来源链接: utcz.com/qa/401957.html

回到顶部