我正在使用node-jdbc和oracle驱动程序"ojdbc6_g.jar"连接到Oracle数据库.我想执行一些插入查询.
问题:
使用node-jdbc在oracle中插入行时如何获取生成的Id?
我试图调用,statement.getGeneratedKeys()
但它在回调中返回以下错误:
> { [Error: Error running instance method java.sql.SQLException: > operation not allowed > at oracle.jdbc.driver.OracleStatement.getGeneratedKeys(OracleStatement.java:8425) > at oracle.jdbc.driver.OracleStatementWrapper.getGeneratedKeys(OracleStatementWrapper.java:1106) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:483) ] cause: {} }
Majid Yaghou.. 5
我测试了一些解决方案,最后我设法获得了新插入行的ROWID.ROWID是oracle用于表的每一行的唯一键,与自动增量ID不同.事实上,oracle将每一行映射到一个唯一的ROWID.
有了ROWID,我们可以选择插入的行并获取它的每一列.
从'table_name'中选择*,其中rowid ='获得的rowid'
要获取生成的密钥,我们应该statement.executeUpdate()
使用参数"1"调用,以便我们可以使用statement.getGeneratedKeys()
.
这是我对jdbc节点模块的修改以获得ROWID:
JDBCConn.prototype.executeInsert = function (sql, callback, getGeneratedKeys) { var self = this; self._conn.createStatement(function (err, statement) { if (err) { return callback(err); } else { // calling `statement.executeUpdate()` with parameter 1 statement.executeUpdate(sql, 1, function (err, rowcount) { if (err) { return callback(err); } else { if (getGeneratedKeys) { statement.getGeneratedKeys(function (err, resultset) { resultset.getMetaData(function (err, rsmd) { if (err) { return callback(err); } else { var results = []; var cc = rsmd.getColumnCountSync(); var columns = ['']; for (var i = 1; i <= cc; i++) { var colname = rsmd.getColumnNameSync(i); columns.push(colname); } var next = resultset.nextSync(); var processRow = function (next) { if (next) { setImmediate(function () { var row = {}; for (var a = 1; a <= cc; a++) { row[columns[a]] = trim1(resultset.getStringSync(a)); } results.push(row); next = resultset.nextSync(); processRow(next); }); } else { callback(null, rowcount, results); } }; processRow(next); } }); }); } else { callback(null, rowcount); } } }); } }); };
结果是一组对象,如:
[ { ROWID: 'AAAVTcAAEAAAADzAAK' } ]
希望它有所帮助.
我测试了一些解决方案,最后我设法获得了新插入行的ROWID.ROWID是oracle用于表的每一行的唯一键,与自动增量ID不同.事实上,oracle将每一行映射到一个唯一的ROWID.
有了ROWID,我们可以选择插入的行并获取它的每一列.
从'table_name'中选择*,其中rowid ='获得的rowid'
要获取生成的密钥,我们应该statement.executeUpdate()
使用参数"1"调用,以便我们可以使用statement.getGeneratedKeys()
.
这是我对jdbc节点模块的修改以获得ROWID:
JDBCConn.prototype.executeInsert = function (sql, callback, getGeneratedKeys) { var self = this; self._conn.createStatement(function (err, statement) { if (err) { return callback(err); } else { // calling `statement.executeUpdate()` with parameter 1 statement.executeUpdate(sql, 1, function (err, rowcount) { if (err) { return callback(err); } else { if (getGeneratedKeys) { statement.getGeneratedKeys(function (err, resultset) { resultset.getMetaData(function (err, rsmd) { if (err) { return callback(err); } else { var results = []; var cc = rsmd.getColumnCountSync(); var columns = ['']; for (var i = 1; i <= cc; i++) { var colname = rsmd.getColumnNameSync(i); columns.push(colname); } var next = resultset.nextSync(); var processRow = function (next) { if (next) { setImmediate(function () { var row = {}; for (var a = 1; a <= cc; a++) { row[columns[a]] = trim1(resultset.getStringSync(a)); } results.push(row); next = resultset.nextSync(); processRow(next); }); } else { callback(null, rowcount, results); } }; processRow(next); } }); }); } else { callback(null, rowcount); } } }); } }); };
结果是一组对象,如:
[ { ROWID: 'AAAVTcAAEAAAADzAAK' } ]
希望它有所帮助.