особенно тот, у которого нет 256 максимальных символов/строки и 1000000 максимальных символов/ограничение буфера.Oracle: любые замены для пакета DBMS_OUTPUT?
ответ
Может быть, один из этих вариантов будет отвечать вашим потребностям (в зависимости написать ли вы что-то на стороне сервера или на стороне клиента):
- UTL_FILE
- TEXT_IO
- AskTom post
(обновление Марк Харрисон) Я пошел с пакетом my-dbms-output на пост AskTom. Одна действительно приятная особенность заключается в том, что вы можете получить доступ к результатам через представление, чтобы было легко показать результат в клиентской программе. Я переименовал его в более короткое имя.
Вы можете использовать пакет 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;
Какой версия Oracle? Оба этих ограничения были смягчены в последних версиях. 10.2 поддерживает линии длиной более 255 символов (новый предел равен 32 тыс.) И исключает ограничение максимального размера буфера. В Oracle 9.2 было 255 символов на лимит/1 МБ общего предела, но Oracle отказалась от этой версии.
Другой вариант, хотя, вероятно, и не большой, заключается в том, чтобы писать в журнал предупреждений.
sys.dbms_system.ksdwrt(2,to_char(sysdate)|| ' -- The message ');
INSERT - фантастическая альтернатива. Вы не только получаете информацию из своего процесса, но и сохраняете ее для дальнейшего использования или анализа. И результаты могут быть получены и отфильтрованы и обработаны с помощью очень распространенного языка, называемого SQL. У вас может быть столбец со значением по умолчанию sysdate, чтобы проверить время и порядок. Он может быть помещен в автономную транзакцию, чтобы избежать потери журнала из-за отката.
Одно ограничение dbms_output заключается в том, что выход становится доступным только после завершения инструкции. Чтобы отслеживать длительные процессы, я использую dbms_pipe для отправки сообщений о состоянии. На другом конце трубы вы можете увидеть, что делает процесс.
интересно, у вас есть пример этого? благодаря! –