问题现象
当一条查询中出现了重复别名,或者在一个存储过程中出现了变量名称与查询中别名相同,就会报错。这个问题在多个客户现场出现。
create table test_tab1 (c1 int, c2 int); create table test_tab2 (c1 int, c2 int); select * from test_tab1 t1 join test_tab2 t2 on t2.c1=t1.c1 join test_tab2 t2 on t2.c1=t1.c2; drop table abcd; create table abcd(c1 number,c2 number); declare v_c number; begin select sum(c2) v_c into v_c from abcd; end; /
问题的风险及影响
风险是会出现一个难以找到为什么的报错,比如找不到from之类的问题。
问题影响版本
截止2024年4月,最新版本依旧有该问题。
问题发生原因
在verify的时候,没有做变量分层处理,类似于编译器中变量压栈的操作。
解决方法及规避方式
通过修改变量名称可以临时规避这个问题。
问题分析和处理过程
1、发现编译报错;
2、如果是普通查询,那么寻找其中是否出现了别名相同的表;
3、如果是存储过程,那么需要寻找申请的变量与存储过程中报错语句的列别名是否相同。
经验总结
在写SQL的过程中,尽量区别各个变量的名称,防止重名后难以定位。
