Node.js 使用节点oracledb ExecuteMy删除多条记录

Node.js 使用节点oracledb ExecuteMy删除多条记录,node.js,oracle,node-oracledb,Node.js,Oracle,Node Oracledb,我想在nodejs项目上从oracle数据库中删除多行。 我正在使用oracledb(4.0.1)和节点(v10.14.2) 当我这样做的时候,我犯了这样的错误{“level”:50,“time”:1573197878989,“msg”:“Failed:错误:DPI-1050:Oracle客户端库的版本为11.2,但必须为12.1或更高版本,大小写为:ora.deleteMany”,“pid”:11092,“主机名”:“***”,“v”:1} 根据该错误,它声称Oracle客户端存在问题。但是我

我想在nodejs项目上从oracle数据库中删除多行。 我正在使用oracledb(4.0.1)和节点(v10.14.2)

当我这样做的时候,我犯了这样的错误<代码>{“level”:50,“time”:1573197878989,“msg”:“Failed:错误:DPI-1050:Oracle客户端库的版本为11.2,但必须为12.1或更高版本,大小写为:ora.deleteMany”,“pid”:11092,“主机名”:“***”,“v”:1} 根据该错误,它声称Oracle客户端存在问题。但是我的Oracle客户端已经12.2.0.1.0

我可以在当前项目上成功地使用
SELECT
UPDATE
查询,而不会出现任何错误。现在我想使用
DELETE
query,当我这样做时,我得到了那个错误

我将在下面解释我是如何编写代码的

这些是我想从表中删除的ID<代码>[{ID:11865},{ID:23249}] 我使用
SELECT
query生成json列表。它将要删除的ID作为json列表返回给我

const getTodayDailyDiff = async config => {
  let test = [];
  const today = new Date().toISOString().split('T')[0];
  let connection;
  try {
    connection = await oracledb.getConnection(config);
    test = await connection.execute(
      `
    (SELECT ID FROM TNT.DAILY_DIFF
      WHERE TO_CHAR(DIFF_DATE, 'YYYY-MM-DD') = :today)
      `,
      [today]
    );
  } catch (err) {
    log.error(err, 'ora.diffReport');
  } finally {
    if (connection) {
      connection.close();
    }
  }
  return test;
};
然后我将json列表(
getToDailyDiff.rows
)发送到我的
DELETE
查询

const deleteMany = async (config, getTodayDailyDiff.rows) => {
  let test = [];
  let connection;
  const sql = `DELETE FROM DAILY_DIFF WHERE ID = :ID`;
  const options = {
    dmlRowCounts: true,
    autoCommit: true
  };
  try {
    connection = await oracledb.getConnection(config);
    test = await connection.executeMany(sql, getTodayDailyDiff.rows, options);
  } catch (err) {
    log.error(err, 'ora.deleteMany');
  } finally {
    if (connection) {
      connection.close();
    }
  }
  return test;
};

我知道这并不能解决客户机的问题,但也许更好的解决方案是将这两个调用结合起来,省去访问数据库的时间

DELETE FROM DAILY_DIFF WHERE ID in (SELECT ID FROM TNT.DAILY_DIFF
      WHERE TO_CHAR(DIFF_DATE, 'YYYY-MM-DD') = '${today}')

但是使用绑定变量而不是${today}。否则会出现安全问题,如果语句执行多次,则可能会出现性能/可伸缩性问题。实际上,我先编写了@Diver编写的代码,然后出现了一些错误。我改了。首先,我将尝试在nodejs上更改客户端版本。那我就照你说的去做me@ChristopherJones感谢您的建议,我使用了一个绑定变量。运行以检查Node.js使用的客户端版本。不管版本如何,按照@Diver的回答组合SQL。看起来我在使用客户端11.2.0.1.0。实际上我有客户端版本12.2.0.1.0。我想即使我有更高版本的客户端,它仍然可以在旧客户端上工作<代码>运行时间:2019年11月11日星期一10:14:31 GMT+0300(GMT+03:00)Node.js版本:v10.14.2(win32 x64)Node oracledb版本:4.0.1 Oracle客户端库版本:11.2.0.1.0 Oracle数据库版本:12.2.0.1.0您实际上有11.2。它可能位于更高版本之前的路径中,也可能位于某些默认系统目录中。在文件系统中搜索所有oci.dll文件。
Node.js版本:v10.14.2(win32 x64)Node oracledb版本:3.0.1 Oracle客户端库版本:19.3.0.0.0 Oracle数据库版本:12.2.0.1.0
我现在更新我的客户端,但在运行
删除
查询时没有收到该错误。谢谢,奇怪的是,你有了一个更新的即时客户端,但有一个旧节点oracledb!