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