Как включить в процедуре dbms_output?

Есть пакет и в нем процедура. В ней хочу использовать команду:

dbms_output.put_line('some text');

Где нужно размещать команду set serveroutput on, чтобы включить вывод?

Пробовал внутри тела процедуры, но не работает, получаю ошибку:

Error(5,9): PL/SQL: SQL Statement ignored


Ответы (1 шт):

Автор решения: 0xdb

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
→ Ссылка