我正在尝试从nodejs查询oracledb。下面是我用于查询的代码
exports.simpleExecute = function(query,bindParams, options,callback) {
try {
pool.getConnection(function(err, connection) {
if (err) {
console.log(err);
}
connection.execute(query,bindParams, options,function(err, data) {
console.log(data);
if (err) {
console.log(err);
response.send({})
}
callback(null, data);
})
})
} catch (err) {
callback(err, null);
}
}
以下是发出请求的代码:
database.simpleExecute(query1,{},{outFormat: database.OBJECT},function(err, data1) {
// console.log(data2);
if (err) {
console.log(err);
response.send({});
}
var percentChange = ((data1.rows[0].COUNT - data1.rows[0].COUNT) / data2.rows[0].COUNT) * 100;
var data = [data1.rows[0].COUNT, percentChange];
response.send(data);
});
其中query1为:“SELECT count(distinct user_id)count_value FROM chatlog其中trunc(timestamp)在to_date('2017-09-09','YYYY-MM-DD')和to_date('2017-10-08之间) ”, 'YYYY-MM-DD')“
问题是data1.rows参数而不是作为对象数组出现就像一个数组。以前我尝试了另一种从https://jsao.io/2015/03/making-a-wrapper-module-for-the-node-js-driver-for-oracle-database/获取连接和查询的方法,在这种情况下似乎工作得很好。我也得到了data1.rows中参数的名称。当我得到的输出打印data1是:
{ rows: [ [ 1 ] ],
resultSet: undefined,
outBinds: undefined,
rowsAffected: undefined,
metaData: [ { name: 'COUNT' } ] }
答案 0 :(得分:0)
您的simpleExecute
功能存在一些问题。首先是你将所有内容包装在try / catch块中。但是,您无法捕获在getConnection
和execute
等异步操作期间发生的异常。
下一个问题是,在完成使用后,您不会将连接释放回池中。
最后,simpleExecute
引用了response.send({})
,它不应该像调用函数那样处理它。
这是一个如何写这个的例子:
const oracledb = require('oracledb');
const config = require('./dbConfig.js');
let pool;
// Callback style simpleExecute
function simpleExecute(query, bindParams, options, callback) {
pool.getConnection(function(err, conn) {
if (err) {
callback(err);
return
}
conn.execute(query, bindParams, options, function(err, result) {
if (err) {
callback(err);
} else {
callback(null, result);
}
conn.close(function(err) {
if (err) {
console.log('error closing conn', err);
}
});
});
});
}
// Example of using simpleExecute after creating the pool
oracledb.createPool(config, function(err, p) {
if (err) {
throw err;
}
pool = p;
simpleExecute(
'select count(*) cnt from dual',
{},
{
outFormat: oracledb.OBJECT
},
function(err, result) {
if (err) {
console.log(err);
return;
}
console.log(result.rows); // [ { CNT: 1 } ]
}
);
});
您可能会发现有关异步模式的这一系列文章非常有用:https://jsao.io/2017/06/how-to-get-use-and-close-a-db-connection-using-various-async-patterns/