gpt4 book ai didi

node.js - 如何使用 node-jdbc 获取生成的 Id?

转载 作者:搜寻专家 更新时间:2023-10-31 22:43:06 26 4
gpt4 key购买 nike

我正在使用 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: {} }

最佳答案

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

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

select * from 'table_name' where rowid = 'obtained rowid'

要获取生成的 key ,我们应该使用参数 “1” 调用 statement.executeUpdate(),因此我们可以使用 statement.getGeneratedKeys().

这里是我修改jdbc Node 模块获取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);
}
}
});
}
});
};

results 是一个对象数组,例如:

[ { ROWID: 'AAAVTcAAEAAAADzAAK' } ]

希望对您有所帮助。

关于node.js - 如何使用 node-jdbc 获取生成的 Id?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34478419/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com