2009-03-11 1 views

ответ

7

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

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

2

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

Edit: Вот пример процедура:

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; 
+0

интересно, у вас есть пример этого? благодаря! –

6

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

1

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

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

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

1

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