Oracle: какие-нибудь замены для пакета DBMS_OUTPUT? - PullRequest
5 голосов
/ 11 марта 2009

особенно тот, который не имеет 256 символов в строке и 1000000 макс. символов / ограничение буфера.

Ответы [ 6 ]

7 голосов
/ 11 марта 2009

Возможно, один из этих вариантов подойдет вам (в зависимости от того, пишете ли вы что-нибудь на стороне сервера или на стороне клиента):

(обновление от Марка Харрисона) Я пошел с пакетом my-dbms-output в посте AskTom. Одна действительно приятная особенность заключается в том, что вы можете получить доступ к результатам через представление, чтобы было легко показать результаты в клиентской программе. Я переименовал его в более короткое имя.

6 голосов
/ 11 марта 2009

Какая версия Oracle? Оба эти ограничения были ослаблены в последних версиях. 10.2 поддерживает строки длиннее 255 символов (новое ограничение - 32 КБ) и устраняет ограничение максимального размера буфера. Oracle 9.2 имел ограничение в 255 символов на строку / 1 МБ, но Oracle прекратила поддержку этой версии.

2 голосов
/ 12 марта 2009

INSERT - фантастическая альтернатива. Вы не только получаете информацию из своего процесса, но и сохраняете для дальнейшего использования или анализа. И результаты могут быть извлечены и отфильтрованы и обработаны с помощью очень распространенного языка, называемого SQL. Вы можете иметь столбец с sysdate по умолчанию для проверки времени и порядка. Его можно поместить в автономную транзакцию, чтобы избежать потери регистрации из-за отката.

2 голосов
/ 11 марта 2009

Вы можете использовать пакет TCP для записи вывода на терминал или в удаленный регистратор данных. Неплохая отладка кода пакета, выполняемого в запланированных задачах.

Редактировать: Вот пример процедуры:

procedure pDebug( str in varchar2 )
-- output debugging message to display or tcp console
   is
x number;
l number;
nPort number;
sAddress varchar2(5000);
  begin
if c_bDebug = 1 then
    if c_tcpbDebug = 1 then
        if cSocket.remote_host is NULL then
            nPort := strMetaDataValue( 'TCP-DEBUG-PORT' );
            sAddress := strMetaDataValue( 'TCP-DEBUG-ADDRESS' );
            dbms_output.put_line( 'tcp:port ' || nPort );
            dbms_output.put_line( 'tcp:address ' || sAddress );
            if length( sAddress ) > 1 and nvl( nPort, 0 ) > 0 then
                begin
                dbms_output.put_line( 'tcp:open start ' ||to_char( SYSDATE, 'DD-MON-YYYY HH24:MI:SS' ) );
                cSocket := utl_tcp.open_connection( sAddress, nPort ); -- open connection
                dbms_output.put_line( 'tcp:open ' || to_char( SYSDATE, 'DD-MON-YYYY HH24:MI:SS' ) );
                c_tcpbDebug := 1;
                exception
                    when others then
                        dbms_output.put_line( SQLERRM );
                        dbms_output.put_line( 'Cant open debug tcp session ' || SYSTIMESTAMp );
                        c_tcpbDebug := 0;
                end;
            else
                c_tcpbDebug := 0;
            end if;
        end if;         

        if cSocket.remote_host is not NULL then
            dbms_output.put_line( 'tcp:write' );
            x := utl_tcp.write_line( cSocket, to_char( SYSDATE, 'DD-MON-YYYY HH24:MI:SS' ) || ' ' || str );
            x := utl_tcp.write_line( cSocket, utl_tcp.crlf );
        end if;
    end if;
-- this bit prints out the debug statement in 254 char bits
    l := length( str );
    x := 1;
    while x <= l loop
        dbms_output.put_line( substr( str,x,254 ) );
        x := x + 254;
    end loop;
end if;
end pDebug;
1 голос
/ 01 апреля 2009

Одним из ограничений dbms_output является то, что вывод становится доступным только после завершения оператора. Для отслеживания длительных процессов я использую dbms_pipe для отправки сообщений о состоянии. На другом конце трубы вы можете увидеть, что происходит в процессе.

1 голос
/ 11 марта 2009

Другой вариант, хотя, возможно, и не самый удачный, - это запись в журнал предупреждений.

sys.dbms_system.ksdwrt(2,to_char(sysdate)|| ' -- The message ');
...