PL / SQL-исключение ORA-06511 курсор уже открыт - PullRequest
0 голосов
/ 02 июня 2018

В последнее время мы видим следующую ошибку в журнале нашего приложения, это происходит только иногда (раз в неделю или около того), что наводит нас на мысль, что исключение курсора вызывается только каким-то конкретным входным условием / необработанным исключением.

Ошибка - состояние SQL [24000];код ошибки [6511];ORA-06511: PL / SQL: курсор уже открыт
ORA-06512: в "ПАКЕТЕ", строка 3
ORA-06512: в "APPS.TLN_AR_ONLINE_LIST2_PKG", строка 17

вложенное исключение - java.sql.SQLException: ORA-06511: PL / SQL: курсор уже открыт
ORA-06512: в "ПАКЕТЕ", строка 3
ORA-06512: в "ПАКЕТЕ \", строка 17 , "providerErrorMessage": "CallableStatementCallback;uncategorized SQLException для SQL

Итак, мы открыли пакет и проверили курсор и номер строки, из которой выдается ошибка.

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.

Является ли это курсором неявного типа (и это наследиекод) мы думаем, что, возможно, проблема заключается в обработке исключений?

У нас есть обработка исключений, когда данные не найдены, но нет ни одного для TOO_MANY_ROWS, во всех блоках, в том числе при открытии курсора из строки 17.

Кто-нибудь может помочь / предложить по этому вопросу?

1 Ответ

0 голосов
/ 14 февраля 2019

Перед тем, как открыть курсор (в данном примере с именем c_main_script_1), сделайте следующее:

if c_main_script_1%isopen then
    close c_main_script_1;
end if;

-Leah Jarvis

...