目录
一、环境信息
|------|--------------------------|
| 名称 | 值 |
| CPU | x86 |
| 操作系统 | KylinV10 |
| DM版本 | DM Database Server 64 V9 |
二、问题描述
相同MERGE SQL在达梦8上执行正常,在达梦9上执行报错提示:无效的列名XX
三、问题截图

四、问题原因
新版本merge into默认采用操作符方式,兼容oracle模式下,识别重名列策略与oracle相同,导致的报错。
五、问题解决
1、方法一:参数MERGE_OPT_FLAG调整

设置参数MERGE_OPT_FLAG改为0,采用MERGE INTO老方式,可避免报错。
2、方法二:添加别名

不改参数的情况下,在字段前加上B.即可。
六、问题模拟
1、参数确认
sql
SELECT * FROM V$DM_INI WHERE PARA_NAME IN ('COMPATIBLE_MODE','MERGE_OPT_FLAG');

2、报错复现
sql
-- MERGE 核心语句
MERGE INTO emp_target t
USING emp_source s
ON (t.emp_id = s.emp_id)
WHEN MATCHED THEN
UPDATE SET
t.emp_name = s.emp_name,
t.salary = s.salary,
t.dept_id = s.dept_id,
t.update_dt = SYSDATE
WHEN NOT MATCHED THEN
INSERT (emp_id, emp_name, salary, dept_id, update_dt)
VALUES (s.emp_id, s.emp_name, salary, s.dept_id, SYSDATE);

3、解决方法
(1)方法一:添加别名
sql
-- MERGE 核心语句
MERGE INTO emp_target t
USING emp_source s
ON (t.emp_id = s.emp_id)
WHEN MATCHED THEN
UPDATE SET
t.emp_name = s.emp_name,
t.salary = s.salary,
t.dept_id = s.dept_id,
t.update_dt = SYSDATE
WHEN NOT MATCHED THEN
INSERT (emp_id, emp_name, salary, dept_id, update_dt)
VALUES (s.emp_id, s.emp_name, s.salary, s.dept_id, SYSDATE);

salary前添加s.,SQL正常执行。
(2)方法二:参数MERGE_OPT_FLAG调整
sql
SP_SET_PARA_VALUE(1,'MERGE_OPT_FLAG',0);
如果参数调整不是在当前会话中执行的,执行SQL时需重开一个会话,因为会话的此值还没有修改。
sql
-- MERGE 核心语句
MERGE INTO emp_target t
USING emp_source s
ON (t.emp_id = s.emp_id)
WHEN MATCHED THEN
UPDATE SET
t.emp_name = s.emp_name,
t.salary = s.salary,
t.dept_id = s.dept_id,
t.update_dt = SYSDATE
WHEN NOT MATCHED THEN
INSERT (emp_id, emp_name, salary, dept_id, update_dt)
VALUES (s.emp_id, s.emp_name, salary, s.dept_id, SYSDATE);

SQL没有修改,也可正常执行。