今天在上班时,遇到了一个相当牛X的问题,一开始还幼稚的以为发现了Oracle的Bug,后来经过一路调试发现,是因为在存储过程中的一个查询语句 写的有点问题,在这里共享一下。
例:
tab表中有2个字段 a、b
存储过程是这么写的
create or replace procedure proc_test(b varcahr2) as
v_resValue varchar2(100);
begin
select t.a into v_resValue from tab t where t.b = b;
end proc_test;
请注意在where条件t.c=c中,变量名与字段名是一致的,oracle在解析时,就会将变量b作为字段,进行查询所以
select t.a into v_resValue from tab t where t.b = b; 就等同于select t.a into v_resValue from tab t where 1=1;
所以在查询时就会将表中所有记录查询出来,而into的值有切只能有一个值,所以在执行此语句是就会报异常,
解决办法:
将变量名修改,本人自定义一套规范,参数名前加P_,变量名前加v_。