今天学写存储过程的第一天,就遇到一个令人抓狂的bug,分享出来。
create or replace procedure testProgress(grade in varchar,result1 out varchar )
is
count2 int;
begin
/*判断有没有学生是该班级的*/
select count(1) into count2 from a_test2 t where t.grade = grade;
if(count2 > 0 ) then
result1 :='1';
for myrow in (select t.* from a_test2 t where t.grade = grade) loop
if(myrow.sex = 'm') then
update a_test2 t set t.SCORE = 90 where t.sex='m' and t.grade = grade;
elsif(myrow.sex = 'f') then
update a_test2 t set t.SCORE =100 where t.sex='f' and t.grade = grade;
else
DBMS_OUTPUT.put_line('error');
End if;
end loop;
else
result1 :='2';
end if;
exception
when others then
dbms_output.put_line('详细信息:' || '错误代码:' || Sqlcode || ',错误消息:' ||
Sqlerrm);
Rollback; /*异常处理,保存点下面的操作都不会被执行*/
RAISE; /*raise是当出现异常的时候, oracle抛出这个异常,*/
end testProgress;
这个是我写的存储过程,错误发生在注释的下一行:
select count(1) into count2 from a_test2 t where t.grade = grade;
这边的参数grade,我设置的是2,按照表里面的实际情况来说,count(1)这个值应该是2,
但是查询出来的却是6。
我把sql单独拉出来查询记录数,查出来的确实是2。
认真的查看了很多遍以后,感觉没啥问题,于是,我开始崩溃了。
查过百度后,发现这篇博客。https://blog.csdn.net/u013244530/article/details/52869662
文中说,因为参数grade,和a_test2表中的字段名一致,所以系统默认为是t.grade=t.garde,相当于自己=自己。
我尝试了下将参数grade 改成了garde1,于是好了。。
总结:
参数名不可以和表里面的字段名一致!