如何解决如何从 Node.js 在 Oracle DB 上执行多个 MERGE INTO 查询
我正在尝试在 Node.js 代码的 forEach 循环中对 OracleDB
运行 MERGE INTO 查询。但只有第一个查询执行和所有其他失败。
代码:
assignedDeals.forEach(async deal => {
let EXPECTED_DATE = null;
let STATUS = null;
let COMMENT = null;
let stmt = `MERGE INTO SP_ASSIGNMENT USING dual ON (ID = ${deal.ID}) WHEN MATCHED THEN UPDATE SET MODIFIED_DATE = current_timestamp `
if (deal.STATUS) {
stmt = stmt + `,STATUS = '${deal.STATUS}'`;
STATUS = `'${deal.STATUS}'`;
}
if (deal.COMMENT) {
stmt = stmt + `,COMMENT = '${deal.COMMENT}'`;
COMMENT = `'${deal.COMMENT}'`;
}
if (deal.EXPECTED_DATE) {
stmt = stmt + `,EXPECTED_DATE = '${deal.EXPECTED_DATE}'`;
EXPECTED_DATE = `'${deal.EXPECTED_DATE}'`
}
stmt = stmt + `WHEN NOT MATCHED THEN INSERT (ID,STATUS,ASSIGNED_USER_ID,MODIFIED_DATE,ASSIGNED_RID,ASSIGNED_BY,EXPECTED_DATE,COMMENT)
VALUES (${deal.ID},'${deal.ISASSIGNED}','${deal.USERID}',current_timestamp,${parseInt(deal.RID)},'${deal.ASSIGNED_BY}',${EXPECTED_DATE},${STATUS},${COMMENT})`;
console.log(stmt);
await connection.execute(stmt,{},{
autoCommit: true
});
});
这是在 for 循环中执行多个查询的正确方法吗?
知道为什么不执行下一个查询吗?
帮助我解决这个问题,我是 Node.js + Oracle DB 的新手。
解决方法
回答我自己的问题,以便它可以帮助其他有类似问题的人。
因此,经过对我的问题的研究并根据评论,我可以得出结论,通过绑定变量和 executeMany()
方法,我们可以实现我们的目标。
第 1 步: 准备如下绑定参数:
let binds = [];
assignedDeals.forEach(deal => {
binds.push({
ID: deal.ID,USER_ID: deal.USERID,RID: parseInt(deal.ASSIGNED_ROLE_ID),ASSIGNED_BY: deal.ASSIGNED_BY,EXPECTED_DATE: deal.EXPECTED_DATE ? new Date(deal.EXPECTED_DATE) : null,STATUS: deal.STATUS ? deal.STATUS : null,COMMENT: deal.COMMENT ? deal.COMMENT : null,SDC_STATUS: deal.SDC_STATUS ? deal.SDC_STATUS : null,DELETED_ON: null
})
})
第 2 步: 准备 ExecuteManyOptions:
autoCommit --> 用于自动提交您的语句。
布尔型自动提交 如果此属性为真,则交易在 当前连接在结束时自动提交 语句执行。
默认值为 false。
此属性可能会在 execute()/executeMany()
调用中被覆盖。
bindDefs --> 绑定 defs 用于根据您的表定义指定类型和大小。
Object bindDefs
bindDefs
对象定义了绑定变量类型,
大小和方向。这个对象在某些情况下是可选的,但它是
设置它更有效。
它应该是一个数组还是一个对象,这取决于它的结构 绑定参数。
bindDefs
数组或对象中的每个值都应该是一个对象
包含一个绑定变量的键 dir
、maxSize
和 type
,
类似于如何识别 execute()/executeMany()
绑定参数。
示例:
const options = {
autoCommit: true,bindDefs: {
ID: { type: oracledb.NUMBER },USER_ID: { type: oracledb.DB_TYPE_VARCHAR,maxSize: 20 },RID: { type: oracledb.DB_TYPE_NUMBER},ASSIGNED_BY: { type: oracledb.DB_TYPE_VARCHAR,EXPECTED_DATE: { type: oracledb.DATE },STATUS: { type: oracledb.DB_TYPE_VARCHAR,maxSize: 100 },COMMENT: { type: oracledb.DB_TYPE_VARCHAR,maxSize: 200 },SDC_STATUS: { type: oracledb.DB_TYPE_VARCHAR,DELETED_ON: { type: oracledb.DATE },}
};
第 3 步:准备您的陈述:
const sql = `MERGE INTO SP_ASSIGNMENT USING dual ON (DELETED_ON IS NULL AND ID = :ID)
WHEN MATCHED THEN UPDATE SET MODIFIED_DATE = current_timestamp,STATUS = :STATUS,SDC_STATUS = :SDC_STATUS,COMMENT = :COMMENT,EXPECTED_DATE = :EXPECTED_DATE
WHEN NOT MATCHED THEN INSERT (ID,USER_ID,MODIFIED_DATE,RID,ASSIGNED_BY,EXPECTED_DATE,STATUS,COMMENT,SDC_STATUS,DELETED_ON)
VALUES (:ID,:USER_ID,current_timestamp,:RID,:ASSIGNED_BY,:EXPECTED_DATE,:STATUS,:COMMENT,:SDC_STATUS,:DELETED_ON)`;
注意:我根据我的要求准备了上述声明,但它是 非常基于更新和插入条件。您可以根据需要修改 你的。
第 4 步:最后一步 调用 executeMany()
并传递您的 SQL 语句并绑定参数和绑定选项。
result = await connection.executeMany(sql,binds,options);
因此,按照上述 4 个步骤,您可以实现基于 USING ON
中的 MERGE INTO statement
条件的更新或插入。
希望这会对其他人有所帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。