在 NodeJS 中使用 aysync 对 oracleDB 进行同步查询

synchronous queries on oracledb using aysync in nodejs

本文关键字:oracleDB 同步 查询 aysync NodeJS      更新时间:2023-09-26

我对nodejs很陌生。我正在使用oracledb,并希望按同步顺序进行查询。因此,一旦执行了第一个查询,那么查询的输出将用于第二个查询。我查看了async.waterfall并编写了下面的代码。以同步方式调用函数是正确的方法吗?提前谢谢。第一个查询可能比第二个查询花费更多的时间。

var update = function(fnParam1, fnParam2){  
    oracledb.maxRows = 10000;   
oracledb.getConnection(
            {
            user          : dbConfig.user,
            password      : dbConfig.password,
            connectString : dbConfig.connectString
            },
function(err, connection)
            {
                if (err) { console.log(err.message); return; }
                async.waterfall([
                                 function(callback) {
                                     connection.execute("select column1 from table1 where param1 =:nm",[fnParam1], 
                                     function(err, result)
                                     {
                                        if (err) { console.log(err); return; }
                                            column1 = String(result.rows[0][0]);
                                     });
                                     callback(null, column1,connection);
                                 },
                                 function(column1, connection,callback) {
                                    connection.execute("select count(*) from table2 where column1 = :par1 and column2= :par2",[column1,fnParam2], 
                                    function(err, result)
                                    {
                                         if (err) { console.log(err); return; }
                                         var count = String(result.rows[0][0]);
                                         console.log("count result:" + count)
                                    });
                                    callback(null, count);
                                 }
                                 ],
                                 function (err, result) {
                                    console.log("Done" + result);
                                });
                });
};

只是快速浏览一下代码,我注意到您的"回调"调用不在传递执行的回调函数中。这意味着在获得 execute 方法的结果之前,您将进入瀑布中的下一步。这是您的代码略有修改以演示我的意思。另外,不要忘记在完成连接后释放连接。

var update = function(fnParam1, fnParam2){  
    oracledb.maxRows = 10000;   
oracledb.getConnection(
            {
            user          : dbConfig.user,
            password      : dbConfig.password,
            connectString : dbConfig.connectString
            },
function(err, connection)
            {
                if (err) { console.log(err.message); return; }
                async.waterfall([
                                 function(callback) {
                                     connection.execute("select column1 from table1 where param1 =:nm",[fnParam1], 
                                     function(err, result)
                                     {
                                        if (err) { console.log(err); return; }
                                        column1 = String(result.rows[0][0]);
                                        callback(null, column1, connection);
                                     });
                                 },
                                 function(column1, connection, callback) {
                                    connection.execute("select count(*) from table2 where column1 = :par1 and column2= :par2",
                                    [column1,fnParam2], 
                                    function(err, result)
                                    {
                                         if (err) { console.log(err); return; }
                                         var count = String(result.rows[0][0]);
                                         console.log("count result:" + count);
                                         callback(null, count);
                                    });
                                 }
                                 ],
                                 function (err, result) {
                                    console.log("Done" + result);
                                });
                });
};