【发布时间】: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 上的数字。然后它记录正确。
标签: node.js json oracle node-oracledb