我写了一些代码来调用过程,它的OUT参数类型是cursor(ResultSet),所以我必须从ResultSet中获取数据,为此我编写了一个函数(fetchRowsFromRS()),该函数从ResultSet中提取数据
我的代码有什么错误?
db.js
connection.execute(plsql,bindvars,options,async function (err, result) {
if (err) {
console.log(err);
console.error(err.message);
doRelease(connection);
return;
}
if(result.outBinds.OUT_STATUS=='SUCCESS'){
if(result.outBinds.OUT_MENU_NAME.metaData.length=0){
loginRes.getUserLoginServiceRes.Header.Status=aes.encryption('Failure');
loginRes.getUserLoginServiceRes.Header.Status_Desc=aes.encryption('No record found in database');
}else{
loginRes.getUserLoginServiceRes.Header.Status=aes.encryption('Success');
loginRes.getUserLoginServiceRes.Header.Status_Desc=aes.encryption('User
logged in successfully');
var numRows=20;
//calling function to fetch data from ResultSet
var rsData=await fetchRowsFromRS(connection,result.outBinds.OUT_MENU_NAME,numRows)
console.log('----------'+rsData);//giving undefined
//here i want to use ResultSet Data
}
}
})
从ResultSet中提取数据的函数(不返回任何内容)
function fetchRowsFromRS(connection, resultSet, numRows) {
resultSet.getRows(numRows,function (err, rows) {
if (err) {
console.error(err);
doClose(connection, resultSet); // always close the ResultSet
} else if (rows.length > 0) {
console.log("fetchRowsFromRS(): Got " + rows.length + " rows");
console.log(rows); //getting data here
if (rows.length === numRows) // might be more rows
fetchRowsFromRS(connection, resultSet, numRows);
else
doClose(connection, resultSet); // always close the ResultSet
} else { // no rows
doClose(connection, resultSet); // always close the ResultSet
}
return rows;
});
}
答案 0 :(得分:0)
fetchRowsFromRS
未返回任何内容。您似乎没有正确使用异步/等待。 resultSet.getRows
使用回调。更改它以返回Promise或包装 Promise,然后从fetchRowsFromRS
返回。然后您就可以await
了。
答案 1 :(得分:0)
function fetchRowsFromRS(connection, resultSet, numRows) {
return resultSet
.getRows(numRows)
.then(function(rows) {
if (rows.length > 0) {
console.log('fetchRowsFromRS(): Got ' + rows.length + ' rows')
console.log(rows) //getting data here
if (rows.length === numRows)
// might be more rows
fetchRowsFromRS(connection, resultSet, numRows)
else doClose(connection, resultSet) // always close the ResultSet
} else {
// no rows
doClose(connection, resultSet) // always close the ResultSet
}
return rows
})
.catch(function(err) {
if (err) {
console.error(err)
doClose(connection, resultSet) // always close the ResultSet
}
})
}
如果 resultSet.getRows(numRows)返回一个承诺而不是接受回调,或者 resultSet.getRows(numRows)有其他替代方法,则上述方法将起作用兑现承诺。
等待fetchRowsFromRS(connection,resultSet,numRows)
仅在 fetchRowsFromRS(connection,resultSet,numRows)返回一个Promise时起作用,这反过来又需要该函数中定义的所有内容才能返回Promise。
OR
使用新承诺
function fetchRowsFromRS(connection, resultSet, numRows) {
return new Promise(function(resolve, reject) {
resultSet.getRows(numRows, function(err, rows) {
if (err) {
console.error(err)
doClose(connection, resultSet) // always close the ResultSet
reject(err)
} else if (rows.length > 0) {
console.log('fetchRowsFromRS(): Got ' + rows.length + ' rows')
console.log(rows) //getting data here
if (rows.length === numRows)
// might be more rows
fetchRowsFromRS(connection, resultSet, numRows)
else doClose(connection, resultSet) // always close the ResultSet
} else {
// no rows
doClose(connection, resultSet) // always close the ResultSet
}
resolve(rows)
})
})
}