Хранимый процесс, попавший в 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 регистрировать детали ошибки. Иначе, номер строки ошибки никогда не будет правильным.

Другие вопросы по тегам