put_line imprimir imprime developer dbms_output oracle plsql oracle-sqldeveloper dbms-output

oracle - imprimir - dbms_output.put_line no imprime



¿Cómo redirigir la salida de DBMS_OUTPUT.PUT_LINE a un archivo? (10)

Además de la respuesta de Tony, si está buscando saber dónde está gastando su programa PL / SQL es el momento, también vale la pena consultar this parte de la documentación de Oracle PL / SQL.

Necesito depurar en pl / sql para calcular los tiempos de los procedimientos, quiero usar:

SELECT systimestamp FROM dual INTO time_db; DBMS_OUTPUT.PUT_LINE(''time before procedure '' || time_db);

pero no entiendo a dónde va el resultado y cómo puedo redirigirlo a un archivo de registro que contendrá todos los datos que deseo recopilar?


Como alternativa a escribir en un archivo, ¿qué tal escribir en una mesa? En lugar de llamar a DBMS_OUTPUT.PUT_LINE, puede llamar a su propio procedimiento DEBUG.OUTPUT de la siguiente manera:

procedure output (p_text varchar2) is pragma autonomous_transaction; begin if g_debugging then insert into debug_messages (username, datetime, text) values (user, sysdate, p_text); commit; end if; end;

El uso de una transacción autónoma le permite retener los mensajes de depuración producidos a partir de transacciones que se retrotraen (por ejemplo, después de que se genera una excepción), como ocurriría si estuviera usando un archivo.

La variable booleana g_debugging es una variable de paquete que se puede establecer de manera predeterminada como falsa y establecerse en verdadero cuando se requiere una salida de depuración.

¡Por supuesto, necesitas administrar esa tabla para que no crezca para siempre! Una forma sería un trabajo que se ejecuta cada noche / semana y elimina los mensajes de depuración que son "antiguos".


Como nota al margen, recuerde que toda esta salida se genera en el lado del servidor.

Usando DBMS_OUTPUT, el texto se genera en el servidor mientras ejecuta su consulta y se almacena en un búfer. Luego se redirige a su aplicación cliente cuando el servidor finaliza la recuperación de datos de consulta. Es decir, solo obtiene esta información cuando finaliza la consulta.

Con UTL_FILE, toda la información registrada se almacenará en un archivo en el servidor. Cuando la ejecución finalice, tendrá que navegar a este archivo para obtener la información.

Espero que esto ayude.



Es posible escribir un archivo directamente en el servidor de bases de datos que aloja su base de datos, y eso cambiará junto con la ejecución de su programa PL / SQL.

Esto utiliza el directorio de Oracle TMP_DIR ; tienes que declararlo y crear el siguiente procedimiento:

CREATE OR REPLACE PROCEDURE write_log(p_log varchar2) -- file mode; thisrequires --- CREATE OR REPLACE DIRECTORY TMP_DIR as ''/directory/where/oracle/can/write/on/DB_server/''; AS l_file utl_file.file_type; BEGIN l_file := utl_file.fopen(''TMP_DIR'', ''my_output.log'', ''A''); utl_file.put_line(l_file, p_log); utl_file.fflush(l_file); utl_file.fclose(l_file); END write_log; /

Aquí es cómo usarlo:

1) Inicie esto desde su cliente SQL * PLUS:

BEGIN write_log(''this is a test''); for i in 1..100 loop DBMS_LOCK.sleep(1); write_log(''iter='' || i); end loop; write_log(''test complete''); END; /

2) en el servidor de la base de datos, abra un shell y

tail -f -n500 /directory/where/oracle/can/write/on/DB_server/my_output.log


Prueba esto:

SELECT systimestamp INTO time_db FROM dual ; DBMS_OUTPUT.PUT_LINE(''time before procedure '' || time_db);


Si solo está probando su PL / SQL en SQL Plus, puede dirigirlo a un archivo como este:

spool output.txt set serveroutput on begin SELECT systimestamp FROM dual INTO time_db; DBMS_OUTPUT.PUT_LINE(''time before procedure '' || time_db); end; / spool off

IDEs como Toad y SQL Developer pueden capturar el resultado de otras maneras, pero no estoy familiarizado con cómo.


Un hilo viejo, pero hay otra alternativa.

Desde 9i puede usar la función de tabla canalizada.

Primero, crea un tipo como una tabla de varchar:

CREATE TYPE t_string_max IS TABLE OF VARCHAR2(32767);

Segundo, envuelva su código en una declaración de función canalizada:

CREATE FUNCTION fn_foo (bar VARCHAR2) -- your params RETURN t_string_max PIPELINED IS -- your vars BEGIN -- your code END; /

Reemplace todo DBMS_OUTPUT.PUT_LINE por PIPE ROW .

Finalmente, llámalo así:

SELECT * FROM TABLE(fn_foo(''param''));

Espero eso ayude.


use set serveroutput en;

por ejemplo:

set serveroutput on; DECLARE x NUMBER; BEGIN x := 72600; dbms_output.put_line(''The variable X = ''); dbms_output.put_line(x); END;


DBMS_OUTPUT no es la mejor herramienta para depurar, ya que la mayoría de los entornos no lo usan de forma nativa. DBMS_OUTPUT embargo, si desea capturar el resultado de DBMS_OUTPUT , simplemente usaría el procedimiento DBMS_OUTPUT.get_line .

Aquí hay un pequeño ejemplo:

SQL> create directory tmp as ''/tmp/''; Directory created SQL> CREATE OR REPLACE PROCEDURE write_log AS 2 l_line VARCHAR2(255); 3 l_done NUMBER; 4 l_file utl_file.file_type; 5 BEGIN 6 l_file := utl_file.fopen(''TMP'', ''foo.log'', ''A''); 7 LOOP 8 EXIT WHEN l_done = 1; 9 dbms_output.get_line(l_line, l_done); 10 utl_file.put_line(l_file, l_line); 11 END LOOP; 12 utl_file.fflush(l_file); 13 utl_file.fclose(l_file); 14 END write_log; 15 / Procedure created SQL> BEGIN 2 dbms_output.enable(100000); 3 -- write something to DBMS_OUTPUT 4 dbms_output.put_line(''this is a test''); 5 -- write the content of the buffer to a file 6 write_log; 7 END; 8 / PL/SQL procedure successfully completed SQL> host cat /tmp/foo.log this is a test