ExecuteMany 插入错误的值

Posted

技术标签:

【中文标题】ExecuteMany 插入错误的值【英文标题】:ExecuteMany inserts wrong value 【发布时间】:2020-02-29 13:33:54 【问题描述】:

我正在使用带有节点 (v10.14.2) 的 oracledb (4.0.1)。我在下面有 json 列表;

[  DIFFID: 8,
    DIFFDATE: 2019-11-01T14:04:41.831Z,
    REGIONNAMEA: 'TURKEY',
    VENDORA: 'XXX',
    SOURCECOUNT: 797,
    DIFFCOUNT: 8,
    PERCENTAGE: 99 ,
   DIFFID: 8,
    DIFFDATE: 2019-11-01T14:04:41.831Z,
    REGIONNAMEA: 'GERMANY',
    VENDORA: 'XXX',
    SOURCECOUNT: 440,
    DIFFCOUNT: 8,
    PERCENTAGE: 98.18 ,
   DIFFID: 8,
    DIFFDATE: 2019-11-01T14:04:41.831Z,
    REGIONNAMEA: 'FRANCE',
    VENDORA: 'XXX',
    SOURCECOUNT: 206,
    DIFFCOUNT: 5,
    PERCENTAGE: 97.57  ]

通过 oracledb executeMany 方法,我会将该 json 列表插入到数据库中。这是我在下面调用该函数的方式;

const saveManySla = async (config, jList) => 
  let test = [];
  let connection;
  try 
    connection = await oracledb.getConnection(config);
    test = await connection.executeMany(
      `
    INSERT INTO DAILY_DIFF_SLA 
      VALUES (SEQ_DAILY_DIFF_SLA.NEXTVAL, :DIFFID, :DIFFDATE, :REGIONNAMEA, :VENDORA, :SOURCECOUNT, :DIFFCOUNT, :PERCENTAGE)
      `,
      jList,
      
        autoCommit: true
      
    );
   catch (err) 
    log.error(err, 'ora.saveManySla');
   finally 
    if (connection) 
      connection.close();
    
  
  return test;
;

顺便说一句,在我第一次遇到这样的问题之前,我曾多次使用过 executeMany 方法。它错误地插入了 json 列表。这是它在下面的 DB 上的样子;

ID |DIFF_REPORT_ID|DIFF_DATE          |REGION        |VENDOR |SOURCE_COUNT|DIFF_COUNT|PERCENTAGE         |
---|--------------|-------------------|--------------|-------|------------|----------|-------------------|
139|             8|2019-11-04 11:09:12|TURKEY        |XXX    |         797|         8|                 99|
140|             8|2019-11-04 11:09:12|GERMANY       |XXX    |         440|         8|4636609220240232940|
141|             9|2019-11-04 11:09:13|FRANCE        |XXX    |         206|         5|              97.57|

如果我按“德国”过滤,我的 json 列表只有一项。然后我使用它记录正确的executeMany方法。

ID |DIFF_REPORT_ID|DIFF_DATE          |REGION        |VENDOR |SOURCE_COUNT|DIFF_COUNT|PERCENTAGE         |
---|--------------|-------------------|--------------|-------|------------|----------|-------------------|
142|             8|2019-11-04 11:19:12|GERMANY       |XXX    |         440|         8|              98.18|

PERCENTAGE 列的数据类型是数字

【问题讨论】:

我猜这与十进制转换问题有关。您能否尝试以下操作:将插入更改为期望小数作为字符串并使用 to_number 进行转换。例如,to_number(:PERCENTAGE)。然后,在将jList 传递给execute 之前,将小数转换为字符串。让我们知道情况如何。 @DanMcGhan 我尝试了你猜对我没有帮助的方法。当我试图修复它时,我意识到当我准备我的 json 时,我正在将 PERCENTAGE 属性转换为 Number。我删除了该演员表,然后尝试将其正确保存在 Db 上。所以我自己解决了它,但我不确定它为什么会发生。这是我更改的代码。 temp.PERCENTAGE = ((1 - (temp.DIFFCOUNT / temp.SOURCECOUNT).toFixed(4)) * 100).toFixed(2); 当您使用toFixed 时,您将数字转换为字符串。这就是我的建议。并不真正需要显式使用 to_number,因为 Oracle 会隐式执行此操作。 在我使用toFixed 之后,我没有将它转换为 js 上的数字。然后它记录正确。 【参考方案1】:

javascript 还没有适当的小数支持。将 JavaScript 中的数字转换为字符串以避免转换错误。然后将字符串转换为数据库中的 Oracle 数字。

【讨论】:

以上是关于ExecuteMany 插入错误的值的主要内容,如果未能解决你的问题,请参考以下文章

SQLite executemany 要求比预期更多的值

Python mysql executemany() and commit vs many execute() and commit

在 PostgreSQL 中使用 executemany() 在另一个表中插入外键

Sqlite executemany 和 DELETE

捕获 cx_Oracle executemany() 批量插入错误“期望数字”

当我尝试插入由列表理解生成的元组列表时,executemany 抛出错误;如果它是硬编码的,则相同的列表有效