【问题标题】:Deleting mutliple rows with ExecuteMany Oracledb Node-Oracledb使用 ExecuteMany Oracle Node-Oracledb 删除多行
【发布时间】:2021-09-18 01:38:02
【问题描述】:

拜托,我找不到问题出在哪里。

我按照与 GitHub 示例完全相同的方法,但仍然无法正常工作。

没有事件,但每次都是 0 rowAffected。

问题与删除有关,插入可以正常工作。

代码:

data =[
  [ 'khaled', 'Paris' ],
  [ 'ivan', 'Madrid' ]
 ];

const sql = 'DELETE FROM USERS WHERE u_name= :1 and u_town = :2'

const res1 = await connection.executeMany(sql,data,{autoCommit:true});

console.log(res1) ==> rowAffected=0

当我在 oracle 客户端上尝试时,它可以工作,数据存在。

提前感谢您的回答。

【问题讨论】:

  • 检查您是否连接到 Node.js 中的同一个数据库和用户以及“oracle 客户端”(无论是什么)。

标签: node.js express node-oracledb


【解决方案1】:

您是否确认这些行实际上没有被删除?它们可能是,而您只是在 rowsAffected 中看到 0?如果是这样,您可以尝试设置 dmlRowCounts 选项以查看结果计数,per this documentation

data =[
  [ 'khaled', 'Paris' ],
  [ 'ivan', 'Madrid' ]
 ];
const options = {autoCommit:true, dmlRowCounts: true, batchErrors: true}
const sql = 'DELETE FROM USERS WHERE u_name= :1 and u_town = :2'

const res1 = await connection.executeMany(sql,data,options);

console.log(res1) ==> rowAffected=0
console.log(res1.dmlRowCounts);
console.log(res1.batchErrors);

【讨论】:

  • 感谢您的回答,是的,我做到了,但行仍然没有删除:(
  • 您可以尝试使用上面的额外更改并发布输出吗?另外,您基于哪个github示例?可以加个链接吗?
  • executeMany的例子是github.com/oracle/node-oracledb/tree/main/examples中的em_*文件
【解决方案2】:

它对我有用。例如:

/*

drop table users;
create table users (u_name varchar2(20), u_town varchar2(20));
insert into users values ( 'khaled', 'Paris' );
insert into users values ( 'ivan', 'Madrid' );
commit;
select * from users;

*/

const oracledb = require('oracledb');
const dbConfig = require('./dbconfig.js');

if (process.platform === 'darwin') {
  oracledb.initOracleClient({libDir: process.env.HOME + '/Downloads/instantclient_19_8'});
}

async function run() {
  let connection;

  try {
    connection = await oracledb.getConnection(dbConfig);

    const res = await connection.execute(`select * from users`);
    console.log(res.rows);  // [ [ 'khaled', 'Paris' ], [ 'ivan', 'Madrid' ] ]
    
    const data =[
      [ 'khaled', 'Paris' ],
      [ 'ivan', 'Madrid' ]
    ];
    const options = {autoCommit:true, dmlRowCounts: true, batchErrors: true};
    const sql = 'DELETE FROM USERS WHERE u_name= :1 and u_town = :2';

    const res1 = await connection.executeMany(sql,data,options);
    console.log(res1);  // { rowsAffected: 2, dmlRowCounts: [ 1, 1 ] }
    

    const res2 = await connection.execute(`select * from users`);
    console.log(res2.rows);  // []
    
} catch (err) {
    console.error(err);
  } finally {
    if (connection) {
      try {
    await connection.close();
      } catch (err) {
    console.error(err);
      }
    }
  }
}

run();

输出是:

[ [ 'khaled', 'Paris' ], [ 'ivan', 'Madrid' ] ]
{ rowsAffected: 2, dmlRowCounts: [ 1, 1 ] }
[]

在 SQL*Plus 中:

SQL> select * from users;

no rows selected

【讨论】:

    猜你喜欢
    • 2020-03-04
    • 2018-10-25
    • 2012-12-26
    • 2016-12-31
    • 2021-03-16
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多