Как увеличить буфер dbms_output?

Я попытался отладить свой динамический запрос через dbms_output, но мне кажется, что строка запроса слишком длинная для буфера dbms_output.

Я получил :

ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "SYS.DBMS_OUTPUT", line 148
ORA-06512: at line 1 

Любая идея, как увеличить размер буфера?


person hsuk    schedule 10.05.2013    source источник
comment
Вероятно, вы пишете слишком много информации, используя dbms_output. Он не предназначен для этого. Ваш лучший вариант, вероятно, состоит в том, чтобы вставить эти сообщения в таблицу, а затем выбрать из таблицы после этого.   -  person a_horse_with_no_name    schedule 10.05.2013
comment
@a_horse_with_no_name: я никогда не одобрял использование таблицы базы данных в качестве журнала приложения из-за потенциально не регистрируемых инцидентов: например, если приложение не может подключиться к базе данных, где вы регистрируете тот факт, что приложение не может подключиться, если log находится в базе данных, к которой вы не можете подключиться? Я предпочитаю записывать журналы в плоские файлы (используя пакет UTL_FILE в PL/SQL), который, по IMO, вряд ли будет непригоден для использования, чем таблица в базе данных. YMMV. Делитесь и наслаждайтесь.   -  person Bob Jarvis - Reinstate Monica    schedule 10.05.2013
comment
@BobJarvis: внутри процедуры PL/SQL, я думаю, это имеет смысл. Для обычного кода приложения (Java, C#,...) я с вами согласен.   -  person a_horse_with_no_name    schedule 10.05.2013


Ответы (3)


Вы можете включить DBMS_OUTPUT и установить размер буфера. Размер буфера может быть от 1 до 1 000 000.

dbms_output.enable(buffer_size IN INTEGER DEFAULT 20000);
exec dbms_output.enable(1000000);

Проверьте это

ИЗМЕНИТЬ

Согласно комментарию, опубликованному Фрэнком и Мэтом, вы также можете включить его с помощью Null.

exec dbms_output.enable(NULL);

buffer_size : Верхний предел в байтах, объем буферизованной информации. Установка buffer_size в NULL указывает, что ограничений быть не должно. Максимальный размер — 1 000 000, а минимальный — 2 000, если пользователь указывает размер_буфера (НЕ NULL).

person Gopesh Sharma    schedule 10.05.2013
comment
попробуйте отключить dbms_output, а затем включите его с максимальным размером - person Gopesh Sharma; 10.05.2013
comment
Вы также можете вызвать dbms_output.enable(NULL), который установит неограниченный размер буфера, см. docs.oracle.com/cd/B19306_01/appdev.102/b14258/ - person Frank Schmitt; 10.05.2013
comment
@FrankSchmitt:NULL означает значение по умолчанию, равное 20000. И ограничений тоже нет. Максимум 1000000 байт. - person a_horse_with_no_name; 10.05.2013
comment
@a_horse_with_no_name: Я думаю, что это изменилось в 10g. Размер буфера по умолчанию составляет 20000 байт. Минимальный размер 2000 байт, максимальный не ограничен. docs.oracle.com/cd/E11882_01/appdev.112/ e25788/d_output.htm - person Mat; 10.05.2013
comment
@a_horse_with_no_name Извините, но это неправильно. См. комментарий Мэта, состояние документов Oracle: buffer_size: Верхний предел в байтах, объем буферизованной информации. Установка buffer_size в NULL указывает, что ограничений быть не должно. Таким образом, предоставление NULL в качестве аргумента для ENABLE не равносильно полному исключению параметра (поскольку значения по умолчанию равны 20000). - person Frank Schmitt; 10.05.2013
comment
@FrankSchmitt: Но в документации также говорится: Максимальный размер — 1 000 000 - person a_horse_with_no_name; 10.05.2013
comment
@a_horse_with_no_name В документации сказано, что максимальный размер составляет 1 000 000, а минимальный — 2 000, когда пользователь указывает размер буфера (НЕ NULL). и Установка для размера буфера значения NULL указывает, что ограничений быть не должно. - person Gopesh Sharma; 10.05.2013
comment
@a_horse_with_no_name Только что попробовал (10.2.0.4) — установка значения NULL позволяет мне печатать более 1 000 000: set serveroutput on declare i pls_integer; buf varchar2 (1000) lpad по умолчанию ('a', 1000, 'a'); начать dbms_output.enable(null); -- пропуск параметра приводит к переполнению буфера begin for i in 1 .. 1001 loop dbms_output.put_line(i); dbms_output.put_line (buf); конечная петля; исключение, когда другие затем dbms_output.put_line(SQLERRM); конец; конец; - person Frank Schmitt; 10.05.2013
comment
Использование неограниченной памяти СУБД для журналирования вывода меня нервирует. Плоские файлы - наши друзья... :-) - person Bob Jarvis - Reinstate Monica; 10.05.2013
comment
это работает только для текущей транзакции? Другими словами: нужно ли нам возвращать старое значение? - person Rodrigo Gurgel; 27.01.2015

