PL/SQL Beispiel
Ob eine Meldung geschrieben wird, sollte nicht in der Logging Funktion selbst entschieden werden. Weniger Overhead wird erzeugt, wenn einmalig der Loglevel geprueft wird und dann in der Anwendung selbst entschieden wird.
--
-- File: logpck.pls
--
set serveroutput on
--
drop table ctl_trace ;
create table ctl_trace (id1 number(1) default 0 );
insert into ctl_trace values (0);
--
drop sequence logid_seq;
create sequence logid_seq;
create or replace package glog as
procedure log (p in varchar2);
function chk_trace return boolean;
end;
/
show errors
create or replace package body glog as
v_appinfo_mod varchar2(48);
v_appinfo_act varchar2(32);
procedure log (p in varchar2) is
v_prefix varchar2(5) := chr(9) ;
v_timestamp timestamp := systimestamp;
begin
dbms_application_info.read_module(v_appinfo_mod,v_appinfo_act);
dbms_output.put_line(v_prefix || '..');
dbms_output.put_line (v_prefix || '-----------------------');
dbms_output.put_line (v_prefix || v_timestamp || ': Log Info => ' || p);
dbms_output.put_line (v_prefix || v_appinfo_mod || ': ' || v_appinfo_act);
dbms_output.put_line (v_prefix || '-----------------------');
end log ;
function chk_trace return boolean is
v_retval number := 0 ;
trace_on boolean := FALSE;
begin
select sign(id1)
into v_retval
from ctl_trace where rownum < 2;
if v_retval = 0 then
trace_on := false;
else
trace_on := true;
end if;
return trace_on;
end chk_trace ;
end;
/
show errors
--
create or replace package anwendung as
procedure wichtig;
procedure wichtig2;
end;
/
show errors
create or replace package body anwendung as
trace_on boolean := FALSE;
v_appinfo_mod varchar2(48);
v_appinfo_act varchar2(32);
procedure wichtig is
begin
trace_on := glog.chk_trace;
v_appinfo_mod := 'wichtig';
v_appinfo_act := 'erste Aktion';
dbms_application_info.set_module(v_appinfo_mod,v_appinfo_act);
dbms_output.put_line('Erste wichtige Aktion ...');
if trace_on then
glog.log('Loginfo ...');
end if;
v_appinfo_act := 'zweite Aktion';
dbms_application_info.set_module(v_appinfo_mod,v_appinfo_act);
dbms_output.put_line('Zweite wichtige Aktion ...');
if trace_on then
glog.log('jetzt sind wir bei ZWEI');
end if;
end wichtig ;
procedure wichtig2 is
begin
trace_on := glog.chk_trace;
v_appinfo_mod := 'wichtig2';
v_appinfo_act := 'erste Aktion';
dbms_application_info.set_module(v_appinfo_mod,v_appinfo_act);
dbms_output.put_line('wichtig2: Erste wichtige Aktion ...');
if trace_on then
glog.log('Loginfo ...');
end if;
v_appinfo_act := 'zweite Aktion';
dbms_application_info.set_module(v_appinfo_mod,v_appinfo_act);
dbms_output.put_line('wichtig2 Zweite wichtige Aktion ...');
if trace_on then
glog.log('jetzt sind wir bei ZWEI');
end if;
end wichtig2 ;
end;
/
show errors
Traceing kann von aussen enabled bzw disabled werden.
SQL> update ctl_trace set id1=1;
1 row updated.
SQL> exec anwendung.wichtig;
Erste wichtige Aktion ...
..
-----------------------
09-JUN-16 05.02.04.938796 AM: Log Info => Loginfo ...
wichtig: erste Aktion
-----------------------
Zweite wichtige Aktion ...
..
-----------------------
09-JUN-16 05.02.04.938863 AM: Log Info => jetzt sind wir bei ZWEI
wichtig: zweite Aktion
-----------------------
PL/SQL procedure successfully completed.
SQL> exec anwendung.wichtig2;
wichtig2: Erste wichtige Aktion ...
..
-----------------------
09-JUN-16 05.02.04.941332 AM: Log Info => Loginfo ...
wichtig2: erste Aktion
-----------------------
wichtig2 Zweite wichtige Aktion ...
..
-----------------------
09-JUN-16 05.02.04.941357 AM: Log Info => jetzt sind wir bei ZWEI
wichtig2: zweite Aktion
-----------------------
PL/SQL procedure successfully completed.
SQL> update ctl_trace set id1=0;
1 row updated.
SQL> exec anwendung.wichtig2;
wichtig2: Erste wichtige Aktion ...
wichtig2 Zweite wichtige Aktion ...
PL/SQL procedure successfully completed.
SQL>