Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从nodejs查询oracle数据库时未获取参数名称_Javascript_Sql_Node.js_Oracle11g_Node Oracledb - Fatal编程技术网

Javascript 从nodejs查询oracle数据库时未获取参数名称

Javascript 从nodejs查询oracle数据库时未获取参数名称,javascript,sql,node.js,oracle11g,node-oracledb,Javascript,Sql,Node.js,Oracle11g,Node Oracledb,我正试图从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,functi

我正试图从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);
});
其中,查询1是:“从聊天日志中选择count(不同的用户id)count值,其中trunc(时间戳)介于至日期('2017-09-09','YYYY-MM-DD')和至日期('2017-10-08','YYYY-MM-DD')”

问题是data1.rows参数不是作为对象数组出现,而是作为数组出现。之前,我尝试了另一种连接和查询的方法,在这种情况下效果似乎很好。我还获得了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 } ]
    }
  );
});

您可能会发现这个关于异步模式的系列非常有用:

您的
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 } ]
    }
  );
});

您可能会发现这个关于异步模式的系列非常有用:

对不起,我刚才才看到这个。。。你用的是Node.js的哪个版本?@DanMcGhan我用的是Node版本6.11.3对不起,我刚才才看到这个。。。您使用的Node.js版本是什么?@DanMcGhan我使用的是Node版本6.11.3