Search code examples
javascriptnode.jsnode-oracledb

How to retrieve values from node-oracledb toQueryStream() as a Promise


While trying to get the rows from resultSet using toQueryStream() I can only find the rows in console. But not able to return value using promises as toQueryStream() function uses eventListener to resolve rows. My code is given below please suggest to get the row values.

function getPosCounter() {
    return oracledb.getConnection(kcdConnStr)
        .then(function (conn) {
            return conn.execute(`BEGIN GETPOSCOUNTER(:CV_1); END;`, { // EXECUTE ORACLE PROCEDURE
                CV_1: { dir: oracledb.BIND_OUT, type: oracledb.CURSOR } //CURSOR DEFINED FOR OUT PARAM
            })
                .then((result) => {
                    var resRows = new Array();
                    var resultSet = result.outBinds.CV_1; //RESULT SET FOR OUTPUT
                    var queryStream = resultSet.toQueryStream(); //QUERYSTREAM INITIALIZED FOR CURSOR VALUES
                    var consumeStream = new Promise((resolve, reject) => {
                        queryStream.on('data', function (row) {
                            console.log(row);
                        });
                        queryStream.on('error', reject);
                        queryStream.on('close', resolve);
                    })
                        .then(rows => {
                            console.dir(rows); //RETURN ROW VALUES 
                        });

                })
                .catch((err) => {
                    conn.close();
                    console.error(err);
                    return 'failure';
                })
        });
}

Solution

  • Before this issue I faced, I was not aware about the nodeJs-Stream feature which is quiet difficult to understand for me. So I found a documentation on Oracle Community about getting the rows from result set. Make it possible in the below way.

    function getPosCounter() {
        return oracledb.getConnection(kcdConnStr)
            .then(function (conn) {
                return conn.execute(`BEGIN USP_POSCOUNTER(:CV_1); END;`, { // EXECUTE ORACLE PROCEDURE
                    CV_1: { dir: oracledb.BIND_OUT, type: oracledb.CURSOR } //CURSOR DEFINED FOR OUT PARAM
                })
                    .then((result) => {
                        var resRows = [];
                        var resultSet = result.outBinds.CV_1; //RESULT SET FOR OUTPUT
                        var queryStream = resultSet.toQueryStream(); //QUERYSTREAM INITIALIZED FOR CURSOR VALUES
                        return consumeStream = new Promise((resolve, reject) => {
                            queryStream.on('data', (row) => {
                                resRows.push(row); //STORE ROWS IN TO BLANK ARRAY 
                            });
                            queryStream.on('error', reject);
                            queryStream.on('close', () => {
                                resolve(resRows); //RETURN ON RESOLVING ALL THE ROWS
                                conn.close();
                            });
                        });
                    })
                    .catch((err) => {
                        conn.close();
                        //console.error(err);
                        return 'failure';
                    })
            });
    }