Стандартные пакеты. DBMS_OUTPUT

dbstalker, 19 июня

Этот пакет предназначен для вывода информации во временный буфер, чтобы можно было выбрать ее позже. Обычно его используют для отладки.

Приведенные ниже примеры тестировались на Oracle 10g.

SQL> set serveroutput on
SQL> exec dbms_output.put_line('hello');
hello
PL/SQL procedure successfully completed.

А вот так мы выключаем вывод

SQL> set serveroutput off
SQL>  exec dbms_output.put_line('hello');
PL/SQL procedure successfully completed.

Каждая сессия имеет свой буфер, который содержится в SGA.Вся информация, что выдается процедурами put_line и put помещается в этот буфер.

dbms_output.enable(buffer_size in integer default 20000) – процедура включает (активизирует) выдачу информации в буфер и устанавливает размер буфера(The maximum size is 1,000,000, the minimum is 2000).

dbms_output.disable – процедура для выключения выдачи в буфер.

procedure put (a varchar2) – процедурой помещается строка в буфер без перевода строки. Данные типа number, date будут преобразованы функцией to_char с использованием форматов по умолчанию.

procedure put_line(a varchar2) – тоже, что и put, только проставляется конец строки. Длина строки - limit of 32767 bytes.

procedure new_line – процедура проставляет конец строки

procedure get_line(line out varchar2, status out integer) выбирает строку из буфера . status – принимает значение 0 ( выборка успешна), 1 (строк для выборки в буфере не осталось). Line – содержание строки.

procedure get_lines(lines out dbmsoutput_linesarray, numlines in out integer); выбирает строки из буфера. Numlines – количество выбранных строчек. Lines – содержание буфера.

В процедурах get_line, put_line, put первый параметр - это переменная, из которой или в которую считываются данные.

А теперь приведу простенькие примерчики:

SQL> declare l varchar2 (2000);
  2  status integer;
  3  begin 
  4  dbms_output.enable(2000000); 
  5  dbms_output.put_line('hello1');
  6  dbms_output.get_line(l,status);
  7  insert into dbst (select l,status from dual);
  8  dbms_output.disable;
  9  commit;
 10  end;
 11  /
PL/SQL procedure successfully completed.

После выполнения этого блока табличка dbst будет иметь следующую запись:

NAME|STATUS
"hello1     "|0

а теперь выполним

declare l varchar2 (2000);
status integer;
begin 
dbms_output.enable(2000000); 
dbms_output.put_line('hello1');
dbms_output.put_line('hello2');
dbms_output.put_line('hello3');
dbms_output.put_line('hello4');
dbms_output.put_line('hello5');
dbms_output.get_line(l,status);
insert into dbst (select l,status from dual);
dbms_output.disable;
commit;
end;
/

а результат будет тот же:

NAME|STATUS
"hello1     "|0

А теперь попробуем

declare 
l  dbmsoutput_linesarray;
status integer default 10;
begin 
dbms_output.enable(2000000); 
dbms_output.put_line('hello1');
dbms_output.put_line('hello11');
dbms_output.put_line('hello111');
dbms_output.put_line('hello1111');
dbms_output.put_line('hello11111');
dbms_output.get_lines(l,status);
insert into dbst (select l(4),status from dual);
dbms_output.disable;
commit;
end;
/

результат будет таким

NAME|STATUS
"hello1111  "|5

Вот и все, если не обращать внимания на некоторые неприятные моменты. А они вот какие:

  • Между установленным размером буфера и объемом результатов нет однозначного соответствия, особенно для строк переменной длинны. Это связано с алгоритмом упаковки, который использует ORACLE.
  • Выбрать строки из буфера можно только средствами пакета DBMS_OUTPUT

1 комментарий

Прокоментировать

Имя
17 августа 2012 г. в 16:20

"и устанавливает размер буфера(The maximum size is 1,000,000, the minimum is 2000).", а потом dbms_output.enable(2000000); ... Зачем?

 

Новый комментарий

Я не спамер: введите суму 8+6



 

От авторов блога

О Блоге - прочитай перед началом.

Задать вопрос и получить ответ - уже решено 94 вопросов

Глоссарий - список терминов и сокращений


 
 

Бизнес форум