通过declare 调用外层方法时报ora-01002:fetch out of sequence at xxx

请问下,一个方法中for循环调用另一个方法,另一个方法也是用了for循环。通过declare 调用外层方法时报ora-01002:fetch out of sequence at xxx

1 个赞

你好,你提的这个技术问题牵涉到OceanBase企业版范围内的功能细节。建议你通过以下方式寻求帮助:
1.如你所在的企业客户已签署OceanBase企业版销售合同,请你联系客户经理;
2.如你所在的企业客户尚未签署OceanBase企业版销售合同,你可通过OceanBase官网商务咨询页面留下你的联系方式,OceanBase企业版的业务顾问会在一个工作日内与你联系。
OceanBase官网商务咨询

https://www.oceanbase.com/contactus?fromPage=https%3A%2F%2Fwww.oceanbase.com%2Fsoftwarecenter-enterprise&dataSources=softwarecenter-enterprise_footercontact_d2022

1 个赞

这个报错一般是因为在循环中做了事务操作,比如下面的case

drop table emp;
create table emp(employee_id number(6) not null,
                 salary number(8, 2));
insert into emp(employee_id, salary) values(101, 1000);
insert into emp(employee_id, salary) values(102, 2000);
commit;

begin
  for emp_rec in (select * from emp for update of salary order by employee_id) loop
    update emp set salary = salary * 1.05 where employee_id = 105;
    commit;
  end loop;
end;
/ -- error

commit 之后 cursor 失效因此导致后续的 fetch 报错
可以根据上面的思路排查一下,具体失败原因可以通过失败语句的 traceid 搜索 observer.log 日志之后根据日志信息确定

嗯,疑问的是debug调试为什么没有问题呢

这样看来报错的原因可能是session上有未提交事务导致的,开debug的时候odc会新开一个session,之前session上未提交的事务就不会影响到这个语句的执行了

嗯嗯,这样的话是不是在循环外加commit测试一下?

可以试一下,另外还可以关注一下 autocommit 是不是 false

已经解决了,在for循环前有一个事务没有提交导致的,谢谢