Как использовать параметры для источника в операторе MERGE в Informix? - PullRequest
0 голосов
/ 10 февраля 2020

Я пытаюсь выполнить оператор слияния для базы данных Informix следующим образом:

MERGE INTO aa_rec AS dest
USING (SELECT '123456' AS id, '111-222-3333' as phone, '' as phone_ext, 'CELL' as aa FROM sysmaster:'informix'.sysdual) AS src
ON dest.id = src.id AND dest.aa = src.aa
WHEN NOT MATCHED THEN 
    INSERT (dest.id, dest.aa, dest.beg_date, dest.phone, dest.phone_ext, dest.ofc_add_by)
    VALUES (src.id, src.aa, TODAY, src.phone, src.phone_ext, 'TEST')
WHEN MATCHED THEN UPDATE SET 
        dest.phone = src.phone, 
        dest.phone_ext = src.phone_ext, 
        dest.beg_date = '10/29/2019', 
        dest.ofc_add_by = 'TEST'

Этот оператор работает как есть, с жестко закодированными значениями, но я хотел бы передать параметры для значений в исходная таблица:

USING (SELECT ? AS id, ? as phone, ? as phone_ext, 'CELL' as aa FROM sysmaster:'informix'.sysdual) AS src

Когда я выполняю инструкцию с параметрами и действительными значениями, я получаю эту ошибку:

E42000: (-201) Произошла синтаксическая ошибка.

Поддерживаются ли параметры в исходной части инструкции MERGE? Если они есть, где ошибка в моем синтаксисе?

Для контекста, я вызываю это из ASP. NET, используя провайдера OleDb для Informix.

1 Ответ

0 голосов
/ 10 февраля 2020

У вас есть:

SELECT ? AS id, ? as phone, ? as phone_ext, 'CELL' as aa FROM sysmaster:'informix'.sysdual

Нельзя использовать заполнители (? символы) для «структурных» элементов инструкции SELECT. Вы не можете предоставить имена столбцов в заполнителях. И передача чисел et c в качестве значений через заполнители в списке выбора тоже не работает.

Я бы, вероятно, создал временную таблицу соответствующей формы и вставил в нее строку, а затем используйте временную таблицу в операторе выбора:

SELECT '123456' AS id, '111-222-3333' AS phone, '' AS phone_ext, 'CELL' AS aa
  FROM sysmaster:'informix'.sysdual
  INTO TEMP phone_data;

MERGE INTO aa_rec AS dest
USING (SELECT * FROM phone_data) AS src
   ON dest.id = src.id AND dest.aa = src.aa
 WHEN NOT MATCHED THEN 
      INSERT (dest.id, dest.aa, dest.beg_date, dest.phone, dest.phone_ext, dest.ofc_add_by)
          VALUES (src.id, src.aa, TODAY, src.phone, src.phone_ext, 'TEST')
 WHEN MATCHED THEN UPDATE SET 
          dest.phone = src.phone, 
          dest.phone_ext = src.phone_ext, 
          dest.beg_date = '10/29/2019', 
          dest.ofc_add_by = 'TEST'
;

DROP TABLE phone_data;

Возможно, было бы лучше / безопаснее явно создать временную таблицу, а не использовать предложение INTO TEMP. Типы не обязательно соответствуют вашим ожиданиям (CHAR (6), CHAR (12), VARCHAR (1), CHAR (4)) - хотя это может и не иметь значения.

Очевидно, однажды временная таблица существует, вы можете вставить любые временные данные в временную таблицу, используя любой доступный механизм:

INSERT INTO phone_data(id, phone, phone_ext, aa) VALUES(?, ?, ?, ?)

Помните, что временные таблицы являются частными для сеанса - вы можете иметь много людей, использующих одну и ту же временную таблицу имя одновременно, не мешая друг другу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...