sql - 如何在 Informix 的 MERGE 语句中使用源参数?
问题描述
我正在尝试对 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 语句的源部分是否支持参数?如果是,我的语法错误在哪里?
对于上下文,我使用 Informix 的 OleDb 提供程序从 ASP.NET 调用它。
解决方案
你有:
SELECT ? AS id, ? as phone, ? as phone_ext, 'CELL' as aa FROM sysmaster:'informix'.sysdual
您不能?
对 SELECT 语句的“结构”元素使用占位符(符号)。您不能在占位符中提供列名。并且通过选择列表中的占位符将数字等作为值传递也不起作用。
我可能会创建一个适当形状的临时表,并在其中插入一行,然后在 select 语句中使用临时表:
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(?, ?, ?, ?)
请记住,临时表是会话专用的——您可以让很多人同时使用相同的临时表名称,而不会相互干扰。
推荐阅读
- wordpress - Wordpress 古腾堡编辑器不显示帖子自定义字段
- python - 如何在 python ursina 中将 .jpg 设置为窗口背景?
- node.js - 无法将我的 nodejs 服务器与我的 Angular 应用程序链接
- jquery - Jquery 开始损坏
- c# - 自本月初以来计算数据库行数
- ios - 如何使 UICollectionView 的高度可自动调整和滚动?
- python - 点聚类算法
- graphics - 将 Maya 导出的 OBJ 文件转换为三角形网格 OFF 文件 -- AssertionError: face should have 3 vertices but has 6
- javascript - 使复选框所需的输入文本相乘
- php - 从 PHP 5 升级到 7。创建的数组只有 null 值,然后才创建一个空数组