Когда размер буфера заполняется. Есть несколько вариантов, которые вы можете попробовать:

1) Увеличьте размер буфера DBMS_OUTPUT до 1 000 000

2) Попробуйте отфильтровать данные, записываемые в буфер - возможно есть цикл, который пишет в DBMS_OUTPUT и вам эти данные не нужны.

3) Вызовите ENABLE в различных контрольных точках вашего кода. Каждый вызов очищает буфер.

DBMS_OUTPUT.ENABLE(NULL) по умолчанию будет иметь значение 20000 для обратной совместимости >Документация Oracle по dbms_output

Вы также можете создать свой собственный вывод display.something, как показано ниже.

create or replace procedure cust_output(input_string in varchar2 )
is 

   out_string_in long default in_string; 
   string_lenth number; 
   loop_count number default 0; 

begin 

   str_len := length(out_string_in);

   while loop_count < str_len
   loop 
      dbms_output.put_line( substr( out_string_in, loop_count +1, 255 ) ); 
      loop_count := loop_count +255; 
   end loop; 
end;

Ссылка - Ref: Альтернатива dbms_output.putline @ Автор: Александр

person Community    schedule 10.05.2013
comment
DBMS_OUTPUT.ENABLE(NULL) — это не то же самое, что отсутствие параметра. В документации Oracle (см. ссылку) четко указано: buffer_size Верхний предел, в байтах, объем буферизуемой информации. Установка buffer_size в NULL указывает, что ограничений быть не должно. - person Frank Schmitt; 10.05.2013
comment
Я думаю, вам нужно изменить процедуру следующим образом: create or replace procedure FRE_OUTPUT_REPLACE(input_string in varchar2 ) is out_string_in long default input_string; string_lenth number; loop_count number default 0; begin string_lenth := length(out_string_in); while loop_count < string_lenth loop dbms_output.put_line( substr( out_string_in, loop_count +1, 255 ) ); loop_count := loop_count +255; end loop; end FRE_OUTPUT_REPLACE; - person uzay95; 06.04.2014

Ну вот:

DECLARE
BEGIN
  dbms_output.enable(NULL); -- Disables the limit of DBMS
  -- Your print here !
END;
person Деян Добромиров    schedule 26.03.2015
comment
Верно, но он должен вызывать его с NULL, потому что так написано в документации. buffer_size Верхний предел в байтах объема буферизованной информации. Установка buffer_size в NULL указывает, что ограничений быть не должно. - person Деян Добромиров; 07.11.2019
comment
а действительно ли будет ограничение в 20000? - person Alex78191; 08.11.2019
comment
Неа. Я только что напечатал сто строк по 1000 символу в каждой, всего 100000. Через PL/SQL Developer. Настройка dbms_output.enable(100) вызовет ошибку переполнения буфера ;) - person Деян Добромиров; 11.11.2019
comment
Итак, что означает, что DBMS_OUTPUT.ENABLE(NULL) по умолчанию будет иметь значение 20000 для обратной совместимости? - person Alex78191; 11.11.2019
comment
Возможно, если вы запустите код, написанный с учетом новой документации, на более старой версии оракула, которая имеет этот предел в СУБД;) - person Деян Добромиров; 11.11.2019