我使用触发器来设置所有表的主键列值,因此我不在Java中执行任何关于ID的操作,但是我需要在插入后获取ID。
如何获取ID?
stat.execute("INSERT INTO TPROJECT_PROCESS_GROUP(NPROJECT_ID,VDESCRIPTION) " +
"VALUES(" +
"'" + projectID + "'," +
"'" + description + "'" +
"");
编辑:你好,我又看了一下问题,现在我遇到一个“不支持的操作”异常(我从我的母语翻译过来,确切的英文形式可能有所不同)。我猜这与Oracle是否支持GetGeneratedKeys相关?你知道这方面的情况吗?
解决方法:如一本关于callablestatements的书中所述,该语句可以用于执行存储过程和函数。与PreparedStatement不同,大多数数据库不会为调用进行任何准备工作,因为它是如此简单的命令。CallableStatement实例可用于返回存储过程或函数返回的对象。
OracleConnection conn = null;
//OraclePreparedStatement pstat = null;
OracleCallableStatement cstat = null;
String sql = "BEGIN INSERT INTO TPROJECT P (VPROJECT_TITLE,VPROJECT_DESC) VALUES(?,?) RETURNING P.NPROJECT_ID INTO ?; END;";
try {
conn = ConnectionUtility.GetConnection();
cstat = (OracleCallableStatement)conn.prepareCall(sql);
cstat.setString(1, title);
cstat.setString(2, description);
cstat.registerOutParameter(3, OracleTypes.NUMBER);
cstat.execute();
int returnedID = cstat.getInt(3);
// System.out.println(returnedID);
conn.close();
return returnedID;
PreparedStatement
代替Statement
。以下是需要翻译的内容:"Duplicate of JDBC : How can we get inserted record ID in Java?" - BalusCauto_increment
,DB2/MSSQL的identity
和Oracle/PostgreSQL的serial
都使用触发器。我不明白为什么会为插入ID创建自定义触发器。 - BalusC