达梦数据库-报错-16-MERGE INTO提示:无效的列名[XX]

目录

一、环境信息

二、问题描述

三、问题截图

四、问题原因

五、问题解决

1、方法一:参数MERGE_OPT_FLAG调整

2、方法二:添加别名

六、问题模拟

1、参数确认

2、报错复现

3、解决方法

(1)方法一:添加别名

(2)方法二:参数MERGE_OPT_FLAG调整


一、环境信息

|------|--------------------------|
| 名称 | 值 |
| 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没有修改,也可正常执行。

相关推荐
IT19955 小时前
Fail2Ban 防护 MySQL 实战|登录失败 3 次,IP 封禁 24 小时
数据库·mysql
夕除5 小时前
redis--IO 多路复用(select + poll)
数据库·sql
0+1115 小时前
Linux --从 poll 到 epoll多路转接
linux·服务器·1024程序员节
行思理5 小时前
go语言学习难度及适合学习的人群
开发语言·学习·golang
青瓦梦滋6 小时前
WebSocket协议
linux·服务器·网络·c++·websocket·网络协议·http
桌面运维家6 小时前
旧电脑跑不动课程软件,VDI云桌面怎样接着用?
运维·服务器·虚拟化·pve·vdi·云桌面
zhang133830890756 小时前
传统机械三杯式风速传感器易磨损冻堵?CG-88金属超声波风速风向传感器给出免运维方案
运维·服务器·网络·人工智能·自动化
知已难寻7 小时前
第 2 篇 · 云的地基:服务器、存储、网络三大基础设施
运维·服务器·网络·云原生·云计算·负载均衡·1024程序员节
2601_949847759 小时前
bcrypt.js 跨端三方库仓颉适配全流程
linux·运维·ubuntu
m0_639906949 小时前
Linux 操作系统入门:目录结构、服务排查常用命令、Shell 脚本基础
linux·运维·后端