CREATE OR REPLACE package pkg_common_logging 
as
    -- pkg_common_logging
    -- 2009; Ingo Voland 
    -- 
    -- Package enthaelt Funktionalitaeten fuer common logging
    -- benoetigt: Tabelle COMLOG_APP_LOG
    --            Sequence s_COMLOG_APP_LOG_id
    --
    --
    
    --
    -- folgende loglevel koennen definiert werden: debug / info / error
    -- es werden nur logeintraege geschrieben, wenn der in der 
    -- session ein höherer oder gleicher loglevel gesetzte ist als der
    -- für den logeintrag definierte. Somit kann eine 'debug' funktionalitaet 
    -- implementiert werden, ohne das diese debug Eintraege permanent die Logtabelle
    -- fuellen
    --
    --  matrix: logeintrage werden geschrieben wenn:
    --
    -- Log Eintrag Loglevel              Session Log Level
    --                      error        info            debug
    --   error               x             x                x
    --   info                              x                x
    --   debug                                              x
    --
    -- der default loglevel ist 'ERROR'
    --
    set_debug constant pls_integer := 3;
    set_info constant pls_integer := 2;
    set_error constant pls_integer := 1;
          
          
    --
    -- diese prozeduren setzen den loglevel fuer eine session
    -- der wert bleibt aktiv solange die session offen ist 
    -- oder bis ein andere wert gesetzt wird
    --
    -- der loglevel kann in der session variable oder fix im package gesezt werden.
    -- vorzugsweise soll der loglevel aber in der session gesetzt werden 
    -- um hardcodierte loglevel zu verhindern
    --
    procedure set_log_level(loglevel in pls_integer default set_error);
    procedure set_log_level(loglevel in COMLOG_APP_LOG.log_level%type default 'ERROR');

   --
    -- diese prozeduren setzen die loginformationen fuer eine session
    -- der wert bleibt aktiv bis:
    --   * ein neuer wert gesetzte wird
    --   * ein reset_log aufruf erfolgt
    --
    -- die gesetzte werte werden ebenfalls in v$session angezeigt
    -- 
    -- Das setzten eines wertes schreibt noch keine Eintraege in die Logtabellen
    -- mit hilfe der gesezten werte fuer Modul und Action sind die Logeintraege
    -- zu spaeteren Zeiten sortier- und gruppierbar
    --
    --
    -- Modul:   ist typischer weise der Name der ausführenden Procedure
    -- Action:  ist ein Subprozess in einer Procedure, z.b. 'fuellen der tabelle xyz'
    -- client_info: ist eine beliebige information für die aktuelle ausgeführte operatiom
    --
    procedure set_module(module_name varchar2, action_name varchar2);
    procedure set_action(action_name varchar2);
    procedure set_client_info(client_info varchar2);
    
    
    
    -- init_log: immer der erste Aufruf, das Loging wird initialisert
    --           der eintrag wird immer im loglevel 'error' geschrieben
    --
    procedure init_log(module_name varchar2, action_name varchar2,client_info varchar2);
    
    -- write_log 
    --          setzt 'cleint_info' und schreibt einen eintrag mit dem angegebenen loglevel. 
    --          wird kein loglevel angegeben wird der eintrag unter dem aktuell in der session 
    --          gesetzten loglevel geschrieben, default ist 'error'
    --          zu beachten ist, das die logeintraege nur geschrieben werden wenn 
    --          der in der procedure angegebenen loglevel kleiner oder gleich 
    --          dem in der session gesetzten loglevel ist
    procedure write_log(client_info varchar2, loglevel pls_integer default null );
    
    -- write_log_ins 
    --          diese procedure schreibt die anzahl der in der vorherigen aktion durch insert eingefügten records
    --          in die logtabelle. Fuer den Loglevel gilt das unter 'write_log' gesagte
    --
    --      beispiel:
    --          insert into TEST values (1,'testlog');
    --          pkg_common_logging.write_log_ins(loglevel => pkg_common_logging.set_info);
    --
    --          oder ohne spezifizierten loglevel, dann wird der session-loglevel genommen 
    --          und ein insert in die logtabelle findet immer statt
    --          pkg_common_logging.write_log_ins;
    --
    procedure write_log_ins(NO_OF_RECORDS in COMLOG_APP_LOG.NO_OF_RECORDS%type  default sql%rowcount, loglevel pls_integer default null);
    
    -- write_log_del 
    --          diese procedure schreibt die anzahl der in der vorherigen aktion durch delete  geloeschten records
    --          in die logtabelle. Fuer den Loglevel gilt das unter 'write_log' gesagte
    --
    --      beispiel:
    --          delete from test;
    --          pkg_common_logging.write_log_del(loglevel => pkg_common_logging.set_info);
    --
    --
    --          oder ohne spezifizierten loglevel, dann wird der session-loglevel genommen 
    --          und ein insert in die logtabelle findet immer statt
    --          pkg_common_logging.write_log_del;
    --
  

    procedure write_log_del(NO_OF_RECORDS in COMLOG_APP_LOG.NO_OF_RECORDS%type  default sql%rowcount, loglevel pls_integer default null);
    
    -- write_log_upd 
    --          diese procedure schreibt die anzahl der in der vorherigen aktion durch insert eingefügten records
    --          in die logtabelle. Fuer den Loglevel gilt das unter 'write_log' gesagte
    --
    --      beispiel:
    --          update test set id = 3;
    --          pkg_common_logging.write_log_upd(loglevel => pkg_common_logging.set_info);
    --
    --          oder ohne spezifizierten loglevel, dann wird der session-loglevel genommen 
    --          und ein insert in die logtabelle findet immer statt
    --          pkg_common_logging.write_log_upd;
    --

    procedure write_log_upd(NO_OF_RECORDS in COMLOG_APP_LOG.NO_OF_RECORDS%type  default sql%rowcount,loglevel pls_integer default null);
    
    -- write_log_sel 
    --          diese procedure schreibt die anzahl der in der vorherigen aktion durch insert eingefügten records
    --          in die logtabelle. Fuer den Loglevel gilt das unter 'write_log' gesagte
    --
    --      beispiel:
    --          select count(*) into v_num from dual;
    --          pkg_common_logging.write_log_sel(loglevel => pkg_common_logging.set_info);
    --
    --          oder ohne spezifizierten loglevel, dann wird der session-loglevel genommen 
    --          und ein insert in die logtabelle findet immer statt
    --          pkg_common_logging.write_log_sel;
    --
    
    procedure write_log_sel(NO_OF_RECORDS in COMLOG_APP_LOG.NO_OF_RECORDS%type  default sql%rowcount, loglevel pls_integer default null);
    
    
    -- write_log_error 
    --          diese procedure schreibt die fehlernumer und fehlercode in die logtabelle ,
    --          wenn in einer procedure eine exception aufgetreten ist. der Loglevel ist immer 'ERROR'
    --          diese Procedure muss mit in das excaption handling der aufrufenden instanz eingebunden sein
    --
    --      beispiel:
    --
    --          declare
    --              v_num number;
    --          begin
    --              select 1 / 0 ito v_num from dual;
    --
    --          exception 
    --             when others then 
    --                 pkg_common_logging.write_log_error;
    --                 raise;
    --          end;    
    --         
    --
    
    
    procedure write_log_error(client_info varchar2 default null, error_no varchar2 default SQLCODE, error_info varchar2 default SQLERRM);
    
    
    --
    -- diese procedure wird üblicher weise am ende der abarbeitung einer procedure 
    -- oder eines subprozesses aufgerufen und erhoeht die SESSION_ID .
    -- weiterhin werden alle anderen zaehler und timestamps 
    -- neu initialisiert.
    --
    
    procedure reset_log;
    
    
 --
 -- interne vars
 --
    r_comlog_app_log  comlog_app_log%rowtype;
    gv_log_level pls_integer;
    
    function show_version return varchar2;
     
end pkg_common_logging;