PL / SQL - предотвратить ORA-06502 - PullRequest
1 голос
/ 04 ноября 2011

Я часто получаю эту ошибку (это так раздражает!):

Отчет об ошибке: ORA-06502: PL / SQL: ошибка числа или значения: слишком маленький буфер строки символов ORA-06512:в строке 305 06502. 00000 - «PL / SQL: ошибка числового значения или значения% s»

Пример хранимой процедуры заключается в циклическом перемещении курсора (который содержит около 10 тыс. строк), выполнении некоторой логики и затем использованииdbms_output.put_line для печати каждой записи на вкладке 'Script Output' в Oracle SQL Developer.

Есть ли способ очистить буфер или предотвратить появление этой ошибки (и отменить оставшуюся часть процедуры)?

Если это возможно, я мог бы использовать Mod function для очистки буфера каждые примерно 10 обработанных строк.

Ответы [ 4 ]

7 голосов
/ 04 ноября 2011

Я не верю, что эта ошибка имеет какое-либо отношение к размеру буфера DBMS_OUTPUT, как подразумевают другие ответы. Если вы переполните этот буфер, вы получите ошибку «ORA-20000: ORU-10027: переполнение буфера, ограничение ##### байтов».

Эта ошибка обычно означает, что строковая переменная PL / SQL слишком мала, чтобы содержать какое-то значение, которое ей присвоено. Это может быть внутренним для DBMS_OUTPUT, если вы передаете значение, которое больше, чем оно может обработать. Но ваша трассировка стека теперь показывает DBMS_OUTPUT в стеке, поэтому я думаю, что это не так. Ошибка появляется в строке 305 вашей процедуры. Что оно делает? Если это присваивание, тогда назначенная переменная begin, вероятно, должна быть объявлена ​​с большим размером.

3 голосов
/ 04 ноября 2011

Размер буфера по умолчанию DBMS_OUTPUT составляет 20000 символов. Вы можете сделать это с помощью:

DBMS_OUTPUT.ENABLE(1000000);

Нет понятия «очистка», поскольку нечего очищать до тех пор, пока хранимая процедура не вернется. На самом деле он работает так, что строки попадают в буфер в БД, затем этот буфер явно выбирается (с DBMS_OUTPUT.GET_LINES) клиентом (например, SQL * Plus) после завершения SP. Это совершенно не похоже на printf(), к которому вы могли бы привыкнуть в C.

1 голос
/ 04 ноября 2011

Для вывода большого количества материала лучше использовать UTL_FILE вместо DBMS_OUTPUT и проверить файл. Или используйте временную таблицу и вставьте ее в автономную процедуру, чтобы вы могли видеть результат, даже если основная процедура по какой-либо причине должна выполнить откат. В обоих случаях у вас есть дополнительное преимущество: вы можете видеть часть результата, пока ваша процедура еще выполняется; DBMS_OUTPUT не может это предоставить.

0 голосов
/ 04 марта 2013

Получите значение как CLOB, а не как varchar

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...