Как включить в процедуре dbms_output?
Есть пакет и в нем процедура. В ней хочу использовать команду:
dbms_output.put_line('some text');
Где нужно размещать команду set serveroutput on, чтобы включить вывод?
Пробовал внутри тела процедуры, но не работает, получаю ошибку:
Error(5,9): PL/SQL: SQL Statement ignored
Ответы (1 шт):
SET это команда клиентского приложения, которая устанавливает его внутреннею системную переменную SERVEROUTPUT {ON|OFF}. Эту команду поддерживат: SQL*Plus, SQL Developer и некоторые другие, но она не является частью синтаксиса PL/SQL или SQL.
Её надо выполнить до запуска PL/SQL блока:
create or replace procedure proc is
begin
dbms_output.put_line ('line 1');
dbms_output.put_line ('line 2');
end;
/
set serveroutput on
exec proc
line 1
line 2
Что делает SET SERVEROUTPUT ON "под капотом", поможет понять следующий пример.
Отключим вывод, сбросив пременную SERVEROUTPUT OFF, и выполним всё, что делалось неявно с SERVEROUTPUT ON, теперь вручную. Сначала, заново включим вывод:
set serveroutput off
exec dbms_output.enable ();
Запустим процедуру:
exec proc
PL/SQL procedure successfully completed.
Во время выполнения процедуры, каждый вызов dbms_output.put_line('some text'); будет добавлять одну строчку во внутренний массив строк, который сохраняется в области переменных сессии. Никакого вывода на консоль не будет, ни во время выполнения, ни после завершения. Это задача клиента - получить содержимое внутреннего массив строк и вывести его на консоль. Это выглядит как-то так:
var output varchar2
declare
lines dbms_output.CHARARR;
nl int := 100;
begin
dbms_output.get_lines (lines, nl);
for i in 1..nl loop
:output := :output||lines(i)||chr(10);
end loop;
end;
/
PL/SQL procedure successfully completed.
print output
line 1
line 2