Rue*_*pen 10 java database oracle jdbc
有没有办法从最后插入的行中获取值?
我正在插入一行,由于序列创建,PK将自动增加,我想得到这个序列号.只有PK才能保证在表中是唯一的.
我正在使用Java和JDBC和Oracle.
我忘了添加我想使用下面的结果集检索此值.(我用mysql尝试了这个并且它运行成功,但我不得不切换到Oracle,现在我得到了ID的字符串表示而不是实际的序列号)
Statement stmt = conn.createStatement();
stmt.executeUpdate(insertCmd, Statement.RETURN_GENERATED_KEYS);
stmt.RETURN_GENERATED_KEYS;
ResultSet rs = stmt.getGeneratedKeys();
if(rs.next()){
log.info("Successful insert");
id = rs.getString(1);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码片段将返回存储在mysql表中的列int值.但是由于我已切换到Oracle,返回的值现在是一个奇怪的字符串值.
Ada*_*kes 10
你要做的是利用这个RETURNING条款.让我们设置一个示例表和序列:
CREATE TABLE "TEST"
( "ID" NUMBER NOT NULL ENABLE,
"NAME" VARCHAR2(100 CHAR) NOT NULL ENABLE,
CONSTRAINT "PK_TEST" PRIMARY KEY ("ID")
);
CREATE SEQUENCE SEQ_TEST;
Run Code Online (Sandbox Code Playgroud)
现在,您的Java代码应如下所示:
String insertSql = "BEGIN INSERT INTO TEST (ID, NAME) VALUES (SEQ_TEST.NEXTVAL(), ?) RETURNING ID INTO ?; END;";
java.sql.CallableStatement stmt = conn.prepareCall(insertSql);
stmt.setString(1, "John Smith");
stmt.registerOutParameter(2, java.sql.Types.VARCHAR);
stmt.execute();
int id = stmt.getInt(2);
Run Code Online (Sandbox Code Playgroud)
这与其他数据库不一致,但在使用 Oracle 时,使用 时getGeneratedKeys()返回插入行的 ROWID Statement.RETURN_GENERATEDKEYS。所以你需要使用oracle.sql.ROWID专有类型来“读取”它:
Statement stmt = connection.createStatement();
stmt.executeUpdate(insertCmd, Statement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.getGeneratedKeys();
oracle.sql.ROWID rid = (oracle.sql.ROWID) rs.getObject(1);
Run Code Online (Sandbox Code Playgroud)
但这不会给你生成的 PK ID。当与Oracle合作,您应该使用的方法executeUpdate(String sql, int[] columnIndexes)或executeUpdate(String sql, String[] columnNames)代替executeUpdate(String sql, int autoGeneratedKeys)来获取生成的序列值。像这样(调整值以匹配索引或主键列的名称):
stmt.executeUpdate(INSERT_SQL, new int[] {1});
ResultSet rs = stmt.getGeneratedKeys();
Run Code Online (Sandbox Code Playgroud)
或者
stmt.executeUpdate(INSERT_SQL, new String[] {"ID"});
ResultSet rs = stmt.getGeneratedKeys();
Run Code Online (Sandbox Code Playgroud)
虽然挖多一点就这一点,看来,这种做法是在显示Spring文档(如提到这里),所以,好了,我想这不可能是完全错误的。但是,不幸的是,它并不是真正可移植的,并且可能无法在其他平台上运行。
| 归档时间: |
|
| 查看次数: |
15474 次 |
| 最近记录: |