[英]Not getting parameter name on querying oracle db from nodejs
我正在嘗試從 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 where trunc(timestamp) between to_date('2017-09-09','YYYY-MM-DD') and 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' } ] }
您的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/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.