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

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

Приведенные ниже примеры тестировались на 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

Комментарии (0)



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

Имя
Электронная почта
 
Ваш сайт
Защита от спама: укажите сумму 3 + 0
   
 

Поиск по блогам



Подпишись на RSS:

RSS - Подписаться на блог



Читателям


Рекомендую к прочтению





Разделы блога



Последние публикации



Последние коментарии