Node.js 如何使用节点jdbc获取生成的Id?
我正在使用和oracle驱动程序ojdbc6_g.jar连接到oracle数据库。我想执行一些插入查询 问题是: 在使用节点jdbc向oracle插入行时,如何获取生成的Id 我尝试调用statement.getGeneratedKeys,但它在回调中返回以下错误:Node.js 如何使用节点jdbc获取生成的Id?,node.js,oracle,jdbc,insert,Node.js,Oracle,Jdbc,Insert,我正在使用和oracle驱动程序ojdbc6_g.jar连接到oracle数据库。我想执行一些插入查询 问题是: 在使用节点jdbc向oracle插入行时,如何获取生成的Id 我尝试调用statement.getGeneratedKeys,但它在回调中返回以下错误: > { [Error: Error running instance method java.sql.SQLException: > operation not allowed > at oracl
> { [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: {} }
许多人误解并使用PreparedStatementexecuteUpdatearg。Javadoc表示不能在PreparedStatement或CallableStatement上调用此带参数的方法。这意味着我们必须在没有参数的情况下使用executeUpdate,即使executeUpdatearg方法可以在PreparedStatement类中继承,但我们不必使用它,否则我们将得到SQLException。我测试了一些解决方案,最后我设法获得了新插入行的ROWID。ROWID是oracle用于表中每一行的唯一键,它不同于自动递增ID。事实上,oracle将每一行映射到一个唯一的ROWID 有了ROWID,我们可以选择插入的行并获取其中的每一列 从“表_名称”中选择*,其中rowid=“获取的rowid” 要获取生成的键,我们应该使用参数1调用statement.executeUpdate,这样我们就可以使用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' } ]