具有动态 sql 查询的 oracle 节点 executeMany
oracle node executeMany with dynamic sql query
我正在尝试使用 executeMany 语句执行更新查询。我试过像这样在异步 forEach 循环中执行:
export const asyncForEach = async (array, callback) => {
for (let index = 0; index < array.length; index++) {
await callback(array[index], index, array);
}
}
然后是一些动态定义
export const buildDynamicDefs = (data,enumRef) => {
const defs = {...data};
Object.keys(defs).forEach(key => defs[key] = enums.typeDefs[enumRef][key])
return defs;
};
然后最后执行call
...
await asyncForEach(dataArray, async (device) => {
response[device.deviceId] = await connection.execute(
queryPut(device),
{
bind1,
...device,
},
{
autoCommit: false,
bindDefs: {
bind1,
...buildDynamicDefs(device,'enumName'),
},
},
)
})
查询如下:
export const queryPut = data => `
UPDATE status
SET MANDATORY_PROP1=:bind4
${data.bind2 && ',OPT_PROP1=:bind2' || ''}
${data.bind3 && ',OPT_PROP2=:bind3' || ''}
WHERE MANDATORY_PROP2=:bind1 AND MANDATORY_PROP3=:bind5`;
问题是当我使用 executeMany 时,我不知道如何告诉查询它应该是什么样子
.executeMany(query,arrayOfObject-binds,options)
只有一个查询。我的对象数组可能如下所示:
[
{
bind1: 1,
bind4: 4,
bind5: 5,
},
{
bind1: 1,
bind2: 2,
bind4: 4,
bind5: 5,
},
]
是否有可能在 sql 中选择性地添加或包含 OPT_PROP1=:bind2 集?是否检查绑定的空值?
使用 execute 可以正常工作,但我认为它对大量数据效率不高。
谢谢,
经过一些调查后,我需要做的只是稍微改变一下 SQL:
UPDATE status
SET MANDATORY_PROP1=:bind4,
OPT_PROP1=COALESCE(:bind2,OPT_PROP1),
OPT_PROP2=COALESCE(:bind3,OPT_PROP2),
WHERE MANDATORY_PROP2=:bind1 AND MANDATORY_PROP3=:bind5`;
我正在尝试使用 executeMany 语句执行更新查询。我试过像这样在异步 forEach 循环中执行:
export const asyncForEach = async (array, callback) => {
for (let index = 0; index < array.length; index++) {
await callback(array[index], index, array);
}
}
然后是一些动态定义
export const buildDynamicDefs = (data,enumRef) => {
const defs = {...data};
Object.keys(defs).forEach(key => defs[key] = enums.typeDefs[enumRef][key])
return defs;
};
然后最后执行call
...
await asyncForEach(dataArray, async (device) => {
response[device.deviceId] = await connection.execute(
queryPut(device),
{
bind1,
...device,
},
{
autoCommit: false,
bindDefs: {
bind1,
...buildDynamicDefs(device,'enumName'),
},
},
)
})
查询如下:
export const queryPut = data => `
UPDATE status
SET MANDATORY_PROP1=:bind4
${data.bind2 && ',OPT_PROP1=:bind2' || ''}
${data.bind3 && ',OPT_PROP2=:bind3' || ''}
WHERE MANDATORY_PROP2=:bind1 AND MANDATORY_PROP3=:bind5`;
问题是当我使用 executeMany 时,我不知道如何告诉查询它应该是什么样子
.executeMany(query,arrayOfObject-binds,options)
只有一个查询。我的对象数组可能如下所示:
[
{
bind1: 1,
bind4: 4,
bind5: 5,
},
{
bind1: 1,
bind2: 2,
bind4: 4,
bind5: 5,
},
]
是否有可能在 sql 中选择性地添加或包含 OPT_PROP1=:bind2 集?是否检查绑定的空值?
使用 execute 可以正常工作,但我认为它对大量数据效率不高。
谢谢,
经过一些调查后,我需要做的只是稍微改变一下 SQL:
UPDATE status
SET MANDATORY_PROP1=:bind4,
OPT_PROP1=COALESCE(:bind2,OPT_PROP1),
OPT_PROP2=COALESCE(:bind3,OPT_PROP2),
WHERE MANDATORY_PROP2=:bind1 AND MANDATORY_PROP3=:bind5`;