Hi,
There is a small change in INSTR function or with my nls caratere set.
Now in my enviroment there is no problem.
Regards,
Guillaume Moulard
[EMAIL PROTECTED]
Project : LOG4PLSQL : Oracle Database Loggin tools
see : http://log4plsql.sourceforge.net/
and : http://sourceforge.net/mailarchive/forum.php?forum=log4plsql-all-info or
http://www.mail-archive.com/[EMAIL PROTECTED]
for [EMAIL PROTECTED]
-----Message d'origine-----
De : [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
Envoy� : jeudi 26 f�vrier 2004 15:25
� : [EMAIL PROTECTED]
Objet : [log4plsql] (no subject)
Hi,
I'm just starting to use log4plsql in our new application - think it's a great tool!
I'm having trouble getting call stack logging to work by default.
I'm running version 3.1.2.1, on Oracle 9i.
I've written the following very simple test code.
Create or replace package insert_error as
procedure insert_error;
end insert_error;
Create or replace package outer_insert_error as
procedure outer_insert_error;
end outer_insert_error;
create or replace package body insert_error as
procedure insert_error is
begin
plog.fatal('insert');
end insert_error;
end insert_error;
create or replace package body outer_insert_error as
procedure outer_insert_error is
begin
insert_error.insert_error();
end outer_insert_error;
end outer_insert_error;
I then run this using
begin
outer_insert_error.outer_insert_error();
end;
/
And doing a select from vlog, I would expect to see some information regarding the
call stack, but in fact what I get is as
follows:
Can anyone suggest an answer?
Thanks in advance for your help,
Scott Robinson.
CREATE OR REPLACE
PACKAGE BODY PLOG IS
-------------------------------------------------------------------
--
-- Nom package : PLOG
--
-- Objectif : plog code
--
-- Version : 3.0
-------------------------------------------------------------------
-- see package spec for history
-------------------------------------------------------------------
-------------------------------------------------------------------
-- Variable global priv� au package
-------------------------------------------------------------------
/*
* Copyright (C) LOG4PLSQL project team. All rights reserved.
*
* This software is published under the terms of the The LOG4PLSQL
* Software License, a copy of which has been included with this
* distribution in the LICENSE.txt file.
* see: <http://log4plsql.sourceforge.net> */
-------------------------------------------------------------------
LOG4PLSQL_VERSION VARCHAR2(200) := '3.1.2.1';
-------------------------------------------------------------------
-- Code priv� au package
-------------------------------------------------------------------
-------------------------------------------------------------------
--------------------------------------------------------------------
FUNCTION getNextID
(
pCTX IN OUT NOCOPY LOG_CTX -- Context
) RETURN TLOG.ID%type
IS
temp number;
BEGIN
select SLOG.nextval into temp from dual;
return temp;
end getNextID;
----------------------------------------------------------------------
--function instrLast(ch1 varchar2, ch2 varchar2) return number
--is
--ret number := 0;
--begin
-- FOR i IN REVERSE 0..length(Ch1) LOOP
-- if instr(substr(ch1,i),ch2) > 0 then
-- return i;
-- end if;
-- end loop;
-- return ret;
--end;
--------------------------------------------------------------------
FUNCTION calleurname return varchar2
IS
endOfLine constant char(1) := chr(10);
endOfField constant char(1) := chr(32);
nbrLine number;
ptFinLigne number;
ptDebLigne number;
ptDebCode number;
pt1 number;
cpt number;
allLines varchar2(4000);
resultat varchar2(4000);
Line varchar2(4000);
UserCode varchar2(4000);
myName varchar2(2000) := '.PLOG';
begin
allLines := dbms_utility.format_call_stack;
cpt := 2;
ptFinLigne := length(allLines);
ptDebLigne := ptFinLigne;
While ptFinLigne > 0 and ptDebLigne > 83 loop
ptDebLigne := INSTR (allLines, endOfLine, -1, cpt) + 1 ;
cpt := cpt + 1;
-- traite ligne
Line := SUBSTR(allLines, ptDebLigne, ptFinLigne - ptDebLigne);
ptDebCode := INSTR (Line, endOfField, -1, 1);
UserCode := SUBSTR(Line, ptDebCode+1);
IF instr(UserCode,myName) = 0 then
IF cpt > 3 then
resultat := resultat||'.';
end IF;
resultat := resultat||UserCode;
end if;
ptFinLigne := ptDebLigne - 1;
end loop;
return resultat;
end calleurname;
--------------------------------------------------------------------
FUNCTION getDefaultContext
-- Cette fonction est priv�, Elle retourne le contexte par default
-- quand il n'est pas pr�ciss�
RETURN LOG_CTX
IS
newCTX LOG_CTX;
lSECTION TLOG.LSECTION%type;
BEGIN
lSECTION := calleurname;
newCTX := init (pSECTION => lSECTION);
RETURN newCTX;
END getDefaultContext;
--------------------------------------------------------------------
PROCEDURE checkAndInitCTX(
pCTX IN OUT NOCOPY LOG_CTX -- Context
)
IS
lSECTION TLOG.LSECTION%type;
BEGIN
IF pCTX.isDefaultInit = FALSE THEN
lSECTION := calleurname;
pCTX := init (pSECTION => lSECTION);
END IF;
END;
--------------------------------------------------------------------
procedure addRow
(
pID in TLOG.id%type,
pLDate in TLOG.ldate%type,
pLHSECS in TLOG.lhsecs%type,
pLLEVEL in TLOG.llevel%type,
pLSECTION in TLOG.lsection%type,
pLUSER in TLOG.luser%type,
pLTEXTE in TLOG.ltexte%type
)
is
begin
insert into TLOG
(
ID ,
LDate ,
LHSECS ,
LLEVEL ,
LSECTION ,
LUSER ,
LTEXTE
) VALUES (
pID,
pLDate,
pLHSECS,
pLLEVEL,
pLSECTION,
pLUSER,
pLTEXTE
);
end;
--------------------------------------------------------------------
procedure addRowAutonomous
(
pID in TLOG.id%type,
pLDate in TLOG.ldate%type,
pLHSECS in TLOG.lhsecs%type,
pLLEVEL in TLOG.llevel%type,
pLSECTION in TLOG.lsection%type,
pLUSER in TLOG.luser%type,
pLTEXTE in TLOG.ltexte%type
)
is
PRAGMA AUTONOMOUS_TRANSACTION;
begin
addRow
(
pID => pID,
pLDate => pLDate,
pLHSECS => pLHSECS,
pLLEVEL => pLLEVEL,
pLSECTION => pLSECTION,
pLUSER => pLUSER,
pLTEXTE => pLTEXTE
);
commit;
exception when others then
PLOG.ERROR;
rollback;
raise;
end;
--------------------------------------------------------------------
PROCEDURE log
-- procedure priv� pour int�grer les donn�es dans la table
-- RAISE : -20503 'error DBMS_PIPE.send_message.
(
pCTX IN OUT NOCOPY LOG_CTX , -- Context
pID IN TLOG.ID%type ,
pLDate IN TLOG.LDATE%type ,
pLHSECS IN TLOG.LHSECS%type ,
pLLEVEL IN TLOG.LLEVEL%type ,
pLSECTION IN TLOG.LSECTION%type ,
pLUSER IN TLOG.LUSER%type ,
pLTEXTE IN TLOG.LTEXTE%type
)
IS
ret number;
LLTEXTE TLOG.LTEXTE%type ;
pt number;
BEGIN
IF pCTX.isDefaultInit = FALSE THEN
plog.error('please is necessary to use plog.init for yours contexte.');
END IF;
IF PLTEXTE is null then
LLTEXTE := 'SQLCODE:'||SQLCODE ||' SQLERRM:'||SQLERRM;
ELSE
BEGIN
LLTEXTE := pLTEXTE;
EXCEPTION
WHEN VALUE_ERROR THEN
ASSERT (pCTX, length(pLTEXTE) <= 2000, 'Log Message id:'||pID||' too
long. ');
LLTEXTE := substr(pLTEXTE, 0, 2000);
WHEN OTHERS THEN
PLOG.FATAL;
END;
END IF;
IF pCTX.USE_LOGTABLE = TRUE then
IF pCTX.USE_OUT_TRANS = FALSE then
addRow
(
pID => pID,
pLDate => pLDate,
pLHSECS => pLHSECS,
pLLEVEL => pLLEVEL,
pLSECTION => pLSECTION,
pLUSER => pLUSER,
pLTEXTE => LLTEXTE
);
ELSE
addRowAutonomous
(
pID => pID,
pLDate => pLDate,
pLHSECS => pLHSECS,
pLLEVEL => pLLEVEL,
pLSECTION => pLSECTION,
pLUSER => pLUSER,
pLTEXTE => LLTEXTE
);
END IF;
END IF;
IF pCTX.USE_LOG4J = TRUE then
DBMS_PIPE.pack_message(pID);
DBMS_PIPE.pack_message(TO_CHAR(pLDATE, 'DD month YYYY
HH24:MI:SS')||':'||LTRIM(TO_CHAR(MOD(pLHSECS,100),'09')));
DBMS_PIPE.pack_message(pLLEVEL);
DBMS_PIPE.pack_message(pLSECTION);
DBMS_PIPE.pack_message(LLTEXTE);
DBMS_PIPE.pack_message(pLUSER);
DBMS_PIPE.pack_message('SAVE_IN_LOG');
ret := DBMS_PIPE.send_message(pCTX.DBMS_PIPE_NAME);
IF RET <> 0 then
raise_application_error(ERR_CODE_DBMS_PIPE, MES_CODE_DBMS_PIPE || RET);
END IF;
END IF;
IF pCTX.USE_ALERT = TRUE then
sys.dbms_system.ksdwrt(2,'PLOG:'||TO_CHAR(pLDATE, 'YYYY-MM-DD
HH24:MI:SS')||':'||LTRIM(TO_CHAR(MOD(pLHSECS,100),'09'))||' user: '||PLUSER||' level:
'||getLevelInText(pLLEVEL)||' logid: '||pID ||' '||pLSECTION);
sys.dbms_system.ksdwrt(2,substr(LLTEXTE,0,1000));
if (length(LLTEXTE) >= 1000) then
sys.dbms_system.ksdwrt(2,substr(LLTEXTE,1000));
end if;
END IF;
IF pCTX.USE_TRACE = TRUE then
sys.dbms_system.ksdwrt(1,'PLOG:'||TO_CHAR(pLDATE, 'YYYY-MM-DD
HH24:MI:SS')||':'||LTRIM(TO_CHAR(MOD(pLHSECS,100),'09'))||' user: '||PLUSER||' level:
'||getLevelInText(pLLEVEL)||' logid: '||pID ||' '||pLSECTION);
sys.dbms_system.ksdwrt(1,substr(LLTEXTE,0,1000));
if (length(LLTEXTE) >= 1000) then
sys.dbms_system.ksdwrt(1,substr(LLTEXTE,1000));
end if;
END IF;
IF pCTX.USE_DBMS_OUTPUT = TRUE then
sys.DBMS_OUTPUT.PUT_LINE(TO_CHAR(pLDATE,
'HH24:MI:SS')||':'||LTRIM(TO_CHAR(MOD(pLHSECS,100),'09'))||'-'||getLevelInText||'-'||pLSECTION);
pt := 0;
while pt <= length(LLTEXTE) loop
sys.DBMS_OUTPUT.PUT_LINE(substr(LLTEXTE,pt,255));
pt := pt + 255;
end loop;
END IF;
end log;
-------------------------------------------------------------------
-------------------------------------------------------------------
-- Code public du package
-------------------------------------------------------------------
-------------------------------------------------------------------
--------------------------------------------------------------------
FUNCTION init
-- initialisation du contexte
(
pSECTION IN TLOG.LSECTION%type default NULL , --
log section
pLEVEL IN TLOG.LLEVEL%type default PLOGPARAM.DEFAULT_LEVEL , --
log level (Use only for debug)
pLOG4J IN BOOLEAN default PLOGPARAM.DEFAULT_USE_LOG4J, --
if true the log is send to log4j
pLOGTABLE IN BOOLEAN default PLOGPARAM.DEFAULT_LOG_TABLE, --
if true the log is insert into tlog
pOUT_TRANS IN BOOLEAN default PLOGPARAM.DEFAULT_LOG_OUT_TRANS, --
if true the log is in transactional log
pALERT IN BOOLEAN default PLOGPARAM.DEFAULT_LOG_ALERT, -- if
true the log is write in alert.log
pTRACE IN BOOLEAN default PLOGPARAM.DEFAULT_LOG_TRACE, --
if true the log is write in trace file
pDBMS_OUTPUT IN BOOLEAN default PLOGPARAM.DEFAULT_DBMS_OUTPUT, --
if true the log is send in standard output (DBMS_OUTPUT.PUT_LINE)
pDBMS_PIPE_NAME IN VARCHAR2 default PLOGPARAM.DEFAULT_DBMS_PIPE_NAME --
)
RETURN LOG_CTX
IS
pCTX LOG_CTX;
BEGIN
pCTX.isDefaultInit := TRUE;
pCTX.LSection := nvl(pSECTION, calleurname);
pCTX.INIT_LSECTION := pSECTION;
pCTX.LLEVEL := pLEVEL;
pCTX.INIT_LLEVEL := pLEVEL;
pCTX.USE_LOG4J := pLOG4J;
pCTX.USE_OUT_TRANS := pOUT_TRANS;
pCTX.USE_LOGTABLE := pLOGTABLE;
pCTX.USE_ALERT := pALERT;
pCTX.USE_TRACE := pTRACE;
pCTX.USE_DBMS_OUTPUT := pDBMS_OUTPUT;
pCTX.DBMS_PIPE_NAME := pDBMS_PIPE_NAME;
return pCTX;
end init;
--------------------------------------------------------------------
PROCEDURE setBeginSection
-- initialisation d'un debut de niveaux hierarchique de log
(
pCTX IN OUT NOCOPY LOG_CTX , -- Context
pSECTION IN TLOG.LSECTION%type -- Texte du log
) IS
BEGIN
checkAndInitCTX(pCTX);
pCTX.LSection := pCTX.LSection||PLOGPARAM.DEFAULT_Section_sep||pSECTION;
end setBeginSection;
--------------------------------------------------------------------
FUNCTION getSection
-- renvoie la section en cours
(
pCTX IN OUT NOCOPY LOG_CTX -- Context
)
RETURN TLOG.LSECTION%type
IS
BEGIN
return pCTX.LSection;
end getSection;
--------------------------------------------------------------------
FUNCTION getSection
-- renvoie la section en cours
RETURN TLOG.LSECTION%type
IS
generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext;
BEGIN
return getSection(pCTX =>generiqueCTX) ;
end getSection;
--------------------------------------------------------------------
PROCEDURE setEndSection
-- fin d'un niveau hierarchique de log et dee tout c'est sup�rieur
-- par default [/]
(
pCTX IN OUT NOCOPY LOG_CTX , -- Context
pSECTION IN TLOG.LSECTION%type default 'EndAllSection' -- Texte du log
) IS
BEGIN
checkAndInitCTX(pCTX);
if pSECTION = 'EndAllSection' THEN
pCTX.LSection := nvl(pCTX.INIT_LSECTION, calleurname);
RETURN;
END IF;
pCTX.LSection := substr(pCTX.LSection,1,instr(UPPER(pCTX.LSection),
UPPER(pSECTION), -1)-2);
end setEndSection;
-------------------------------------------------------------------
PROCEDURE setTransactionMode
-- utlisation des log dans ou en dehors des transactions
-- TRUE => Les log sont dans la transaction
-- FALSE => les log sont en dehors de la transaction
(
pCTX IN OUT NOCOPY LOG_CTX , -- Context
inTransaction IN boolean default TRUE -- TRUE => Les log
sont dans la transaction,
-- FALSE => les log
sont en dehors de la transaction
)
IS
BEGIN
checkAndInitCTX(pCTX);
pCTX.USE_OUT_TRANS := inTransaction;
end setTransactionMode;
-------------------------------------------------------------------
FUNCTION getTransactionMode
-- TRUE => Les log sont dans la transaction
-- FALSE => les log sont en dehors de la transaction
(
pCTX IN OUT NOCOPY LOG_CTX -- Context
)
RETURN boolean
IS
BEGIN
return pCTX.USE_OUT_TRANS;
end getTransactionMode;
-------------------------------------------------------------------
FUNCTION getTransactionMode
RETURN boolean
IS
generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext;
BEGIN
return getTransactionMode(pCTX => generiqueCTX);
end getTransactionMode;
-------------------------------------------------------------------
PROCEDURE setUSE_LOG4JMode
--TRUE => Log is send to USE_LOG4J
--FALSE => Log is not send to USE_LOG4J
(
pCTX IN OUT NOCOPY LOG_CTX , -- Context
inUSE_LOG4J IN boolean default TRUE -- TRUE => Log is send
to USE_LOG4J,
-- FALSE => Log is not
send to USE_LOG4J
)
IS
BEGIN
checkAndInitCTX(pCTX);
pCTX.USE_LOG4J := inUSE_LOG4J;
end setUSE_LOG4JMode;
-------------------------------------------------------------------
FUNCTION getUSE_LOG4JMode
--TRUE => Log is send to USE_LOG4J
--FALSE => Log is not send to USE_LOG4J
(
pCTX IN OUT NOCOPY LOG_CTX -- Context
)
RETURN boolean
IS
BEGIN
return pCTX.USE_LOG4J;
end getUSE_LOG4JMode;
-------------------------------------------------------------------
FUNCTION getUSE_LOG4JMode
RETURN boolean
IS
generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext;
BEGIN
return getTransactionMode(pCTX => generiqueCTX);
end getUSE_LOG4JMode;
-------------------------------------------------------------------
PROCEDURE setLOG_TABLEMode
--TRUE => Log is send to LOG_TABLEMODE
--FALSE => Log is not send to LOG_TABLEMODE
(
pCTX IN OUT NOCOPY LOG_CTX , -- Context
inLOG_TABLE IN boolean default TRUE -- TRUE => Log is send
to LOG_TABLEMODE,
-- FALSE => Log is not
send to LOG_TABLEMODE
)
IS
BEGIN
checkAndInitCTX(pCTX);
pCTX.USE_LOGTABLE := inLOG_TABLE;
end setLOG_TABLEMode;
-------------------------------------------------------------------
FUNCTION getLOG_TABLEMode
--TRUE => Log is send to LOG_TABLEMODE
--FALSE => Log is not send to LOG_TABLEMODE
(
pCTX IN OUT NOCOPY LOG_CTX -- Context
)
RETURN boolean
IS
BEGIN
return pCTX.USE_LOGTABLE;
end getLOG_TABLEMode;
-------------------------------------------------------------------
FUNCTION getLOG_TABLEMode
RETURN boolean
IS
generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext;
BEGIN
return getTransactionMode(pCTX => generiqueCTX);
end getLOG_TABLEMode;
-------------------------------------------------------------------
PROCEDURE setLOG_ALERTMode
--TRUE => Log is send to LOG_ALERT
--FALSE => Log is not send to LOG_ALERT
(
pCTX IN OUT NOCOPY LOG_CTX , -- Context
inLOG_ALERT IN boolean default TRUE -- TRUE => Log is send
to LOG_ALERT,
-- FALSE => Log is not
send to LOG_ALERT
)
IS
BEGIN
checkAndInitCTX(pCTX);
pCTX.USE_ALERT := inLOG_ALERT;
end setLOG_ALERTMode;
-------------------------------------------------------------------
FUNCTION getLOG_ALERTMode
--TRUE => Log is send to LOG_ALERT
--FALSE => Log is not send to LOG_ALERT
(
pCTX IN OUT NOCOPY LOG_CTX -- Context
)
RETURN boolean
IS
BEGIN
return pCTX.USE_ALERT;
end getLOG_ALERTMode;
-------------------------------------------------------------------
FUNCTION getLOG_ALERTMode
RETURN boolean
IS
generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext;
BEGIN
return getTransactionMode(pCTX => generiqueCTX);
end getLOG_ALERTMode;
-------------------------------------------------------------------
PROCEDURE setLOG_TRACEMode
--TRUE => Log is send to LOG_TRACE
--FALSE => Log is not send to LOG_TRACE
(
pCTX IN OUT NOCOPY LOG_CTX , -- Context
inLOG_TRACE IN boolean default TRUE -- TRUE => Log is send
to LOG_TRACE,
-- FALSE => Log is not
send to LOG_TRACE
)
IS
BEGIN
checkAndInitCTX(pCTX);
pCTX.USE_TRACE := inLOG_TRACE;
end setLOG_TRACEMode;
-------------------------------------------------------------------
FUNCTION getLOG_TRACEMode
--TRUE => Log is send to LOG_TRACE
--FALSE => Log is not send to LOG_TRACE
(
pCTX IN OUT NOCOPY LOG_CTX -- Context
)
RETURN boolean
IS
BEGIN
return pCTX.USE_TRACE;
end getLOG_TRACEMode;
-------------------------------------------------------------------
FUNCTION getLOG_TRACEMode
RETURN boolean
IS
generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext;
BEGIN
return getTransactionMode(pCTX => generiqueCTX);
end getLOG_TRACEMode;
-------------------------------------------------------------------
PROCEDURE setDBMS_OUTPUTMode
--TRUE => Log is send to DBMS_OUTPUT
--FALSE => Log is not send to DBMS_OUTPUT
(
pCTX IN OUT NOCOPY LOG_CTX , -- Context
inDBMS_OUTPUT IN boolean default TRUE -- TRUE => Log is send
to DBMS_OUTPUT,
-- FALSE => Log is not
send to DBMS_OUTPUT
)
IS
BEGIN
checkAndInitCTX(pCTX);
pCTX.USE_DBMS_OUTPUT := inDBMS_OUTPUT;
end setDBMS_OUTPUTMode;
-------------------------------------------------------------------
FUNCTION getDBMS_OUTPUTMode
--TRUE => Log is send to DBMS_OUTPUT
--FALSE => Log is not send to DBMS_OUTPUT
(
pCTX IN OUT NOCOPY LOG_CTX -- Context
)
RETURN boolean
IS
BEGIN
checkAndInitCTX(pCTX);
return pCTX.USE_DBMS_OUTPUT;
end getDBMS_OUTPUTMode;
-------------------------------------------------------------------
FUNCTION getDBMS_OUTPUTMode
RETURN boolean
IS
generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext;
BEGIN
return getTransactionMode(pCTX => generiqueCTX);
end getDBMS_OUTPUTMode;
-------------------------------------------------------------------
PROCEDURE setLevel
-- il est possible de modifier avec setLevell dynamiquement le niveau de log
-- l'appel de setLevel sans paramettre re-poossitionne le niveaux a celuis specifier
-- dans le package.
-- erreur possible : -20501, 'Set Level not in LOG predefine constantes'
(
pCTX IN OUT NOCOPY LOG_CTX , -- Context
pLEVEL IN TLOG.LLEVEL%type default NOLEVEL -- Level sup�rieur
attribuer dynamiquement
) IS
nbrl number;
BEGIN
checkAndInitCTX(pCTX);
IF pLEVEL = NOLEVEL then
pCTX.LLEVEL := pCTX.INIT_LLEVEL;
END IF;
select count(*) into nbrl FROM TLOGLEVEL where TLOGLEVEL.LLEVEL=pLEVEL;
IF nbrl > 0 then
pCTX.LLEVEL := pLEVEL;
ELSE
raise_application_error(-20501, 'SetLevel ('||pLEVEL||') not in TLOGLEVEL
table');
END IF;
EXCEPTION
WHEN OTHERS THEN
PLOG.ERROR;
end setLevel;
PROCEDURE setLevel
-- il est possible de modifier avec setLevell dynamiquement le niveau de log
-- l'appel de setLevel sans paramettre re-poossitionne le niveaux a celuis specifier
-- dans le package.
-- erreur possible : -20501, 'Set Level not in LOG predefine constantes'
(
pCTX IN OUT NOCOPY LOG_CTX , -- Context
pLEVEL IN TLOGLEVEL.LCODE%type -- Level sup�rieur
attribuer dynamiquement
) IS
nbrl number;
BEGIN
setLevel (pCTX, getTextInLevel(pLEVEL));
end setLevel;
-------------------------------------------------------------------
FUNCTION getLevel
-- Retourne le level courant
(
pCTX IN LOG_CTX -- Context
)
RETURN TLOG.LLEVEL%type
IS
BEGIN
return pCTX.LLEVEL;
end getLevel;
FUNCTION getLevel
RETURN TLOG.LLEVEL%type
IS
generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext;
BEGIN
return getLevel( pCTX => generiqueCTX);
end getLevel;
-------------------------------------------------------------------------
FUNCTION islevelEnabled
-- fonction outil appeler par les is[Debug|Info|Warn|Error]Enabled
(
pCTX IN LOG_CTX, -- Context
pLEVEL IN TLOG.LLEVEL%type -- Level a tester
)
RETURN boolean
IS
BEGIN
if getLevel(pCTX) >= pLEVEL then
return TRUE;
else
return FALSE;
end if;
end islevelEnabled;
FUNCTION islevelEnabled
(
pLEVEL IN TLOG.LLEVEL%type -- Level a tester
)
RETURN boolean
IS
generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext;
BEGIN
return islevelEnabled( pCTX => generiqueCTX, pLEVEL => pLEVEL);
end islevelEnabled;
-------------------------------------------------------------------
FUNCTION isFatalEnabled RETURN boolean is begin return
islevelEnabled(getTextInLevel('FATAL')); end;
FUNCTION isErrorEnabled RETURN boolean is begin return
islevelEnabled(getTextInLevel('ERROR')); end;
FUNCTION isWarnEnabled RETURN boolean is begin return
islevelEnabled(getTextInLevel('WARN')) ; end;
FUNCTION isInfoEnabled RETURN boolean is begin return
islevelEnabled(getTextInLevel('INFO')) ; end;
FUNCTION isDebugEnabled RETURN boolean is begin return
islevelEnabled(getTextInLevel('DEBUG')); end;
FUNCTION isFatalEnabled ( pCTX IN LOG_CTX ) RETURN boolean is begin return
islevelEnabled(pCTX, getTextInLevel('FATAL')); end;
FUNCTION isErrorEnabled ( pCTX IN LOG_CTX ) RETURN boolean is begin return
islevelEnabled(pCTX, getTextInLevel('ERROR')); end;
FUNCTION isWarnEnabled ( pCTX IN LOG_CTX ) RETURN boolean is begin return
islevelEnabled(pCTX, getTextInLevel('WARN')) ; end;
FUNCTION isInfoEnabled ( pCTX IN LOG_CTX ) RETURN boolean is begin return
islevelEnabled(pCTX, getTextInLevel('INFO')) ; end;
FUNCTION isDebugEnabled ( pCTX IN LOG_CTX ) RETURN boolean is begin return
islevelEnabled(pCTX, getTextInLevel('DEBUG')); end;
--------------------------------------------------------------------
PROCEDURE purge
-- Purge de la log
IS
tempLogCtx PLOG.LOG_CTX;
BEGIN
purge(tempLogCtx);
end purge;
--------------------------------------------------------------------
PROCEDURE purge
-- Purge de la log
(
pCTX IN OUT NOCOPY LOG_CTX -- Context
) IS
BEGIN
checkAndInitCTX(pCTX);
execute immediate ('truncate table tlog');
purge(pCTX, sysdate+1);
end purge;
--------------------------------------------------------------------
PROCEDURE purge
-- Purge de la log avec date max
(
pCTX IN OUT NOCOPY LOG_CTX , -- Context
DateMax IN Date -- Tout les
enregistrements supperieur a
-- la date sont purg�
) IS
tempLogCtx PLOG.LOG_CTX := PLOG.init(pSECTION => 'plog.purge', pLEVEL =>
PLOG.LINFO);
BEGIN
checkAndInitCTX(pCTX);
delete from tlog where ldate < DateMax;
INFO(tempLogCtx, 'Purge by user:'||USER);
end purge;
--------------------------------------------------------------------
PROCEDURE log
(
pCTX IN OUT NOCOPY LOG_CTX , -- Context
pLEVEL IN TLOG.LLEVEL%type , -- log level
pTEXTE IN TLOG.LTEXTE%type default DEFAULTEXTMESS -- log text
) IS
lId TLOG.ID%type ;
lLSECTION TLOG.LSECTION%type := getSection(pCTX);
lLHSECS TLOG.LHSECS%type ;
m varchar2(100);
BEGIN
checkAndInitCTX(pCTX);
IF pLEVEL > getLevel(pCTX) THEN
RETURN;
END IF;
lId := getNextID(pCTX);
select HSECS into lLHSECS from V$TIMER;
log ( pCTX =>pCTX,
pID =>lId,
pLDate =>sysdate,
pLHSECS =>lLHSECS,
pLLEVEL =>pLEVEL,
pLSECTION =>lLSECTION,
pLUSER =>user,
pLTEXTE =>pTEXTE
);
end log;
PROCEDURE log
(
pCTX IN OUT NOCOPY LOG_CTX , -- Context
pLEVEL IN TLOGLEVEL.LCODE%type , -- log level
pTEXTE IN TLOG.LTEXTE%type default DEFAULTEXTMESS -- log text
) IS
BEGIN
LOG(pLEVEL => getTextInLevel(pLEVEL), pCTX => pCTX, pTEXTE => pTEXTE);
end log;
PROCEDURE log
(
pLEVEL IN TLOG.LLEVEL%type , -- log level
pTEXTE IN TLOG.LTEXTE%type default DEFAULTEXTMESS -- log text
) IS
generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext;
BEGIN
LOG(pLEVEL => pLEVEL, pCTX => generiqueCTX, pTEXTE => pTEXTE);
end log;
PROCEDURE log
(
pLEVEL IN TLOGLEVEL.LCODE%type , -- log level
pTEXTE IN TLOG.LTEXTE%type default DEFAULTEXTMESS -- log text
) IS
BEGIN
LOG(pLEVEL => getTextInLevel(pLEVEL), pTEXTE => pTEXTE);
end log;
--------------------------------------------------------------------
PROCEDURE debug
(
pCTX IN OUT NOCOPY LOG_CTX , -- Context
pTEXTE IN TLOG.LTEXTE%type default null -- log text
) IS
BEGIN
LOG(pLEVEL => getTextInLevel('DEBUG'), pCTX => pCTX, pTEXTE => pTEXTE);
end debug;
PROCEDURE debug
(
pTEXTE IN TLOG.LTEXTE%type default null -- log text
) IS
BEGIN
LOG(pLEVEL => getTextInLevel('DEBUG'), pTEXTE => pTEXTE);
end debug;
--------------------------------------------------------------------
PROCEDURE info
(
pCTX IN OUT NOCOPY LOG_CTX , -- Context
pTEXTE IN TLOG.LTEXTE%type default null -- log text
) IS
BEGIN
LOG(pLEVEL => getTextInLevel('INFO'), pCTX => pCTX, pTEXTE => pTEXTE);
end info;
PROCEDURE info
(
pTEXTE IN TLOG.LTEXTE%type default null -- log text
) IS
BEGIN
LOG(pLEVEL => getTextInLevel('INFO'), pTEXTE => pTEXTE);
end info;
--------------------------------------------------------------------
PROCEDURE warn
(
pCTX IN OUT NOCOPY LOG_CTX , -- Context
pTEXTE IN TLOG.LTEXTE%type default null -- log text
) IS
BEGIN
LOG(pLEVEL => getTextInLevel('WARN'), pCTX => pCTX, pTEXTE => pTEXTE);
end warn;
PROCEDURE warn
(
pTEXTE IN TLOG.LTEXTE%type default null -- log text
) IS
BEGIN
LOG(pLEVEL => getTextInLevel('WARN'), pTEXTE => pTEXTE);
end warn;
--------------------------------------------------------------------
PROCEDURE error
(
pCTX IN OUT NOCOPY LOG_CTX , -- Context
pTEXTE IN TLOG.LTEXTE%type default null -- log text
) IS
BEGIN
LOG(pLEVEL => getTextInLevel('ERROR'), pCTX => pCTX, pTEXTE => pTEXTE);
end error;
PROCEDURE error
(
pTEXTE IN TLOG.LTEXTE%type default null -- log text
) IS
BEGIN
LOG(pLEVEL => getTextInLevel('ERROR'), pTEXTE => pTEXTE);
end error;
--------------------------------------------------------------------
PROCEDURE fatal
(
pCTX IN OUT NOCOPY LOG_CTX , -- Context
pTEXTE IN TLOG.LTEXTE%type default null -- log text
) IS
BEGIN
LOG(pLEVEL => getTextInLevel('FATAL'), pCTX => pCTX, pTEXTE => pTEXTE);
end fatal;
PROCEDURE fatal
(
pTEXTE IN TLOG.LTEXTE%type default null -- log text
) IS
BEGIN
LOG(pLEVEL => getTextInLevel('FATAL'), pTEXTE => pTEXTE);
end fatal;
--------------------------------------------------------------------
PROCEDURE assert (
pCTX IN OUT NOCOPY LOG_CTX , -- Context
pCONDITION IN BOOLEAN , -- error
condition
pLogErrorMessageIfFALSE IN VARCHAR2 default 'assert condition error' , -- message
if pCondition is true
pLogErrorCodeIfFALSE IN NUMBER default -20000 , -- error
code is pCondition is true range -20000 .. -20999
pRaiseExceptionIfFALSE IN BOOLEAN default FALSE , -- if true
raise pException_in if pCondition is true
pLogErrorReplaceError in BOOLEAN default FALSE -- TRUE,
the error is placed on the stack of previous errors.
-- If FALSE
(the default), the error replaces all previous errors
-- see
Oracle Documentation RAISE_APPLICATION_ERROR
)
IS
BEGIN
checkAndInitCTX(pCTX);
IF not islevelEnabled(pCTX, PLOGPARAM.DEFAULT_ASSET_LEVEL) then
RETURN;
END IF;
IF NOT pCONDITION THEN
LOG (pLEVEL => PLOGPARAM.DEFAULT_ASSET_LEVEL, pCTX => pCTX, pTEXTE =>
'AAS'||pLogErrorCodeIfFALSE||': '||pLogErrorMessageIfFALSE);
IF pRaiseExceptionIfFALSE THEN
raise_application_error(pLogErrorCodeIfFALSE, pLogErrorMessageIfFALSE,
pLogErrorReplaceError);
END IF;
END IF;
END assert;
PROCEDURE assert (
pCONDITION IN BOOLEAN , -- error
condition
pLogErrorMessageIfFALSE IN VARCHAR2 default 'assert condition error' , -- message
if pCondition is true
pLogErrorCodeIfFALSE IN NUMBER default -20000 , -- error
code is pCondition is true range -20000 .. -20999
pRaiseExceptionIfFALSE IN BOOLEAN default FALSE , -- if true
raise pException_in if pCondition is true
pLogErrorReplaceError in BOOLEAN default FALSE -- TRUE,
the error is placed on the stack of previous errors.
-- If FALSE
(the default), the error replaces all previous errors
-- see
Oracle Documentation RAISE_APPLICATION_ERROR
)
IS
generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext;
BEGIN
assert (
pCTX => generiqueCTX,
pCONDITION => pCONDITION,
pLogErrorCodeIfFALSE => pLogErrorCodeIfFALSE,
pLogErrorMessageIfFALSE => pLogErrorMessageIfFALSE,
pRaiseExceptionIfFALSE => pRaiseExceptionIfFALSE,
pLogErrorReplaceError => pLogErrorReplaceError );
END assert ;
--------------------------------------------------------------------
PROCEDURE full_call_stack
IS
generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext;
BEGIN
full_call_stack (Pctx => generiqueCTX);
END full_call_stack;
PROCEDURE full_call_stack (
pCTX IN OUT NOCOPY LOG_CTX -- Context
)
IS
BEGIN
checkAndInitCTX(pCTX);
LOG (pLEVEL => PLOGPARAM.DEFAULT_FULL_CALL_STACK_LEVEL, pCTX => pCTX, pTEXTE =>
dbms_utility.format_call_stack );
END full_call_stack;
--------------------------------------------------------------------
FUNCTION getLOG4PLSQVersion return varchar2
IS
begin
return LOG4PLSQL_VERSION;
end getLOG4PLSQVersion;
--------------------------------------------------------------------
FUNCTION getLevelInText (
pLevel TLOG.LLEVEL%type default PLOGPARAM.DEFAULT_LEVEL
) return varchar2
IS
ret varchar2(1000);
BEGIN
SELECT LCODE into ret
FROM TLOGLEVEL
WHERE LLEVEL = pLevel;
RETURN ret;
EXCEPTION
WHEN OTHERS THEN
return 'UNDEFINED';
END getLevelInText;
--------------------------------------------------------------------
FUNCTION getTextInLevel (
pCode TLOGLEVEL.LCODE%type
) return TLOG.LLEVEL%type
IS
ret TLOG.LLEVEL%type ;
BEGIN
SELECT LLEVEL into ret
FROM TLOGLEVEL
WHERE LCODE = pCode;
RETURN ret;
EXCEPTION
WHEN OTHERS THEN
return PLOGPARAM.DEFAULT_LEVEL;
END getTextInLevel;
FUNCTION getDBMS_PIPE_NAME
(
pCTX IN OUT NOCOPY LOG_CTX -- Context
)
RETURN varchar2
IS
BEGIN
return pCTX.DBMS_PIPE_NAME;
END getDBMS_PIPE_NAME;
FUNCTION getDBMS_PIPE_NAME
RETURN varchar2
IS
generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext;
BEGIN
return getDBMS_PIPE_NAME( pCTX => generiqueCTX);
end getDBMS_PIPE_NAME;
PROCEDURE setDBMS_PIPE_NAME
(
pCTX IN OUT NOCOPY LOG_CTX , -- Context
inDBMS_PIPE_NAME IN VARCHAR2
)
IS
BEGIN
pCTX.DBMS_PIPE_NAME := inDBMS_PIPE_NAME;
END setDBMS_PIPE_NAME;
--------------------------------------------------------------------
--------------------------------------------------------------------
END PLOG;
/
sho error
-------------------------------------------------------------------
-- End of document
-------------------------------------------------------------------
create or replace function fct_test_log return number
is
pCTX PLOG.LOG_CTX := PLOG.init(null, PLOG.LDEBUG, TRUE, TRUE);
begin
PLOG.debug (pCTX, 'message for debug');
PLOG.info (pCTX, 'message for information');
PLOG.warn (pCTX, 'message for warning ');
PLOG.error (pCTX, 'message for error');
PLOG.fatal (pCTX, 'message for fatal');
return 0;
end fct_test_log;
/
sho error
create or replace procedure proc_test_log
is
pCTX PLOG.LOG_CTX := PLOG.init(null, PLOG.LDEBUG, TRUE, TRUE);
temp number;
begin
temp := fct_test_log;
PLOG.debug (pCTX, 'message for debug');
PLOG.info (pCTX, 'message for information');
PLOG.warn (pCTX, 'message for warning ');
PLOG.error (pCTX, 'message for error');
PLOG.fatal (pCTX, 'message for fatal');
end proc_test_log;
/
sho error
create or replace procedure proc_test_log2 (pCTX in out PLOG.LOG_CTX)
is
begin
PLOG.error (pCTX, 'in sub section');
end proc_test_log2;
/
sho error
declare
pCTX PLOG.LOG_CTX := PLOG.init(null, PLOG.LDEBUG, TRUE, TRUE);
begin
PLOG.SetBeginSection (pCTX, 'codePart1');
PLOG.debug (pCTX, 'message for debug');
PLOG.info (pCTX, 'message for information');
PLOG.warn (pCTX, 'message for warning ');
PLOG.error (pCTX, 'message for error');
PLOG.fatal (pCTX, 'message for fatal');
PLOG.SetBeginSection (pCTX, 'codePart2');
PLOG.info (pCTX, 'information message');
PLOG.SetEndSection (pCTX);
proc_test_log;
PLOG.SetBeginSection (pCTX, 'call->proc_test_log');
proc_test_log2 (pCTX);
PLOG.SetEndSection (pCTX);
End;
/
/* No result un SQLPUS.
but in backgroundProcess output
E:\GGM\perso\log4plsql\Log4plsql\cmd>setlocal
E:\GGM\perso\log4plsql\Log4plsql\cmd>call setVariable.bat
variable setup
2003-06-07 01:39:27,878 INFO (backgroundProcess) Start
[ ][main][ Run.java:59]
2003-06-07 01:39:27,888 DEBUG (backgroundProcess) log4plsql.properties :
.\properties\log4plsql.xml [ ][main][ Run.java:60]
2003-06-07 01:39:27,888 DEBUG (backgroundProcess) log4j.properties :
.\\properties\\log4j.properties [ ][main][
Run.java:61]
2003-06-07 01:39:27,898 DEBUG (ReaderDBThread) ReaderLogDataBase : Connect
[ ][main][ReaderThread.java:38]
2003-06-07 01:39:29,481 DEBUG (ReaderDBThread) begin loop
[ ][Thread-0][ReaderThread.java:52]
2003-06-07 01:39:38,784 DEBUG (log4plsql.SCOTT.block.codePart1) message for debug
[DatabaseLoginDate:07 juin 2003 01:39:38: 30][Thread-0][
?:?]
2003-06-07 01:39:38,834 INFO (log4plsql.SCOTT.block.codePart1) message for
information [DatabaseLoginDate:07 juin 2003
01:39:38: 30][Thread-0][ ?:?]
2003-06-07 01:39:38,874 WARN (log4plsql.SCOTT.block.codePart1) message for warning
[DatabaseLoginDate:07 juin 2003 01:39:38:
31][Thread-0][ ?:?]
2003-06-07 01:39:38,924 ERROR (log4plsql.SCOTT.block.codePart1) message for error
[DatabaseLoginDate:07 juin 2003 01:39:38: 31][Thread-0][
?:?]
2003-06-07 01:39:38,954 FATAL (log4plsql.SCOTT.block.codePart1) message for fatal
[DatabaseLoginDate:07 juin 2003 01:39:38: 31][Thread-0][
?:?]
2003-06-07 01:39:39,004 INFO (log4plsql.SCOTT.block.codePart1.codePart2) information
message [DatabaseLoginDate:07 juin 2003 01:39:38:
31][Thread-0][ ?:?]
2003-06-07 01:39:39,034 DEBUG
(log4plsql.SCOTT.block.SCOTT.PROC_TEST_LOG.SCOTT.FCT_TEST_LOG) message for debug
[DatabaseLoginDate:07 juin 2003 01:39:38: 31][Thread-0][
?:?]
2003-06-07 01:39:39,074 INFO
(log4plsql.SCOTT.block.SCOTT.PROC_TEST_LOG.SCOTT.FCT_TEST_LOG) message for information
[DatabaseLoginDate:07 juin 2003 01:39:38:
31][Thread-0][ ?:?]
2003-06-07 01:39:39,104 WARN
(log4plsql.SCOTT.block.SCOTT.PROC_TEST_LOG.SCOTT.FCT_TEST_LOG) message for warning
[DatabaseLoginDate:07 juin 2003 01:39:38:
31][Thread-0][ ?:?]
2003-06-07 01:39:39,135 ERROR
(log4plsql.SCOTT.block.SCOTT.PROC_TEST_LOG.SCOTT.FCT_TEST_LOG) message for error
[DatabaseLoginDate:07 juin 2003 01:39:38: 31][Thread-0][
?:?]
2003-06-07 01:39:39,175 FATAL
(log4plsql.SCOTT.block.SCOTT.PROC_TEST_LOG.SCOTT.FCT_TEST_LOG) message for fatal
[DatabaseLoginDate:07 juin 2003 01:39:38: 32][Thread-0][
?:?]
2003-06-07 01:39:39,315 DEBUG (log4plsql.SCOTT.block.SCOTT.PROC_TEST_LOG) message for
debug [DatabaseLoginDate:07 juin 2003 01:39:38:
32][Thread-0][ ?:?]
2003-06-07 01:39:39,345 INFO (log4plsql.SCOTT.block.SCOTT.PROC_TEST_LOG) message for
information [DatabaseLoginDate:07 juin 2003
01:39:38: 32][Thread-0][ ?:?]
2003-06-07 01:39:39,385 WARN (log4plsql.SCOTT.block.SCOTT.PROC_TEST_LOG) message for
warning [DatabaseLoginDate:07 juin 2003 01:39:38:
32][Thread-0][ ?:?]
2003-06-07 01:39:39,425 ERROR (log4plsql.SCOTT.block.SCOTT.PROC_TEST_LOG) message for
error [DatabaseLoginDate:07 juin 2003 01:39:38:
32][Thread-0][ ?:?]
2003-06-07 01:39:39,455 FATAL (log4plsql.SCOTT.block.SCOTT.PROC_TEST_LOG) message for
fatal [DatabaseLoginDate:07 juin 2003 01:39:38:
32][Thread-0][ ?:?]
2003-06-07 01:39:39,495 ERROR (log4plsql.SCOTT.block.call->proc_test_log) in sub
section [DatabaseLoginDate:07 juin 2003 01:39:38:
32][Thread-0][ ?:?]
*/
create or replace function funcTSec return boolean is
begin
PLOG.error ('error in funcTSec');
return true;
end;
/
create or replace package ptSec is
procedure ptSecPrc;
end;
/
create or replace package body ptSec is
procedure ptSecPrc is
r boolean;
begin
PLOG.error ('error in ptSec');
r := funcTSec;
end;
end;
/
Exec PLOG.purge;
Exec ptSec.ptSecPrc;
select LSECTION||'->'||LTEXTE from tlog;
SQL> select LSECTION||'->'||LTEXTE from tlog;
LSECTION||'->'||LTEXTE
--------------------------------------------------------------------------------
plog.purge->Purge By SCOTT
block.SCOTT.PTSEC->error in ptSec
block.SCOTT.PTSEC.SCOTT.FUNCTSEC->error in funcTSec
create or replace procedure procTSec (cpt number default 0) is
pCTX PLOG.LOG_CTX := PLOG.init(pLEVEL => PLOG.LDEBUG);
begin
PLOG.INFO (pCTX, cpt);
if cpt < 100 then
procTSec ( cpt + 1 );
end if;
end;
/
Exec PLOG.purge;
Exec procTSec;
set linesize 4000
set pagesize 1000
select LTEXTE||'-'||length(LSECTION)||'-'||LSECTION from tlog;
/*
SQL> select LTEXTE||'-'||length(LSECTION)||'-'||LSECTION from tlog;
LTEXTE||'-'||LENGTH(LSECTION)||'-'||LSECTION
Purge by user:SCOTT-10-plog.purge
0-20-block.SCOTT.PROCTSEC
1-35-block.SCOTT.PROCTSEC.SCOTT.PROCTSEC
2-50-block.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC
3-65-block.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC
4-80-block.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC
5-95-block.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC
LTEXTE||'-'||LENGTH(LSECTION)||'-'||LSECTION
6-110-block.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC
7-125-block.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.S
8-140-block.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.S
9-155-block.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.S
10-170-block.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.
11-185-block.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.
12-200-block.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.
LTEXTE||'-'||LENGTH(LSECTION)||'-'||LSECTION
13-215-block.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.
14-230-block.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.
15-245-block.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.
16-260-block.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.
17-275-block.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.
18-290-block.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.
19-305-block.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.
LTEXTE||'-'||LENGTH(LSECTION)||'-'||LSECTION
20-320-block.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.SCOTT.PROCTSEC.
*/
create or replace procedure pts009 is begin PLOG.ERROR ('009'); pts010 ; end;
/
create or replace procedure pts008 is begin PLOG.ERROR ('008'); pts009 ; end;
/
create or replace procedure pts007 is begin PLOG.ERROR ('007'); pts008 ; end;
/
create or replace procedure pts006 is begin PLOG.ERROR ('006'); pts007 ; end;
/
create or replace procedure pts005 is begin PLOG.ERROR ('005'); pts006 ; end;
/
create or replace procedure pts004 is begin PLOG.ERROR ('004'); pts005 ; end;
/
create or replace procedure pts003 is begin PLOG.ERROR ('003'); pts004 ; end;
/
create or replace procedure pts002 is begin PLOG.ERROR ('002'); pts003 ; end;
/
create or replace procedure pts001 is begin PLOG.ERROR ('001'); pts002 ; end;
/
SET SERVEROUTPUT ON SIZE 1000000
set linesize 2000
create or replace procedure pts010
is
ms varchar2(2000);
pCTX PLOG.LOG_CTX := PLOG.INIT ;
begin
PLOG.full_call_stack;
end;
/
Exec PLOG.purge;
Exec pts001 ;
set linesize 4000
select ltexte from tlog;
select lsection from tlog;
/*
SQL>
SQL> create or replace procedure pts009 is begin PLOG.ERROR ('009'); pts010 ; end;
2 /
Proc�dure cr��e.
SQL> create or replace procedure pts008 is begin PLOG.ERROR ('008'); pts009 ; end;
2 /
Proc�dure cr��e.
SQL> create or replace procedure pts007 is begin PLOG.ERROR ('007'); pts008 ; end;
2 /
Proc�dure cr��e.
SQL> create or replace procedure pts006 is begin PLOG.ERROR ('006'); pts007 ; end;
2 /
Proc�dure cr��e.
SQL> create or replace procedure pts005 is begin PLOG.ERROR ('005'); pts006 ; end;
2 /
Proc�dure cr��e.
SQL> create or replace procedure pts004 is begin PLOG.ERROR ('004'); pts005 ; end;
2 /
Proc�dure cr��e.
SQL> create or replace procedure pts003 is begin PLOG.ERROR ('003'); pts004 ; end;
2 /
Proc�dure cr��e.
SQL> create or replace procedure pts002 is begin PLOG.ERROR ('002'); pts003 ; end;
2 /
Proc�dure cr��e.
SQL> create or replace procedure pts001 is begin PLOG.ERROR ('001'); pts002 ; end;
2 /
Proc�dure cr��e.
SQL>
SQL> SET SERVEROUTPUT ON SIZE 1000000
SQL> set linesize 2000
SQL> create or replace procedure pts010
2 is
3 ms varchar2(2000);
4 pCTX PLOG.LOG_CTX := PLOG.INIT ;
5 begin
6 PLOG.full_call_stack;
7 end;
8 /
Proc�dure cr��e.
SQL>
SQL>
SQL> Exec PLOG.purge;
Proc�dure PL/SQL termin�e avec succ�s.
SQL> Exec pts001 ;
Proc�dure PL/SQL termin�e avec succ�s.
SQL>
SQL> set linesize 4000
SQL> select ltexte from tlog;
LTEXTE
Purge By SCOTT
001
002
003
004
005
006
007
008
009
----- PL/SQL Call Stack -----
LTEXTE
object line object
handle number name
7AC91128 962 package body ULOG.PLOG
7AC91128 952 package body ULOG.PLOG
7AB8EAB4 6 procedure SCOTT.PTS010
7AA1F490 1 procedure SCOTT.PTS009
7ABE59F8 1 procedure SCOTT.PTS008
7A7F4AD8 1 procedure SCOTT.PTS007
7AA1D214 1 procedure SCOTT.PTS006
7AA37674 1 procedure SCOTT.PTS005
7A7F1858 1 procedure SCOTT.PTS004
LTEXTE
7A7D5570 1 procedure SCOTT.PTS003
7A7D3918 1 procedure SCOTT.PTS002
7A7CEB80 1 procedure SCOTT.PTS001
7A7C4AE0 1 anonymous block
11 ligne(s) s�lectionn�e(s).
SQL> select lsection from tlog;
LSECTION
plog.purge
block.SCOTT.PTS001
block.SCOTT.PTS001.SCOTT.PTS002
block.SCOTT.PTS001.SCOTT.PTS002.SCOTT.PTS003
block.SCOTT.PTS001.SCOTT.PTS002.SCOTT.PTS003.SCOTT.PTS004
block.SCOTT.PTS001.SCOTT.PTS002.SCOTT.PTS003.SCOTT.PTS004.SCOTT.PTS005
block.SCOTT.PTS001.SCOTT.PTS002.SCOTT.PTS003.SCOTT.PTS004.SCOTT.PTS005.SCOTT.PTS006
block.SCOTT.PTS001.SCOTT.PTS002.SCOTT.PTS003.SCOTT.PTS004.SCOTT.PTS005.SCOTT.PTS006.SCOTT.PTS007
block.SCOTT.PTS001.SCOTT.PTS002.SCOTT.PTS003.SCOTT.PTS004.SCOTT.PTS005.SCOTT.PTS006.SCOTT.PTS007.SCOTT.PTS008
block.SCOTT.PTS001.SCOTT.PTS002.SCOTT.PTS003.SCOTT.PTS004.SCOTT.PTS005.SCOTT.PTS006.SCOTT.PTS007.SCOTT.PTS008.SCOTT.PTS009
block.SCOTT.PTS001.SCOTT.PTS002.SCOTT.PTS003.SCOTT.PTS004.SCOTT.PTS005.SCOTT.PTS006.SCOTT.PTS007.SCOTT.PTS008.SCOTT.PTS009.SCOTT.PTS010
11 ligne(s) s�lectionn�e(s).
SQL>
SQL>
*/
Create or replace package insert_error as
procedure insert_error;
end insert_error;
/
Create or replace package outer_insert_error as
procedure outer_insert_error;
end outer_insert_error;
/
create or replace package body insert_error as
procedure insert_error is
begin
plog.fatal(dbms_utility.format_call_stack);
end insert_error;
end insert_error;
/
create or replace package body outer_insert_error as
procedure outer_insert_error is
begin
insert_error.insert_error();
end outer_insert_error;
end outer_insert_error;
/
Exec PLOG.purge
/
SET SERVEROUTPUT ON
exec outer_insert_error.outer_insert_error();
Select * from vlog
/
set linesize 2000
select LSECTION from tlog;
/*
SQL> Create or replace package insert_error as
2 procedure insert_error;
3 end insert_error;
4 /
Package cr��.
SQL>
SQL> Create or replace package outer_insert_error as
2 procedure outer_insert_error;
3 end outer_insert_error;
4 /
Package cr��.
SQL>
SQL> create or replace package body insert_error as
2 procedure insert_error is
3 begin
4 plog.fatal(dbms_utility.format_call_stack);
5 end insert_error;
6 end insert_error;
7 /
Corps de package cr��.
SQL>
SQL> create or replace package body outer_insert_error as
2 procedure outer_insert_error is
3 begin
4 insert_error.insert_error();
5 end outer_insert_error;
6 end outer_insert_error;
7 /
Corps de package cr��.
SQL>
SQL> Exec PLOG.purge
Proc�dure PL/SQL termin�e avec succ�s.
SQL> /
Corps de package cr��.
SQL>
SQL> SET SERVEROUTPUT ON
SQL> exec outer_insert_error.outer_insert_error();
Proc�dure PL/SQL termin�e avec succ�s.
SQL>
SQL>
SQL>
SQL> Select * from vlog
2 /
LOG
--------------------------------------------------------------------------------
[Fev 27, 20:35:09:87][INFO][SCOTT][plog.purge][Purge by user:SCOTT]
[Fev 27, 20:35:09:21][FATAL][SCOTT][block.SCOTT.OUTER_INSERT_ERROR.SCOTT.INSERT_
ERROR][----- PL/SQL Call Stack -----
object line object
handle number name
668896D4 4 package body SCOTT.INSERT_ERROR
66882068 4 package body SCOTT.OUTER_INSERT_ERROR
6688580C 1 anonymous block
]
SQL>
SQL>
SQL> set linesize 2000
SQL> select LSECTION from tlog;
LSECTION
plog.purge
block.SCOTT.OUTER_INSERT_ERROR.SCOTT.INSERT_ERROR
SQL>
*/