最近一个项目中碰到一个很奇怪的问题,拿到表结构和报错的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' ); 
DM7 DUAL伪表兼容性问题分析

 

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

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

select * from dual;  

--生产环境

DM7 DUAL伪表兼容性问题分析

--开发环境

DM7 DUAL伪表兼容性问题分析

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

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

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

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

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

CALL SP_SWITCH_SYSDUAL('SYSDUAL2');  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相关文章:

  • 2021-07-06
  • 2022-01-29
  • 2022-02-26
  • 2021-09-10
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-12-23
  • 2021-04-10
  • 2021-04-19
  • 2022-12-23
  • 2021-12-02
相关资源
相似解决方案