如何使用node-jdbc获取生成的ID?

我正在使用node-jdbcoracle驱动程序“ojdbc6_g.jar”连接到Oracle数据库。 我想执行一些插入查询。

问题:

如何使用node-jdbc将行插入到oracle时获取生成的Id?

我试图调用statement.getGeneratedKeys()但它在callback中返回以下错误:

 > { [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: {} } 

       

网上收集的解决方案 "如何使用node-jdbc获取生成的ID?"

我testing了一些解决scheme,最后我设法得到了新的插入行的ROWID 。 ROWID是oracle用于表的每一行的唯一键,与自动增量ID不同。 事实上,oracle将每一行映射到一个唯一的ROWID。

有了ROWID我们可以select插入的行并获取它的每一列。

select * from'table_name'其中rowid ='获得rowid'

要得到生成的键,我们应该调用带有参数“1”的 statement.getGeneratedKeys() ,所以我们可以使用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' } ] 

希望它是有帮助的。

许多人误解和使用PreparedStatement#executeUpdate(arg)。 Java doc说这个带参数的方法不能在PreparedStatement或CallableStatement上调用。 这意味着即使executeUpdate(arg)方法可以在PreparedStatement类中inheritance,但是我们不必使用它,否则我们必须使用不带参数的executeUpdate(),否则我们将获得SQLException。