【发布时间】:2011-03-28 00:04:34
【问题描述】:
我使用触发器来设置所有表的 PK 列值,因此我不对 java 中的 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;
【问题讨论】:
-
Duplicate of JDBC : How can we get inserted record ID in Java? 请注意,您的语句对 SQL 注入很敏感。你应该更喜欢
PreparedStatement而不是Statement。 -
实际上,我不确定这是否是精确重复,因为这里不知何故使用了触发器。
-
@erickson:这个词在问题上下文中确实是模棱两可的,但在幕后,MySQL
auto_increment、DB2/MSSQLidentity和 Oracle/PostgreSQLserial都在使用触发器。我不明白为什么要为插入 ID 创建一个自定义。 -
是的,我有关于 sql 注入和防止其他地方攻击的信息,但你说得对,那就更好了,这是我在 java 中的第一个 db 应用程序体验(我是 .net 开发人员 LINQ 在那里工作正常: P)所以我正在学习感谢您的建议=)