2009-03-11 32 views

Respuesta

7

Tal vez una de estas opciones se adapte a sus necesidades (dependiendo de si se escribe algo en el lado del servidor o cliente):

(actualización por Mark Harrison) Fui con el paquete my-dbms-output en la publicación de AskTom. Una característica realmente agradable es que puede acceder a los resultados a través de una vista, de modo que es fácil mostrar el resultado en un programa de cliente. Lo renombré a un nombre más corto.

2

Puede usar el paquete TCP para escribir salida en un terminal o en un registrador de datos remoto. Muy útil para depurar el código del paquete que se ejecuta en tareas programadas.

Edición: He aquí un ejemplo de procedimiento:

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

interesante, ¿tiene un ejemplo de esto? ¡Gracias! –

6

¿Qué versión de Oracle? Ambas limitaciones se han relajado en las versiones recientes. 10.2 admite líneas de más de 255 caracteres (el nuevo límite es 32k) y elimina la limitación de tamaño de búfer máximo. Oracle 9.2 tenía 255 caracteres por línea/1 MB de límite total, pero Oracle ha desprotegido esa versión.

1

Otra opción, aunque probablemente no la mejor, es escribir en el registro de alertas.

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

INSERT es una alternativa fantástica. No solo obtiene la información de su proceso, sino que persiste para futuras referencias o análisis. Y los resultados se pueden recuperar, filtrar y procesar con un lenguaje muy común llamado SQL. Podría tener una columna con un valor predeterminado de sysdate para verificar el tiempo y el orden. Se puede colocar dentro de una transacción autónoma para evitar perder el registro debido a una reversión.

1

Una limitación de dbms_output es que la salida está disponible solo después de que la instrucción haya finalizado. Para realizar un seguimiento de los procesos de larga ejecución, uso dbms_pipe para enviar mensajes de estado. En el otro extremo de la tubería, puede ver a qué se dedica el proceso.

Cuestiones relacionadas