2017-11-06 13 views
1

nodejs에서 oracledb를 쿼리하려고합니다. 다음은 내가 아래 nodejs에서 oracle db를 쿼리 할 때 매개 변수 이름을 가져 오지 않습니다.

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); 
} 
} 

를 쿼리에 사용하는 코드는 요청을 만드는 코드입니다 :

쿼리 1은
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); 
}); 

: "SELECT COUNT (별개의 USER_ID) chatlog FROM count_value TRUNC (('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

@DanMcGhan 노드 버전 6.11.3을 사용 중입니다. –

답변

0

simpleExecute 기능에는 몇 가지 문제가 있습니다. 첫 번째는 try/catch 블록에서 모든 것을 래핑한다는 것입니다. 그러나 비동기 작업 중 발생하는 예외 (예 : getConnectionexecute)는 catch 할 수 없습니다.

다음 문제는 사용을 마친 후에 연결을 풀로 해제하지 않는다는 것입니다.

마지막으로 simpleExecuteresponse.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/