注册
DM7 DUAL 伪表兼容性问题分析
专栏/龙山溪笔谈/ 文章详情 /

DM7 DUAL 伪表兼容性问题分析

myth8860 2020/11/30 2142 2 0
摘要 本文作者通过在项目中遇到的一次报错,分析出 DM7 在 DUAL 表的表结构和表数据上做出的调整,并给出此类报错情况的解决方案。

最近一个项目中碰到一个很奇怪的问题,拿到表结构和报错的 SQL 脱敏后如下:

创建表格

create table TEST (ID INTEGER,NAME VARCHAR2(255)); insert into TEST values (1, 'test1'); insert into TEST values (2, 'test2'); commit;

对表格进行更新操作

MERGE INTO TEST T1 USING dual T2 on (id=1) WHEN MATCHED THEN UPDATE SET T1.NAME='TEST_DUAL' WHEN NOT MATCHED THEN INSERT (T1.ID, T1.NAME) VALUES (1,'TEST_DUAL' );

报错情况

5.1.png

在客户开发环境的版本上没有报错,在正式生产环境的版本上报有歧义的列名。

分析两种环境下 DUAL 伪表的结构

于是我分析了一下两个环境 DUAL 伪表的表结构,发现了不同的地方:
select * from dual;

–生产环境
5.2.png

–开发环境
5.3.png

原来新的版本为了和 ORACLE 保持完全一致,调整了 DUAL 伪表的表结构和里面存的一条数据

为了能够向下兼容,新版本提供了一个系统函数来实现切换

CALL SP_SWITCH_SYSDUAL(‘SYSDUAL’); --表结构为老的表结构,列名为 ID,存的一行记录为 1

CALL SP_SWITCH_SYSDUAL(‘SYSDUAL2’); --表结构为新的表结构,列名为 DUMMY,存的一行记录为 X

解决方案

找到原因之后就很好办了,在生产环境执行以下语句,以切换 DUAL 的表结构。

CALL SP_SWITCH_SYSDUAL(‘SYSDUAL2’);

接下来就可以按原来的语句对 TEST 表进行更新了。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服