Хранимый процесс, попавший в ORA-06502: PL/SQL: ошибка с числом или значением
У меня проблема с вызовом хранимой процедуры из OSB 11g через адаптер JCA. Я получаю ошибку:
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 1
Ошибка так же коротка, как и без добавлений за описанием ошибки. Это происходит только в производственной среде, и нет никаких проблем, когда я указываю базу данных на UAT. Что еще более удивительно, он будет работать в производственной среде, если одна из переменных, которые я передаю, будет содержать менее 128 символов. (или я ударю по ошибке выше). Тип и длина хранимой процедуры определены правильно. имея столбец таблицы, способный справиться с 4000 символов.
Обе базы данных Oracle 9i совместно используют одну и ту же основную младшую версию сборки Сохраненный процесс находится в пакете. Я извлек и сравнил хранимый процесс из обеих сред БД, используя winmerge, и он показывает, что они отражают друг друга.
Выполнение хранимой процедуры вручную в рабочей среде работает, при условии, что я объявляю достаточно большой размер varchar. Мне удается смоделировать ORA-06502
ошибка, объявляя переменный размер меньше, чем длина данных, которые я передаю.
Я даже зашел так далеко, что захватил сетевой дамп с обоих исполнений, и обнаружил, что есть небольшие различия. (Примечание: я повторно использую один и тот же источник данных и меняю только ip и имя пользователя в WLS и перезагружаюсь перед каждым выполнением)
Когда я указываю на производственную среду (у 1 возникают проблемы), tcpdump выглядит примерно так:
BEGIN packagename.stored_proc_name(V_value1=>:1 , v_value2=>:2, v_value3=>:3); END .... {variable1}... {variable2}... {variable3})
Когда я указываю на среду UAT (успешное 1), дамп выглядит короче и без BEGIN; END
тег
.... {variable1}... {variable2}... {variable3})
Что еще могло пойти не так? Ценим за любую помощь!
1 ответ
"Хранимый процесс находится в пакете. Я извлек и сравнил хранимый процесс из обеих сред БД, используя winmerge, и он показывает, что они отражают друг друга".
Речь идет не о коде, проблема связана с данными. В UAT у вас могут отсутствовать данные, подобные производственным, и, следовательно, вы не сможете повторить проблему.
Ваше сообщение об ошибке просто говорит об ошибке в строке 1, что не совсем полезно. Вы выполняете код без его форматирования? Если вы отформатируете код, выполните его и удалите всю обработку исключений, вы будете правильно знать номер строки. Например:
SQL> declare
2 num number;
3 begin
4 num := 'a';
5 end;
6 /
declare
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 4
Видите, это ясно говорит о том, что ошибка в строке 4.
Случайно, если у вас есть EXCEPTION
блок, затем убедитесь, что вы используете dbms_utility.format_error_stack
а также dbms_utility.format_error_backtrace
регистрировать детали ошибки. Иначе, номер строки ошибки никогда не будет правильным.