узел оракула executeMany с динамическим SQL-запросом - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь выполнить запрос UPDATE с помощью оператора executeMany. Я попытался выполнить команду execute в асинхронном цикле 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;
};

, а затем, наконец, выполнить вызов

...

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,
 },
]

Есть ли возможность добавить или включить этот набор OPT_PROP1 =: bind2 в sql? Есть ли какая-нибудь проверка на нулевое значение привязки?

С execute это работает, но я не думаю, что это эффективно для большого количества данных.

Спасибо,

1 Ответ

0 голосов
/ 15 октября 2019

После некоторого расследования все, что мне нужно было сделать, это немного изменить 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`;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...