存储过程中,游标遍历到最后一行记录,报错oracle ORA-06502 PL/SQL:数字或值错误:存储过程如下:
create or replace procedure pro_fp is
begin
Declare
CURSOR bcur
IS SELECT sessionid,transcript from of.fpsession where rownum<15;
brec bcur%ROWTYPE;
BEGIN
-- insert into testlong1(id,name) select id,name from testlong;--其它类型先插入
OPEN bcur;
LOOP
FETCH bcur INTO brec;
EXIT WHEN bcur%NOTFOUND;
update of.fpsession_3 set transcript=brec.transcript where sessionid=brec.sessionid;
commit;
END LOOP;
CLOSE bcur;
END;
end pro_fp;
报错的行定位在:FETCH bcur INTO brec;就只执行到最后一行的时候报错,但是所有的数据都通过update执行成功了。大家看下,怎么避免最后一行报错,我的sessionid字段是varchar类型,transcript 是long类型的。
create or replace procedure pro_fp is
begin
Declare
CURSOR bcur
IS SELECT sessionid,transcript from of.fpsession where rownum<15;
brec bcur%ROWTYPE;
BEGIN
-- insert into testlong1(id,name) select id,name from testlong;--其它类型先插入
OPEN bcur;
LOOP
FETCH bcur INTO brec;
EXIT WHEN bcur%NOTFOUND;
update of.fpsession_3 set transcript=brec.transcript where sessionid=brec.sessionid;
commit;
END LOOP;
CLOSE bcur;
END;
end pro_fp;
报错的行定位在:FETCH bcur INTO brec;就只执行到最后一行的时候报错,但是所有的数据都通过update执行成功了。大家看下,怎么避免最后一行报错,我的sessionid字段是varchar类型,transcript 是long类型的。
sessionid字段是varchar类型,transcript 是long类型不相同啊,肯定不相同的。
where sessionid=brec.sessionid--应该是这两个sessionid的类型不一样
brec.sessionid --这个是varchar2
sessionid --这个是 number
--oracle执行计划会做隐式类型转换为
where sessionid= to_number(brec.sessionid)
--这样 一但你的 brec.sessionid 里面保存有非数字字符就会报你这个错误。