2011-02-07 26 views

Respuesta

0

Depende de la relación de cuántas veces se llama a dbms_output.put_line frente a lo que otra cosa que hacer en PL/SQL.

+1

Otro factor importante es qué tipo de expresiones se utilizan para construir el parámetro, p. Ej. 'dbms_output.put_line (my_slow_function())' –

7

Cada línea de código adicional disminuye el rendimiento del código. Después de todo, es una instrucción adicional para ser ejecutada, que al menos consume algo de CPU. Entonces, sí, dbms_output.put_line disminuye el rendimiento.

La verdadera pregunta es: ¿el beneficio de esta línea de código adicional supera la penalización de rendimiento? Sólo usted puede contestar a esa pregunta.

Saludos,
Rob.

2

Utilizo una tabla de registro en lugar de dbms_output. Asegúrese de configurar como transacción autónoma, algo así como (modificar para sus necesidades, por supuesto):

create or replace package body somePackage as 
... 
procedure ins_log(
i_msg in varchar2, 
i_msg_type in varchar2, 
i_msg_code in number default 0, 
i_msg_context in varchar2 default null 
) IS PRAGMA AUTONOMOUS_TRANSACTION; 

begin 

    insert into myLogTable 
    (
    created_date, 
    msg, 
    msg_type, 
    msg_code, 
    msg_context 
) 
    values 
    (
    sysdate, 
    i_msg, 
    i_msg_type, 
    i_msg_code, 
    i_msg_context 
); 

    commit; 

end ins_log; 
... 

end; 

Asegúrese de crear su tabla de registro, por supuesto. En su código, si está haciendo muchas operaciones en un bucle, es posible que desee conectarse solamente a una vez por operaciones x num, algo así como:

create or replace myProcedure as 
    cursor some_cursor is 
    select * from someTable; 

    v_ctr pls_integer := 0; 

begin 

for rec in some_cursor 
loop 
    v_ctr := v_ctr + 1; 

    -- do something interesting 

    if (mod(v_ctr, 1000) = 0) then 
    somePackage.ins_log('Inserted ' || v_ctr || ' records', 
         'Log', 
         i_msg_context=>'myProcedure'); 
    end if; 

end loop; 
commit; 

exception 
    when others then 
    somePackage.ins_log(SQLERRM, 'Err', i_msg_context=>'myProcedure'); 
    rollback; 
    raise; 
end; 

Tenga en cuenta que la transacción autónoma se asegurará de que su registro se inserta stmt , incluso si ocurre un error y restituye todo lo demás (ya que es una transacción separada).

Espero que esto ayude ... mucho mejor que DBMS_OUTPUT;)

+0

Esta es generalmente una buena solución, pero como el cartel original está preocupado por la sobrecarga, podría ser mucho peor. Las transacciones autónomas tardan mucho más en procesarse que las llamadas a 'dbms_output.put_line'. – Allan

+2

Realmente no desea un conjunto de dbms_output.put_lines en el código de producción. Esto es especialmente cierto con el código que ingresa en cualquier bucle;) – tbone

4

se puede mirar en conditional compilation para que el DBMS_OUTPUT.PUT_LINE son sólo en el código pre-analizada si el procedimiento se compila con la opción apropiada.

Una pregunta es, se ha llamado DBMS_OUTPUT.ENABLE. Si es así, cualquier valor en un DBMS_OUTPUT.PUT_LINE se grabará en la estructura de memoria de la sesión. Si continúas empujando cosas y nunca quitándolas (lo que podría ser el caso con algunas conexiones de servidores de aplicaciones), es posible que después de unos días tengas muchas cosas en la memoria.

Cuestiones relacionadas