Oracle PL/SQL异常ORA-06511游标已打开
最近,我们在应用程序日志中看到了以下错误,这种情况只是偶尔发生(大约一周发生一次),这使我们相信游标异常只是由某些特定的输入条件/未处理的异常引发的 错误-SQL状态[24000];错误代码[6511];ORA-06511:PL/SQL:光标已打开Oracle PL/SQL异常ORA-06511游标已打开,oracle,plsql,cursor,Oracle,Plsql,Cursor,最近,我们在应用程序日志中看到了以下错误,这种情况只是偶尔发生(大约一周发生一次),这使我们相信游标异常只是由某些特定的输入条件/未处理的异常引发的 错误-SQL状态[24000];错误代码[6511];ORA-06511:PL/SQL:光标已打开 ORA-06512:在“包装”处,第3行 ORA-06512:APPS.TLN\u AR\u ONLINE\u LIST2\u PKG,第17行 嵌套异常为java.sql.SQLException:ORA-06511:PL/sql:cursor已打
ORA-06512:在“包装”处,第3行 ORA-06512:APPS.TLN\u AR\u ONLINE\u LIST2\u PKG,第17行 嵌套异常为java.sql.SQLException:ORA-06511:PL/sql:cursor已打开
ORA-06512:在“包装”处,第3行 ORA-06512:在“PACKAGE\”第17行“providerErrorMessage”:“CallableStatementCallback;SQL的未分类SQLException 因此,我们打开包,检查光标和抛出错误的行号
1. CURSOR c_t_num (trx_num_tran.trx_number%TYPE)
2. IS
3. SELECT interface_header_attribute1**
4. FROM ra_customer_trx_all
5. WHERE trx_number = trx_num;
6. OPEN c_t_num (trx_list_rec.trx_number);
7.
8. FETCH c_t_num
9. INTO t_rf_trx_number;
10.
11. IF c_t_num%NOTFOUND
12. THEN
13. t_rf_trx_number := NULL;
14. END IF;
15.
16. CLOSE c_t_num;
17. OPEN c_t_num (p_trx_num);
18.
19. FETCH c_t_num
20. INTO t_trx_number;
21.
22. IF c_t_num%NOTFOUND
23. THEN
24. t_trx_number := NULL;
25. END IF;
26.
27. CLOSE c_t_num;
28.
29. OPEN c_t_num (v_trx_num);
30.
31. FETCH c_t_num
32. INTO t_trx_num_ritel;
33.
34. CLOSE c_t_num;
35.
36. RETURN (t_trx_num_ritel);
37. END get_trx_number;
现在,光标在第6、17和29行被打开。但异常总是显示行号3(光标定义的选择)和行号17
这是否是一个隐式类型的游标(这是一个遗留代码),我们认为异常处理可能是问题所在
在所有块中,包括从第17行打开光标时,我们对未找到数据进行了异常处理,但对太多的行没有异常处理
有人能在这个问题上提供帮助/建议吗?在打开光标(在这个名为c\u main\u script\u 1的示例中)之前,请执行以下操作:
-Leah Jarvis代码看起来无效。像这样的游标需要在declare
部分声明,即在函数get\u trx\u number之间。。。是
和开始
。您不能从光标c\t\u num是…
转到打开c\t\u num
。此外,我没有看到任何异常处理,也没有发现任何找不到数据
或太多行
的情况。虽然您发布的代码看起来不完整,但在“偶尔(一周左右)”发生的情况下,我们甚至很难进行调试。这是您的数据库和环境设置,您最清楚发生这种情况的原因。一种方法是将代码中的更多信息添加到日志中,并尝试在测试设置中重新创建那个神秘的场景。我怀疑是否有人能在这方面给你更多的帮助,除非你提供更多的线索来说明问题所在。嗨-我只粘贴了一个片段,我不能粘贴整个代码,declare部分不包含任何数据,但我无法看到太多行的异常处理。我和BA谈过,显然预期的行为是只获取/检索1行。我们怀疑某些功能更改正在破坏这一点,并且游标和匹配行之间的1-1映射被破坏
if c_main_script_1%isopen then
close c_main_script_1;
end if;