zoukankan      html  css  js  c++  java
  • ORACLE LOG的管理

       1 CREATE OR REPLACE PACKAGE PLOG IS
       2 /**
       3 *  package name : PLOG
       4 *<br/>
       5 *<br/>
       6 *See : <a href="http://log4plsql.sourceforge.net">http://log4plsql.sourceforge.net</a>
       7 *<br/>
       8 *<br/>
       9 *Objectif : Generic tool of log in a Oracle database
      10 *same prototype and functionality that log4j.
      11 *<a href="http://jakarta.apache.org/log4j">http://jakarta.apache.org/log4j </a>
      12 *<br/><br/><br/>
      13 *<b> for exemple and documentation See: http://log4plsql.sourceforge.net/docs/UserGuide.html</b>
      14 *
      15 * Default table of log level
      16 * 1 The OFF has the highest possible rank and is intended to turn off logging. <BR/>
      17 * 2 The FATAL level designates very severe error events that will presumably lead the application to abort.<BR/>
      18 * 3 The ERROR level designates error events that might still allow the application  to continue running.<BR/>
      19 * 4 The WARN level designates potentially harmful situations.<BR/>
      20 * 5 The INFO level designates informational messages that highlight the progress of the application at coarse-grained level.<BR/>
      21 * 6 The DEBUG Level designates fine-grained informational events that are most useful to debug an application.<BR/>
      22 * 7 The ALL has the lowest possible rank and is intended to turn on all logging.<BR/>
      23 *
      24 *
      25 *<br/><br/><br/><br/>
      26 *All data is store in TLOG table<br/>
      27 * ID         number,<br/>
      28 * LDate      DATE default sysdate,<br/>
      29 * LHSECS     number,<br/>
      30 * LLEVEL     number,<br/>
      31 * LSECTION   varchar2(2000),<br/>
      32 * LTEXTE     varchar2(2000),<br/>
      33 * LUSER      VARCHAR2(30),<br/>
      34 * CONSTRAINT pk_TLOG PRIMARY KEY (id)<br/>
      35 *<br/><br/><br/>
      36 *
      37 *
      38 *headcom
      39 *<br/>
      40 *<br/>
      41 *<br/>
      42 *History who               date     comment
      43 *V0     Guillaume Moulard 08-AVR-98 Creation
      44 *V1     Guillaume Moulard 16-AVR-02 Add DBMS_PIPE funtionnality
      45 *V1.1   Guillaume Moulard 16-AVR-02 Increase a date log precision for bench user hundredths of seconds of V$TIMER
      46 *V2.0   Guillaume Moulard 07-MAY-02 Extend call prototype for more by add a default value
      47 *V2.1   Guillaume Moulard 07-MAY-02 optimisation for purge process
      48 *V2.1.1 Guillaume Moulard 22-NOV-02 patch bug length message identify by Lu Cheng
      49 *V2.2   Guillaume Moulard 23-APR-03 use automuns_transaction use Dan Catalin proposition
      50 *V2.3   Guillaume Moulard 30-APR-03 Add is[Debug|Info|Warn|Error]Enabled requested by Dan Catalin
      51 *V2.3.1 jan-pieter        27-JUN-03 supp to_char(to_char line ( line 219 )
      52 *V3     Guillaume Moulard 05-AUG-03 *update default value of PLOGPARAM.DEFAULT_LEVEL -> DEBUG
      53 *                                   *new: log in alert.log, trace file (thank to andreAs for information)
      54 *                                   *new: log with DBMS_OUTPUT (Wait -> SET SERVEROUTPUT ON)
      55 *                                   *new: log full_call_stack
      56 *                                   *upd: now is possible to log in table and in log4j
      57 *                                   *upd: ctx and init funtion parameter.
      58 *                                   *new: getLOG4PLSQVersion return string Version
      59 *                   * use dynamique *upd: create of PLOGPARAM for updatable parameter
      60 *                                   *new: getLevelInText return the text level for one level
      61 *                                   **************************************************************
      62 *                                   I read a very interesting article write by Steven Feuerstein
      63 *                                   - Handling Exceptional Behavior -
      64 *                                   this 2 new features is inspired direcly by this article
      65 *                                   **************************************************************
      66 *                                   * new: assert procedure
      67 *                                   * new: new procedure error prototype from log SQLCODE and SQLERRM
      68 *V3.1   Guillaume Moulard 23-DEC-03 add functions for customize the log level
      69 *V3.1.1 Guillaume Moulard 29-JAN-04 increase perf : propose by Detlef
      70 *V3.1.2 Guillaume Moulard 02-FEV-04 *new: Log4JbackgroundProcess create a thread for each database connexion
      71 *V3.1.2 Guillaume Moulard 02-FEV-04 *new: Log4JbackgroundProcess create a thread for each database connexion
      72 *V3.1.2.1 Guillaume Moulard 12-FEV-04 *BUG: bad version number, bad log with purge and isXxxxEnabled Tx to Pascal  Mwakuye
      73 *V3.1.2.2 Guillaume Moulard 27-FEV-04 *BUG: pbs with call stack
      74 *V3.2     Greg Woolsey      29-MAR-04 add MDC (Mapped Domain Context) Feature
      75 *<br/>
      76 *<br/>
      77 * Copyright (C) LOG4PLSQL project team. All rights reserved.<br/>
      78 *<br/>
      79 * This software is published under the terms of the The LOG4PLSQL <br/>
      80 * Software License, a copy of which has been included with this<br/>
      81 * distribution in the LICENSE.txt file.  <br/>
      82 * see: <http://log4plsql.sourceforge.net>  <br/><br/>
      83 *
      84 */
      85 
      86 -------------------------------------------------------------------
      87 -- Constants (no modification please)
      88 -------------------------------------------------------------------
      89 
      90 NOLEVEL         CONSTANT NUMBER       := -999.99 ;
      91 DEFAULTEXTMESS  CONSTANT VARCHAR2(20) := 'GuillaumeMoulard';
      92 
      93 SUBTYPE        TOPER        IS        VARCHAR2(30);            --    操作员
      94 SUBTYPE        TADDRESS    IS        VARCHAR(30);            --    操作站点
      95 SUBTYPE        TFUNCNO        IS        NUMBER(9);                --    功能编号
      96 SUBTYPE        TERRCODE    IS        NUMBER(9);                --    错误代码
      97 SUBTYPE        TERRMSG        IS        VARCHAR2(255);            --    错误信息
      98 SUBTYPE        TLSTR        IS        VARCHAR2(4000);            --    长字符串类
      99 -------------------------------------------------------------------
     100 -- Constants (tools general parameter)
     101 -- you can update regard your context
     102 -------------------------------------------------------------------
     103 -- in V3 this section is now store in plogparam. Is note necessary for
     104 -- the end user to update this curent package.
     105 
     106 -------------------------------------------------------------------
     107 -- Constants (tools internal parameter)
     108 -------------------------------------------------------------------
     109 
     110 -- The OFF has the highest possible rank and is intended to turn off logging.
     111 LOFF   CONSTANT number := 10 ;
     112 -- The FATAL level designates very severe error events that will presumably lead the application to abort.
     113 LFATAL CONSTANT number := 20 ;
     114 -- The ERROR level designates error events that might still allow the application  to continue running.
     115 LERROR CONSTANT number := 30 ;
     116 -- The WARN level designates potentially harmful situations.
     117 LWARN  CONSTANT number := 40 ;
     118 -- The INFO level designates informational messages that highlight the progress of the application at coarse-grained level.
     119 LINFO  CONSTANT number := 50 ;
     120 -- The DEBUG Level designates fine-grained informational events that are most useful to debug an application.
     121 LDEBUG CONSTANT number := 60 ;
     122 -- The ALL has the lowest possible rank and is intended to turn on all logging.
     123 LALL   CONSTANT number := 70 ;
     124 
     125 
     126 -- raise constante
     127 ERR_CODE_DBMS_PIPE CONSTANT NUMBER        := -20503;
     128 MES_CODE_DBMS_PIPE CONSTANT VARCHAR2(100) := 'error DBMS_PIPE.send_message. return code :';
     129 
     130 -------------------------------------------------------------------
     131 -- Public declaration of package
     132 -------------------------------------------------------------------
     133 TYPE LOG_CTX IS RECORD (                     -- Context de log
     134     isDefaultInit     BOOLEAN default FALSE ,
     135     LLEVEL            TLOG.LLEVEL%type      ,
     136     LSECTION          TLOG.LSECTION%type    ,
     137     LTEXTE            TLOG.LTEXTE%type      ,
     138     USE_LOG4J         BOOLEAN               ,
     139     USE_OUT_TRANS     BOOLEAN               ,
     140     USE_LOGTABLE      BOOLEAN               ,
     141     USE_ALERT         BOOLEAN               ,
     142     USE_TRACE         BOOLEAN               ,
     143     USE_DBMS_OUTPUT   BOOLEAN               ,
     144     INIT_LSECTION     TLOG.LSECTION%type    ,
     145     INIT_LLEVEL       TLOG.LLEVEL%type      ,
     146     DBMS_PIPE_NAME    VARCHAR2(255)         ,
     147     DBMS_OUTPUT_WRAP  PLS_INTEGER
     148 );
     149 
     150 -------------------------------------------------------------------
     151 -- Public Procedure and function
     152 -------------------------------------------------------------------
     153 
     154 /**
     155  For use a log debug level
     156 */
     157 PROCEDURE debug
     158 (
     159     pTEXTE      IN TLOG.LTEXTE%type default null                          -- log text
     160 );
     161 
     162 PROCEDURE debug
     163 (
     164     pCTX        IN OUT NOCOPY LOG_CTX                      ,  -- Context
     165     pTEXTE      IN TLOG.LTEXTE%type default null                          -- log text
     166 );
     167 
     168 PROCEDURE debug
     169 (
     170            i_operator IN TOPER, --操作员代码
     171         i_address  IN TADDRESS, --操作员地址
     172         i_func_no  IN TFUNCNO, --功能号
     173         o_errmsg   IN TLSTR --出错信息
     174 );
     175 
     176 
     177 PROCEDURE info
     178 (
     179            i_operator IN TOPER, --操作员代码
     180         i_address  IN TADDRESS, --操作员地址
     181         i_func_no  IN TFUNCNO, --功能号
     182         o_errmsg   IN TLSTR --出错信息
     183 );
     184 
     185 PROCEDURE warn
     186 (
     187            i_operator IN TOPER, --操作员代码
     188         i_address  IN TADDRESS, --操作员地址
     189         i_func_no  IN TFUNCNO, --功能号
     190         o_errmsg   IN TLSTR --出错信息
     191 );
     192 
     193 PROCEDURE error
     194 (
     195            i_operator IN TOPER, --操作员代码
     196         i_address  IN TADDRESS, --操作员地址
     197         i_func_no  IN TFUNCNO, --功能号
     198         o_errcode  IN TERRCODE,
     199         o_errmsg   IN TLSTR --出错信息
     200 );
     201 
     202 PROCEDURE state
     203 (
     204              i_operator IN TOPER, --操作员代码
     205         i_address  IN TADDRESS, --操作员地址
     206         i_func_no  IN TFUNCNO, --功能号
     207         i_state_code  IN TLSTR,--状态编码
     208         i_state_msg  IN TLSTR--状态信息
     209 );
     210 
     211 PROCEDURE fatal
     212 (
     213            i_operator IN TOPER, --操作员代码
     214         i_address  IN TADDRESS, --操作员地址
     215         i_func_no  IN TFUNCNO, --功能号
     216         o_errcode  OUT TERRCODE,
     217         o_errmsg   OUT TLSTR --出错信息
     218 );
     219 
     220 /**
     221  For use a log info level
     222 */
     223 PROCEDURE info
     224 (
     225     pTEXTE      IN TLOG.LTEXTE%type default null                           -- log text
     226 );
     227 PROCEDURE info
     228 (
     229     pCTX        IN OUT NOCOPY LOG_CTX                      ,  -- Context
     230     pTEXTE      IN TLOG.LTEXTE%type default null                          -- log text
     231 );
     232 
     233 /**
     234  For use a log warning level
     235 */
     236 PROCEDURE warn
     237 (
     238     pTEXTE      IN TLOG.LTEXTE%type default null                           -- log text
     239 );
     240 PROCEDURE warn
     241 (
     242     pCTX        IN OUT NOCOPY LOG_CTX                      ,  -- Context
     243     pTEXTE      IN TLOG.LTEXTE%type default null                          -- log text
     244 );
     245 
     246 /**
     247  For use a log error level
     248  new V3 call without argument or only with one context,  SQLCODE - SQLERRM is log.
     249 */
     250 PROCEDURE error
     251 (
     252     pTEXTE      IN TLOG.LTEXTE%type default null                           -- log text
     253 );
     254 
     255 
     256 PROCEDURE error
     257 (
     258     pCTX        IN OUT NOCOPY LOG_CTX                      ,  -- Context
     259     pTEXTE      IN TLOG.LTEXTE%type default null                          -- log text
     260 );
     261 /**
     262  For use a log fatal level
     263 */
     264 PROCEDURE fatal
     265 (
     266     pTEXTE      IN TLOG.LTEXTE%type default null                         -- log text
     267 );
     268 PROCEDURE fatal
     269 (
     270     pCTX        IN OUT NOCOPY LOG_CTX                      ,  -- Context
     271     pTEXTE      IN TLOG.LTEXTE%type default null                          -- log text
     272 );
     273 
     274 /**
     275  Generique procedure (use only for define your application level DEFINE_APPLICATION_LEVEL=TRUE)
     276 */
     277 
     278 PROCEDURE log
     279 (
     280     pCTX        IN OUT NOCOPY LOG_CTX                      ,  -- Context
     281     pLEVEL      IN TLOG.LLEVEL%type                        ,  -- log level
     282     pTEXTE      IN TLOG.LTEXTE%type default DEFAULTEXTMESS    -- log text
     283 );
     284 PROCEDURE log
     285 (
     286     pCTX        IN OUT NOCOPY LOG_CTX                      ,  -- Context
     287     pLEVEL      IN TLOGLEVEL.LCODE%type                    ,  -- log level
     288     pTEXTE      IN TLOG.LTEXTE%type default DEFAULTEXTMESS    -- log text
     289 );
     290 PROCEDURE log
     291 (
     292     pLEVEL      IN TLOG.LLEVEL%type                        ,  -- log level
     293     pTEXTE      IN TLOG.LTEXTE%type default DEFAULTEXTMESS    -- log text
     294 );
     295 
     296 PROCEDURE log
     297 (
     298     pLEVEL      IN TLOGLEVEL.LCODE%type                        ,  -- log level
     299     pTEXTE      IN TLOG.LTEXTE%type default DEFAULTEXTMESS    -- log text
     300 ) ;
     301 
     302 PROCEDURE scm_log
     303 (
     304     PLEVEL       IN TLOG.LLEVEL%TYPE,  -- log level
     305     i_operator IN TOPER, --操作员代码
     306     i_address  IN TADDRESS, --操作员地址
     307     i_func_no  IN TFUNCNO, --功能号
     308     o_errcode  IN TERRCODE, -- 错误代码
     309     o_errmsg   IN TLSTR --出错信息
     310 );
     311 
     312 /*
     313 context initialisation
     314 *@param pSECTION         default = NULL                            => PLSQL CALL STACK
     315 *@param pLEVEL           default = PLOGPARAM.DEFAULT_LEVEL         -> LDEBUG
     316 *@param pLOG4J           default = PLOGPARAM.DEFAULT_USE_LOG4J     -> FALSE (If true backgroun process is require)
     317 *@param pLOGTABLE        default = PLOGPARAM.DEFAULT_LOG_TABLE     -> TRUE
     318 *@param pOUT_TRANS       default = PLOGPARAM.DEFAULT_LOG_OUT_TRANS -> TRUE
     319 *@param pALERT           default = PLOGPARAM.DEFAULT_LOG_ALERT     -> FALSE
     320 *@param pTRACE           default = PLOGPARAM.DEFAULT_LOG_TRACE     -> FALSE
     321 *@param pDBMS_OUTPUT     default = PLOGPARAM.DEFAULT_DBMS_OUTPUT   -> FALSE
     322 *return new context LOG_CTX
     323 */
     324 FUNCTION init
     325 (
     326     pSECTION          IN       TLOG.LSECTION%type default NULL ,                            -- root of the tree section
     327     pLEVEL            IN       TLOG.LLEVEL%type   default PLOGPARAM.DEFAULT_LEVEL   ,       -- log level (Use only for debug)
     328     pLOG4J            IN       BOOLEAN            default PLOGPARAM.DEFAULT_USE_LOG4J,      -- if true the log is send to log4j
     329     pLOGTABLE         IN       BOOLEAN            default PLOGPARAM.DEFAULT_LOG_TABLE,      -- if true the log is insert into tlog
     330     pOUT_TRANS        IN       BOOLEAN            default PLOGPARAM.DEFAULT_LOG_OUT_TRANS,  -- if true the log is in transactional log
     331     pALERT            IN       BOOLEAN            default PLOGPARAM.DEFAULT_LOG_ALERT,      -- if true the log is write in alert.log
     332     pTRACE            IN       BOOLEAN            default PLOGPARAM.DEFAULT_LOG_TRACE,      -- if true the log is write in trace file
     333     pDBMS_OUTPUT      IN       BOOLEAN            default PLOGPARAM.DEFAULT_DBMS_OUTPUT,    -- if true the log is send in standard output (DBMS_OUTPUT.PUT_LINE)
     334     pDBMS_PIPE_NAME   IN       VARCHAR2           default PLOGPARAM.DEFAULT_DBMS_PIPE_NAME, --
     335     pDBMS_OUTPUT_WRAP IN PLS_INTEGER      default PLOGPARAM.DEFAULT_DBMS_OUTPUT_LINE_WRAP
     336 )
     337 RETURN LOG_CTX;
     338 
     339 
     340 
     341 /**
     342 <B>Sections management</B> : init a new section
     343 */
     344 PROCEDURE setBeginSection
     345 (
     346     pCTX          IN OUT NOCOPY LOG_CTX                        ,  -- Context
     347     pSECTION      IN       TLOG.LSECTION%type                     -- log text
     348 );
     349 
     350 /**
     351 <B>Sections management</B> : get a current section
     352 return  current section
     353 */
     354 FUNCTION getSection
     355 (
     356     pCTX        IN OUT NOCOPY LOG_CTX                      -- Context
     357 )
     358 RETURN TLOG.LSECTION%type;
     359 /**
     360 <B>Sections management</B> : get a default section
     361 *@return  current section
     362 */
     363 FUNCTION getSection
     364 RETURN TLOG.LSECTION%type;
     365 
     366 /**
     367 <B>Sections management</B> : close a Section<BR/>
     368 without pSECTION : clean all section
     369 */
     370 PROCEDURE setEndSection
     371 (
     372     pCTX          IN OUT NOCOPY LOG_CTX                        ,  -- Context
     373     pSECTION      IN       TLOG.LSECTION%type  default 'EndAllSection'  -- log text
     374 );
     375 
     376 
     377 
     378 
     379 
     380 /*
     381 <B>Levels Management</B> : increase level<BR/>
     382  it is possible to dynamically update with setLevell the level of log<BR/>
     383  call of setLevel without paramettre repositions the levels has that specifier <BR/>
     384  in the package<BR/>
     385  erreur possible : -20501, 'Set Level not in LOG predefine constantes'<BR/>
     386 */
     387 PROCEDURE setLevel
     388 (
     389     pCTX          IN OUT NOCOPY LOG_CTX                      ,  -- Context
     390     pLEVEL        IN TLOG.LLEVEL%type default NOLEVEL           -- Higher level to allot dynamically
     391 );
     392 
     393 PROCEDURE setLevel
     394 (
     395     pCTX          IN OUT NOCOPY LOG_CTX                      ,  -- Context
     396     pLEVEL        IN TLOGLEVEL.LCODE%type                       -- Higher level to allot dynamically
     397 );
     398 
     399 /**
     400 <B>Levels Management</B> : Get a current level
     401 */
     402 FUNCTION getLevel
     403 (
     404     pCTX        IN LOG_CTX                      -- Context
     405 )
     406 RETURN TLOG.LLEVEL%type;
     407 
     408 /**
     409 <B>Levels Management</B> : Get a default level
     410 */
     411 FUNCTION getLevel
     412 RETURN TLOG.LLEVEL%type;
     413 
     414 
     415 /**
     416 <B>Levels Management</B> : return true if current level is Debug
     417 */
     418 FUNCTION isDebugEnabled
     419 (
     420     pCTX        IN  LOG_CTX                      -- Context
     421 )
     422 RETURN boolean;
     423 
     424 /**
     425 <B>Levels Management</B> : return true if default level is Debug
     426 */
     427 FUNCTION isDebugEnabled
     428 RETURN boolean;
     429 
     430 
     431 
     432 /**
     433 <B>Levels Management</B> : return true if current level is Info
     434 */
     435 FUNCTION isInfoEnabled
     436 (
     437     pCTX        IN  LOG_CTX                      -- Context
     438 )
     439 RETURN boolean;
     440 
     441 /**
     442 <B>Levels Management</B> : return true if default level is Info
     443 */
     444 FUNCTION isInfoEnabled
     445 RETURN boolean;
     446 
     447 
     448 
     449 /**
     450 <B>Levels Management</B> : return true if current level is Warn
     451 */
     452 FUNCTION isWarnEnabled
     453 (
     454     pCTX        IN  LOG_CTX                      -- Context
     455 )
     456 RETURN boolean;
     457 
     458 /**
     459 <B>Levels Management</B> : return true if default level is Warn
     460 */
     461 FUNCTION isWarnEnabled
     462 RETURN boolean;
     463 
     464 /**
     465 <B>Levels Management</B> : return true if current level is Error
     466 */
     467 FUNCTION isErrorEnabled
     468 (
     469     pCTX        IN LOG_CTX                      -- Context
     470 )
     471 RETURN boolean;
     472 
     473 /**
     474 <B>Levels Management</B> : return true if default level is Error
     475 */
     476 FUNCTION isErrorEnabled
     477 RETURN boolean;
     478 
     479 /**
     480 <B>Levels Management</B> : return true if current level is Fatal
     481 */
     482 FUNCTION isFatalEnabled
     483 (
     484     pCTX        IN LOG_CTX                      -- Context
     485 )
     486 RETURN boolean;
     487 
     488 /**
     489 <B>Levels Management</B> : return true if default level is Fatal
     490 */
     491 FUNCTION isFatalEnabled
     492 RETURN boolean;
     493 
     494 
     495 
     496 /*
     497 <B>Transactional management </B> : define a transaction mode<BR/>
     498 parameter transactional mode <BR/>
     499 TRUE => Log in transaction <BR/>
     500 FALSE => Log out off transaction <BR/>
     501 */
     502 PROCEDURE setTransactionMode
     503 (
     504     pCTX          IN OUT NOCOPY LOG_CTX                      ,  -- Context
     505     inTransaction IN boolean default TRUE                       -- TRUE => Log in transaction
     506                                                                 -- FALSE => Log out off transaction
     507 );
     508 
     509 /**
     510 <B>Transactional management </B> : retun a transaction mode<BR/>
     511 TRUE => Log in transaction <BR/>
     512 FALSE => Log out off transaction <BR/>
     513 */
     514 FUNCTION getTransactionMode
     515 (
     516     pCTX        IN OUT NOCOPY LOG_CTX                      -- Context
     517 )
     518 RETURN boolean;
     519 /**
     520 <B>Transactional management </B> : retun a default transaction mode<BR/>
     521 TRUE => Log in transaction <BR/>
     522 FALSE => Log out off transaction <BR/>
     523 */
     524 FUNCTION getTransactionMode
     525 RETURN boolean;
     526 
     527 
     528 /**
     529 <B>USE_LOG4J management </B> : define a USE_LOG4J destination mode<BR/>
     530 TRUE => Log is send to log4j<BR/>
     531 FALSE => Log is not send to log4j<BR/>
     532 */
     533 PROCEDURE setUSE_LOG4JMode
     534 (
     535     pCTX          IN OUT NOCOPY LOG_CTX                      ,  -- Context
     536     inUSE_LOG4J   IN boolean default TRUE                       -- TRUE => Log is send to USE_LOG4J
     537                                                                 -- FALSE => Log is not send to USE_LOG4J
     538 );
     539 
     540 /**
     541 <B>USE_LOG4J management </B> : retun a USE_LOG4J mode<BR/>
     542 TRUE => Log is send to USE_LOG4J<BR/>
     543 FALSE => Log is not send to USE_LOG4J<BR/>
     544 */
     545 FUNCTION getUSE_LOG4JMode
     546 (
     547     pCTX        IN OUT NOCOPY LOG_CTX                      -- Context
     548 )
     549 RETURN boolean;
     550 /**
     551 <B>USE_LOG4J management </B> : retun a USE_LOG4J mode<BR/>
     552 TRUE => Log is send to USE_LOG4J<BR/>
     553 FALSE => Log is not send to USE_LOG4J<BR/>
     554 */
     555 FUNCTION getUSE_LOG4JMode
     556 RETURN boolean;
     557 
     558 
     559 /**
     560 <B>LOG_TABLE management </B> : define a LOG_TABLE destination mode<BR/>
     561 TRUE => Log is send to LOG_TABLE<BR/>
     562 FALSE => Log is not send to LOG_TABLE<BR/>
     563 */
     564 PROCEDURE setLOG_TABLEMode
     565 (
     566     pCTX          IN OUT NOCOPY LOG_CTX                      ,  -- Context
     567     inLOG_TABLE       IN boolean default TRUE                   -- TRUE => Log is send to LOG_TABLE
     568                                                                 -- FALSE => Log is not send to LOG_TABLE
     569 );
     570 
     571 /**
     572 <B>LOG_TABLE management </B> : retun a LOG_TABLE mode<BR/>
     573 TRUE => Log is send to LOG_TABLE<BR/>
     574 FALSE => Log is not send to LOG_TABLE<BR/>
     575 */
     576 FUNCTION getLOG_TABLEMode
     577 (
     578     pCTX        IN OUT NOCOPY LOG_CTX                      -- Context
     579 )
     580 RETURN boolean;
     581 /**
     582 <B>LOG_TABLE management </B> : retun a LOG_TABLE mode<BR/>
     583 TRUE => Log is send to LOG_TABLE<BR/>
     584 FALSE => Log is not send to LOG_TABLE<BR/>
     585 */
     586 FUNCTION getLOG_TABLEMode
     587 RETURN boolean;
     588 
     589 /**
     590 <B>LOG_ALERT management </B> : define a LOG_ALERT destination mode<BR/>
     591 TRUE => Log is send to LOG_ALERT<BR/>
     592 FALSE => Log is not send to LOG_ALERT<BR/>
     593 */
     594 PROCEDURE setLOG_ALERTMode
     595 (
     596     pCTX          IN OUT NOCOPY LOG_CTX                           ,  -- Context
     597     inLOG_ALERT       IN boolean default TRUE                        -- TRUE => Log is send to LOG_ALERT
     598                                                                      -- FALSE => Log is not send to LOG_ALERT
     599 );
     600 
     601 /**
     602 <B>LOG_ALERT management </B> : retun a LOG_ALERT mode<BR/>
     603 TRUE => Log is send to LOG_ALERT<BR/>
     604 FALSE => Log is not send to LOG_ALERT<BR/>
     605 */
     606 FUNCTION getLOG_ALERTMode
     607 (
     608     pCTX        IN OUT NOCOPY LOG_CTX                      -- Context
     609 )
     610 RETURN boolean;
     611 /**
     612 <B>LOG_ALERT management </B> : retun a LOG_ALERT mode<BR/>
     613 TRUE => Log is send to LOG_ALERT<BR/>
     614 FALSE => Log is not send to LOG_ALERT<BR/>
     615 */
     616 FUNCTION getLOG_ALERTMode
     617 RETURN boolean;
     618 
     619 
     620 /**
     621 <B>LOG_TRACE management </B> : define a LOG_TRACE destination mode<BR/>
     622 TRUE => Log is send to LOG_TRACE<BR/>
     623 FALSE => Log is not send to LOG_TRACE<BR/>
     624 */
     625 PROCEDURE setLOG_TRACEMode
     626 (
     627     pCTX          IN OUT NOCOPY LOG_CTX                           ,  -- Context
     628     inLOG_TRACE       IN boolean default TRUE                        -- TRUE => Log is send to LOG_TRACE
     629                                                                      -- FALSE => Log is not send to LOG_TRACE
     630 );
     631 
     632 /**
     633 <B>LOG_TRACE management </B> : retun a LOG_TRACE mode<BR/>
     634 TRUE => Log is send to LOG_TRACE<BR/>
     635 FALSE => Log is not send to LOG_TRACE<BR/>
     636 */
     637 FUNCTION getLOG_TRACEMode
     638 (
     639     pCTX        IN OUT NOCOPY LOG_CTX                      -- Context
     640 )
     641 RETURN boolean;
     642 /**
     643 <B>LOG_TRACE management </B> : retun a LOG_TRACE mode<BR/>
     644 TRUE => Log is send to LOG_TRACE<BR/>
     645 FALSE => Log is not send to LOG_TRACE<BR/>
     646 */
     647 FUNCTION getLOG_TRACEMode
     648 RETURN boolean;
     649 
     650 
     651 /**
     652 <B>DBMS_OUTPUT management </B> : define a DBMS_OUTPUT destination mode<BR/>
     653 TRUE => Log is send to DBMS_OUTPUT<BR/>
     654 FALSE => Log is not send to DBMS_OUTPUT<BR/>
     655 */
     656 PROCEDURE setDBMS_OUTPUTMode
     657 (
     658     pCTX          IN OUT NOCOPY LOG_CTX                           ,  -- Context
     659     inDBMS_OUTPUT       IN boolean default TRUE                      -- TRUE => Log is send to DBMS_OUTPUT
     660                                                                      -- FALSE => Log is not send to DBMS_OUTPUT
     661 );
     662 
     663 /**
     664 <B>DBMS_OUTPUT management </B> : retun a DBMS_OUTPUT mode<BR/>
     665 TRUE => Log is send to DBMS_OUTPUT<BR/>
     666 FALSE => Log is not send to DBMS_OUTPUT<BR/>
     667 */
     668 FUNCTION getDBMS_OUTPUTMode
     669 (
     670     pCTX        IN OUT NOCOPY LOG_CTX                      -- Context
     671 )
     672 RETURN boolean;
     673 /**
     674 <B>DBMS_OUTPUT management </B> : retun a DBMS_OUTPUT mode<BR/>
     675 TRUE => Log is send to DBMS_OUTPUT<BR/>
     676 FALSE => Log is not send to DBMS_OUTPUT<BR/>
     677 */
     678 FUNCTION getDBMS_OUTPUTMode
     679 RETURN boolean;
     680 
     681 
     682 
     683 /*
     684 <B>assert</B> log a messge is pCondition is FALSE if pRaiseExceptionIfFALSE = TRUE the message is raise<BR/>
     685 *@param     pCTX                     IN OUT NOCOPY LOG_CTX        -> Context
     686 *@param     pCONDITION               IN BOOLEAN                   -> error condition
     687 *@param     pLogErrorMessageIfFALSE  IN VARCHAR2 default 'assert condition error' -> message if pCondition is true
     688 *@param     pLogErrorCodeIfFALSE     IN NUMBER  default -20000    -> error code is pCondition is true range -20000 .. -20999
     689 *@param     pRaiseExceptionIfFALSE   IN BOOLEAN default FALSE     -> if true raise pException_in if pCondition is true
     690 *@param     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)
     691 *return log a messge if pCondition is FALSE. If pRaiseExceptionIfFALSE = TRUE the message is raise
     692 */
     693 PROCEDURE assert (
     694     pCONDITION               IN BOOLEAN                                   , -- error condition
     695     pLogErrorMessageIfFALSE  IN VARCHAR2 default 'assert condition error' , -- message if pCondition is true
     696     pLogErrorCodeIfFALSE     IN NUMBER   default -20000                   , -- error code is pCondition is true range -20000 .. -20999
     697     pRaiseExceptionIfFALSE   IN BOOLEAN  default FALSE                    , -- if true raise pException_in if pCondition is true
     698     pLogErrorReplaceError    in BOOLEAN  default FALSE                      -- TRUE, the error is placed on the stack of previous errors.
     699                                                                            -- If FALSE (the default), the error replaces all previous errors
     700                                                                            -- see Oracle Documentation RAISE_APPLICATION_ERROR
     701 );
     702 /*
     703 <B>assert</B> log a messge is pCondition is FALSE if pRaiseExceptionIfFALSE = TRUE the message is raise<BR/>
     704 *@param     pCTX                     IN OUT NOCOPY LOG_CTX        -> Context
     705 *@param     pCONDITION               IN BOOLEAN                   -> error condition
     706 *@param     pLogErrorMessageIfFALSE  IN VARCHAR2 default 'assert condition error' -> message if pCondition is true
     707 *@param     pLogErrorCodeIfFALSE     IN NUMBER  default -20000    -> error code is pCondition is true range -20000 .. -20999
     708 *@param     pRaiseExceptionIfFALSE   IN BOOLEAN default FALSE     -> if true raise pException_in if pCondition is true
     709 *@param     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)
     710 *return log a messge if pCondition is FALSE. If pRaiseExceptionIfFALSE = TRUE the message is raise
     711 
     712 */
     713 PROCEDURE assert (
     714     pCTX                     IN OUT NOCOPY LOG_CTX                        , -- Context
     715     pCONDITION               IN BOOLEAN                                   , -- error condition
     716     pLogErrorMessageIfFALSE  IN VARCHAR2 default 'assert condition error' , -- message if pCondition is true
     717     pLogErrorCodeIfFALSE     IN NUMBER   default -20000                   , -- error code is pCondition is true range -20000 .. -20999
     718     pRaiseExceptionIfFALSE   IN BOOLEAN  default FALSE                    , -- if true raise pException_in if pCondition is true
     719     pLogErrorReplaceError    in BOOLEAN  default FALSE                      -- TRUE, the error is placed on the stack of previous errors.
     720                                                                            -- If FALSE (the default), the error replaces all previous errors
     721                                                                            -- see Oracle Documentation RAISE_APPLICATION_ERROR
     722 );
     723 
     724 /**
     725 <B>full_call_stack</B> log result of dbms_utility.format_call_stack<BR/>
     726 some time is necessary for debug code.
     727 */
     728 PROCEDURE full_call_stack;
     729 PROCEDURE full_call_stack (
     730     pCTX                     IN OUT NOCOPY LOG_CTX                       -- Context
     731 );
     732 
     733 /*
     734 <B>getLOG4PLSQVersion</B> return a string with a current version<BR/>
     735 */
     736 FUNCTION getLOG4PLSQVersion return varchar2;
     737 
     738 
     739 /*
     740 <B>getLevelInText</B> return a string with a level in send in parameter<BR/>
     741 */
     742 FUNCTION getLevelInText (
     743     pLevel TLOG.LLEVEL%type default PLOGPARAM.DEFAULT_LEVEL
     744 ) return varchar2;
     745 
     746 /*
     747 <B>getTextInLevel</B> return a level with a String in send in parameter<BR/>
     748 */
     749 FUNCTION getTextInLevel (
     750     pCode TLOGLEVEL.LCODE%type
     751 ) return  TLOG.LLEVEL%type ;
     752 
     753 
     754 /*
     755 <B>DBMS_PIPE_NAME management </B>
     756 */
     757 FUNCTION getDBMS_PIPE_NAME
     758 (
     759     pCTX        IN OUT NOCOPY LOG_CTX                      -- Context
     760 )
     761 RETURN varchar2;
     762 
     763 FUNCTION getDBMS_PIPE_NAME
     764 RETURN varchar2;
     765 
     766 
     767 PROCEDURE setDBMS_PIPE_NAME
     768 (
     769     pCTX          IN OUT NOCOPY LOG_CTX                           ,  -- Context
     770     inDBMS_PIPE_NAME IN VARCHAR2
     771 );
     772 
     773 
     774 -------------------------------------------------------------------
     775 --
     776 -------------------------------------------------------------------
     777 /**
     778 <B>admin functionality </B> :  delete rows in table TLOG and commit
     779 */
     780 PROCEDURE purge ;
     781 PROCEDURE purge
     782 (
     783     pCTX          IN OUT NOCOPY LOG_CTX                        -- Context
     784 );
     785 
     786 /**
     787 <B>admin functionality </B> :  delete rows in table TLOG with date max and commit
     788 */
     789 PROCEDURE purge
     790 (
     791     pCTX          IN OUT NOCOPY LOG_CTX                      ,  -- Context
     792     DateMax       IN Date                                       -- All record to old as deleted
     793 );
     794 FUNCTION calleurname return varchar2;
     795 END PLOG;
     796 
     797 
     798 
     799 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     800 CREATE OR REPLACE PACKAGE BODY PLOG IS
     801 -------------------------------------------------------------------
     802 --
     803 --  Nom package        : PLOG
     804 --
     805 --  Objectif           : plog code
     806 --
     807 --  Version            : 3.0
     808 -------------------------------------------------------------------
     809 -- see package spec for history
     810 -------------------------------------------------------------------
     811 
     812 
     813 -------------------------------------------------------------------
     814 -- Variable global priv?au package
     815 -------------------------------------------------------------------
     816 /*
     817  * Copyright (C) LOG4PLSQL project team. All rights reserved.
     818  *
     819  * This software is published under the terms of the The LOG4PLSQL
     820  * Software License, a copy of which has been included with this
     821  * distribution in the LICENSE.txt file.
     822  * see: <http://log4plsql.sourceforge.net>  */
     823 
     824 -------------------------------------------------------------------
     825 
     826 LOG4PLSQL_VERSION  VARCHAR2(200) := '3.1.3.1';
     827 
     828 -------------------------------------------------------------------
     829 -- Code priv?au package
     830 -------------------------------------------------------------------
     831 -------------------------------------------------------------------
     832 
     833 --------------------------------------------------------------------
     834 FUNCTION getNextID
     835 (
     836     pCTX        IN OUT NOCOPY LOG_CTX                      -- Context
     837 ) RETURN TLOG.ID%type
     838 IS
     839     temp number;
     840 BEGIN
     841      select SLOG.nextval into temp from dual;
     842      return temp;
     843 
     844 end getNextID;
     845 
     846 
     847 ----------------------------------------------------------------------
     848 --function instrLast(ch1 varchar2, ch2 varchar2) return number
     849 --is
     850 --ret number := 0;
     851 --begin
     852 --    FOR i IN REVERSE 0..length(Ch1) LOOP
     853 --        if instr(substr(ch1,i),ch2) > 0 then
     854 --           return i;
     855 --        end if;
     856 --    end loop;
     857 --    return ret;
     858 --end;
     859 
     860 --------------------------------------------------------------------
     861 FUNCTION calleurname return varchar2
     862 IS
     863     endOfLine   constant    char(1) := chr(10);
     864     endOfField  constant    char(1) := chr(32);
     865     nbrLine     number;
     866     ptFinLigne  number;
     867     ptDebLigne  number;
     868     ptDebCode   number;
     869     pt1         number;
     870     cpt         number;
     871     linenum     VARCHAR2(4000);
     872     allLines    varchar2(4000);
     873     resultat    varchar2(4000);
     874     Line        varchar2(4000);
     875     UserCode    varchar2(4000);
     876     myName      varchar2(2000) := '.PLOG';
     877     ptLineS      number;
     878     ptLineE      number;
     879 begin
     880     allLines    := dbms_utility.format_call_stack;
     881     cpt         := 2;
     882     ptFinLigne  := length(allLines);
     883     ptDebLigne  := ptFinLigne;
     884 
     885     While ptFinLigne > 0 and ptDebLigne > 83 loop
     886        ptDebLigne   := INSTR (allLines, endOfLine, -1, cpt) + 1 ;
     887        cpt          := cpt + 1;
     888        -- traite ligne
     889        Line         := REGEXP_REPLACE(SUBSTR(allLines, ptDebLigne, ptFinLigne - ptDebLigne),'[[:space:]]+',' ');
     890        ptDebCode    := INSTR (Line, endOfField, -1, 1);
     891        UserCode     := SUBSTR(Line, ptDebCode+1);
     892        ptLineS      := INSTR (Line, endOfField, 1, 1);
     893        ptLineE      := INSTR (Line, endOfField, 1, 2);
     894        --DBMS_OUTPUT.put_line(Line);
     895        --DBMS_OUTPUT.put_line('start:'||ptLineS);
     896        --DBMS_OUTPUT.put_line('end:'||ptLineE);
     897        linenum      := SUBSTR(Line, ptLineS+1,ptLineE - ptLineS - 1);
     898        IF instr(UserCode,myName) = 0 then
     899            IF cpt > 3 then
     900              resultat := resultat||'.';
     901            end IF;
     902            resultat := resultat||UserCode||':'||linenum;
     903        end if;
     904        ptFinLigne := ptDebLigne - 1;
     905      end loop;
     906 
     907 return resultat;
     908 end calleurname;
     909 
     910 
     911 --------------------------------------------------------------------
     912 FUNCTION getDefaultContext
     913 -- Cette fonction est priv? Elle retourne le contexte par default
     914 -- quand il n'est pas pr閏iss?
     915 RETURN LOG_CTX
     916 IS
     917     newCTX      LOG_CTX;
     918     lSECTION    TLOG.LSECTION%type;
     919 BEGIN
     920     lSECTION := calleurname;
     921     newCTX := init (pSECTION => lSECTION);
     922     RETURN newCTX;
     923 END getDefaultContext;
     924 
     925 
     926 
     927 
     928 --------------------------------------------------------------------
     929 PROCEDURE     checkAndInitCTX(
     930     pCTX        IN OUT NOCOPY LOG_CTX                      -- Context
     931 )
     932 IS
     933     lSECTION    TLOG.LSECTION%type;
     934 BEGIN
     935     IF pCTX.isDefaultInit = FALSE THEN
     936         lSECTION := calleurname;
     937         pCTX := init (pSECTION => lSECTION);
     938     END IF;
     939 END;
     940 
     941 
     942 
     943 
     944 --------------------------------------------------------------------
     945 procedure addRow
     946 (
     947   pID         in TLOG.id%type,
     948   pLDate      in TLOG.ldate%type,
     949   pLHSECS     in TLOG.lhsecs%type,
     950   pLLEVEL     in TLOG.llevel%type,
     951   pLSECTION   in TLOG.lsection%type,
     952   pLUSER      in TLOG.luser%type,
     953   pLTEXTE     in TLOG.ltexte%type,
     954   OPER          in TLOG.OPER%TYPE DEFAULT 'SYSTEM',
     955   ADDRESS      in TLOG.ADDRESS%TYPE DEFAULT '127.0.0.1',
     956   FUNC_NO      in TLOG.FUNC_NO%TYPE DEFAULT 0,
     957   ERRCODE      in TLOG.ERRCODE%TYPE DEFAULT 0
     958 )
     959 is
     960 begin
     961         insert into TLOG
     962             (
     963              ID         ,
     964              LDate      ,
     965              LHSECS     ,
     966              LLEVEL     ,
     967              LSECTION   ,
     968              LUSER      ,
     969              LTEXTE     ,
     970              OPER        ,
     971              ADDRESS    ,
     972              FUNC_NO    ,
     973              ERRCODE
     974              ) VALUES (
     975              pID,
     976              pLDate,
     977              pLHSECS,
     978              pLLEVEL,
     979              pLSECTION,
     980              pLUSER,
     981              pLTEXTE,
     982              OPER,
     983              ADDRESS,
     984              FUNC_NO,
     985              ERRCODE
     986             );
     987 end;
     988 
     989 --------------------------------------------------------------------
     990 procedure addRowAutonomous
     991 (
     992   pID         in TLOG.id%type,
     993   pLDate      in TLOG.ldate%type,
     994   pLHSECS     in TLOG.lhsecs%type,
     995   pLLEVEL     in TLOG.llevel%type,
     996   pLSECTION   in TLOG.lsection%type,
     997   pLUSER      in TLOG.luser%type,
     998   pLTEXTE     in TLOG.ltexte%type,
     999   OPER          in TLOG.OPER%TYPE DEFAULT 'SYSTEM',
    1000   ADDRESS      in TLOG.ADDRESS%TYPE DEFAULT '127.0.0.1',
    1001   FUNC_NO      in TLOG.FUNC_NO%TYPE DEFAULT 0,
    1002   ERRCODE      in TLOG.ERRCODE%TYPE DEFAULT 0
    1003 )
    1004 is
    1005 PRAGMA AUTONOMOUS_TRANSACTION;
    1006 begin
    1007  addRow
    1008   (
    1009    pID         => pID,
    1010    pLDate      => pLDate,
    1011    pLHSECS     => pLHSECS,
    1012    pLLEVEL     => pLLEVEL,
    1013    pLSECTION   => pLSECTION,
    1014    pLUSER      => pLUSER,
    1015    pLTEXTE     => pLTEXTE,
    1016    OPER           => OPER,
    1017    ADDRESS       => ADDRESS,
    1018    FUNC_NO       => FUNC_NO,
    1019    ERRCODE       => ERRCODE
    1020   );
    1021   commit;
    1022   exception when others then
    1023       PLOG.ERROR;
    1024       rollback;
    1025       raise;
    1026 end;
    1027 
    1028 /*procedure addLogState
    1029 (
    1030   msg   IN VARCHAR2,
    1031   state IN VARCHAR2
    1032 )
    1033 is
    1034 PRAGMA AUTONOMOUS_TRANSACTION;
    1035 begin
    1036   INSERT INTO ULOG.LOG_STATE(LOG_DATE,LOG_TIME,LOG_EVENT,LOG_STATE)
    1037                       VALUES(TO_CHAR(SYSDATE,'YYYYMMDD'),TO_CHAR(SYSDATE,'HH24:MI:SS'),msg,state);
    1038   commit;
    1039   exception when others then
    1040       PLOG.ERROR;
    1041       rollback;
    1042       raise;
    1043 end;*/
    1044 
    1045 --------------------------------------------------------------------
    1046 PROCEDURE log
    1047 -- procedure priv?pour int間rer les donn閑s dans la table
    1048 -- RAISE : -20503 'error DBMS_PIPE.send_message.
    1049 (
    1050     pCTX        IN OUT NOCOPY LOG_CTX                      ,  -- Context
    1051     pID         IN       TLOG.ID%type                      ,
    1052     pLDate      IN       TLOG.LDATE%type                   ,
    1053     pLHSECS     IN       TLOG.LHSECS%type                  ,
    1054     pLLEVEL     IN       TLOG.LLEVEL%type                  ,
    1055     pLSECTION   IN       TLOG.LSECTION%type                ,
    1056     pLUSER      IN       TLOG.LUSER%type                   ,
    1057     pLTEXTE     IN       TLOG.LTEXTE%type                  ,
    1058     OPER        IN         TLOG.OPER%TYPE    default 'SYSTEM'   ,
    1059     ADDRESS        IN         TLOG.ADDRESS%TYPE default '127.0.0.1',
    1060     FUNC_NO        IN         TLOG.FUNC_NO%TYPE default 0       ,
    1061     ERRCODE        IN         TLOG.ERRCODE%TYPE default 0
    1062 )
    1063 IS
    1064     ret number;
    1065     LLTEXTE TLOG.LTEXTE%type ;
    1066     pt number;
    1067     v_msg_line VARCHAR2(4000);
    1068 BEGIN
    1069 
    1070     IF pCTX.isDefaultInit = FALSE THEN
    1071         plog.error('please is necessary to use plog.init for yours contexte.');
    1072     END IF;
    1073 
    1074     IF PLTEXTE is null then
    1075         LLTEXTE := 'SQLCODE:'||SQLCODE ||' SQLERRM:'||SQLERRM;
    1076     ELSE
    1077         BEGIN
    1078             LLTEXTE := pLTEXTE;
    1079         EXCEPTION
    1080             WHEN VALUE_ERROR THEN
    1081                 ASSERT (pCTX, length(pLTEXTE) <= 2000, 'Log Message id:'||pID||' too long. ');
    1082                 LLTEXTE := substr(pLTEXTE, 0, 2000);
    1083             WHEN OTHERS THEN
    1084                 PLOG.FATAL;
    1085         END;
    1086 
    1087     END IF;
    1088 
    1089     IF pCTX.USE_LOGTABLE = TRUE then
    1090       IF pLLEVEL <> 60 THEN  -- add by ab 20071024
    1091         IF pCTX.USE_OUT_TRANS = FALSE then
    1092                  addRow
    1093                   (
    1094                    pID         => pID,
    1095                    pLDate      => pLDate,
    1096                    pLHSECS     => pLHSECS,
    1097                    pLLEVEL     => pLLEVEL,
    1098                    pLSECTION   => pLSECTION,
    1099                    pLUSER      => pLUSER,
    1100                    pLTEXTE     => LLTEXTE,
    1101                    OPER           => OPER,
    1102                    ADDRESS       => ADDRESS,
    1103                    FUNC_NO       => FUNC_NO,
    1104                    ERRCODE       => ERRCODE
    1105                   );
    1106         ELSE
    1107                  addRowAutonomous
    1108                   (
    1109                    pID         => pID,
    1110                    pLDate      => pLDate,
    1111                    pLHSECS     => pLHSECS,
    1112                    pLLEVEL     => pLLEVEL,
    1113                    pLSECTION   => pLSECTION,
    1114                    pLUSER      => pLUSER,
    1115                    pLTEXTE     => LLTEXTE,
    1116                      OPER           => OPER,
    1117                    ADDRESS       => ADDRESS,
    1118                    FUNC_NO       => FUNC_NO,
    1119                    ERRCODE       => ERRCODE
    1120                   );
    1121         END IF;
    1122       END IF;
    1123     END IF;
    1124 
    1125     IF pCTX.USE_LOG4J = TRUE then
    1126        v_msg_line := pLDATE || MOD(pLHSECS,100) || ' | '
    1127                      || pLLEVEL || ' | '
    1128                      || PLOGPARAM.APP_ID || '|'
    1129                      || CASE WHEN pLLEVEL = 30 AND ERRCODE = 0 THEN '     0000' ELSE LPAD(ERRCODE,9,' ') END || ' | '
    1130                      || LLTEXTE || ' | ';
    1131         /*DBMS_PIPE.pack_message(pID);                    -- SEQUENTIAL ID
    1132         DBMS_PIPE.pack_message(pLDATE);                 -- TIMESTAMP OF LOG STATEMENT
    1133             DBMS_PIPE.pack_message(MOD(pLHSECS,100));       -- HUNDREDTHS OF SECONDS FOR TIMESTAMP
    1134         DBMS_PIPE.pack_message(pLLEVEL);                -- LOG LEVEL
    1135         --|| ' | ' ||PLOGPARAM.APP_ID
    1136         DBMS_PIPE.pack_message(pLSECTION);              -- LOG SECTION - ANALOGUE TO LOG4J Logger NAME
    1137         DBMS_PIPE.pack_message(CASE WHEN pLLEVEL = 30 AND ERRCODE = 0 THEN '     0000' ELSE LPAD(ERRCODE,9,' ') END||' | '||LLTEXTE);                -- LOG MESSAGE
    1138         DBMS_PIPE.pack_message(pLUSER);                 -- CALLING USER
    1139         DBMS_PIPE.pack_message('SAVE_IN_LOG');          -- MESSAGE TYPE?
    1140         --DBMS_PIPE.pack_message(PMDC.getKeyString);      -- MAPPED DOMAIN CONTEXT KEYS FOR LOG4J
    1141         --DBMS_PIPE.pack_message(PMDC.getValueString);    -- MAPPED DOMAIN CONTEXT VALUES FOR LOG4J
    1142         --DBMS_PIPE.pack_message(PMDC.getSeparator);      -- MAPPED DOMAIN CONTEXT SEPARATOR FOR LOG4J
    1143 */
    1144         DBMS_PIPE.PACK_MESSAGE(v_msg_line);
    1145         ret := DBMS_PIPE.send_message(PLOG_UTL.fn_pipe_name);
    1146         IF (RET <> 0) THEN
    1147           raise_application_error(ERR_CODE_DBMS_PIPE, MES_CODE_DBMS_PIPE || RET);
    1148         END IF;
    1149     END IF;
    1150 
    1151     IF pCTX.USE_ALERT = TRUE then
    1152         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);
    1153         sys.dbms_system.ksdwrt(2,substr(LLTEXTE,0,1000));
    1154         if (length(LLTEXTE) >= 1000) then
    1155             sys.dbms_system.ksdwrt(2,substr(LLTEXTE,1000));
    1156         end if;
    1157     END IF;
    1158 
    1159     IF pCTX.USE_TRACE = TRUE then
    1160         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);
    1161         sys.dbms_system.ksdwrt(1,substr(LLTEXTE,0,1000));
    1162         if (length(LLTEXTE) >= 1000) then
    1163             sys.dbms_system.ksdwrt(1,substr(LLTEXTE,1000));
    1164         end if;
    1165     END IF;
    1166 
    1167     IF pCTX.USE_DBMS_OUTPUT = TRUE then
    1168          DECLARE
    1169             pt          number;
    1170             hdr         varchar2(4000);
    1171             hdr_len     pls_integer;
    1172             line_len    pls_integer;
    1173             wrap        number := pCTX.DBMS_OUTPUT_WRAP;   --length to wrap long text.
    1174         BEGIN
    1175             hdr := TO_CHAR(pLDATE, 'HH24:MI:SS')||':'||LTRIM(TO_CHAR(MOD(pLHSECS,100),'09'))||'-'||getLevelInText(pLLEVEL)||'-'||pLSECTION||'  ';
    1176             hdr_len := length(hdr);
    1177             line_len := wrap - hdr_len;
    1178             sys.DBMS_OUTPUT.PUT(hdr);
    1179             pt := 1;
    1180             while pt <= length(LLTEXTE) loop
    1181                 if pt = 1 then
    1182                     sys.DBMS_OUTPUT.PUT_LINE(substr(LLTEXTE,pt,line_len));
    1183                 else
    1184                    sys.DBMS_OUTPUT.PUT_LINE(lpad(' ',hdr_len)||substr(LLTEXTE,pt,line_len));
    1185                 end if;
    1186                 pt := pt + line_len;
    1187             end loop;
    1188         END;
    1189     END IF;
    1190 
    1191 end log;
    1192 
    1193 
    1194 
    1195 -------------------------------------------------------------------
    1196 -------------------------------------------------------------------
    1197 -- Code public du package
    1198 -------------------------------------------------------------------
    1199 -------------------------------------------------------------------
    1200 
    1201 
    1202 --------------------------------------------------------------------
    1203 FUNCTION init
    1204 -- initialisation du contexte
    1205 (
    1206     pSECTION        IN TLOG.LSECTION%type default NULL ,                           -- log section
    1207     pLEVEL          IN TLOG.LLEVEL%type   default PLOGPARAM.DEFAULT_LEVEL   ,      -- log level (Use only for debug)
    1208     pLOG4J          IN BOOLEAN            default PLOGPARAM.DEFAULT_USE_LOG4J,     -- if true the log is send to log4j
    1209     pLOGTABLE       IN BOOLEAN            default PLOGPARAM.DEFAULT_LOG_TABLE,     -- if true the log is insert into tlog
    1210     pOUT_TRANS      IN BOOLEAN            default PLOGPARAM.DEFAULT_LOG_OUT_TRANS, -- if true the log is in transactional log
    1211     pALERT          IN BOOLEAN            default PLOGPARAM.DEFAULT_LOG_ALERT,  -- if true the log is write in alert.log
    1212     pTRACE          IN BOOLEAN            default PLOGPARAM.DEFAULT_LOG_TRACE,     -- if true the log is write in trace file
    1213     pDBMS_OUTPUT    IN BOOLEAN            default PLOGPARAM.DEFAULT_DBMS_OUTPUT,    -- if true the log is send in standard output (DBMS_OUTPUT.PUT_LINE)
    1214     pDBMS_PIPE_NAME IN VARCHAR2           default PLOGPARAM.DEFAULT_DBMS_PIPE_NAME, -- name of pipe to log to for Log4J output
    1215     pDBMS_OUTPUT_WRAP IN PLS_INTEGER      default PLOGPARAM.DEFAULT_DBMS_OUTPUT_LINE_WRAP -- length to wrap output to when using DBMS_OUTPUT
    1216 
    1217 )
    1218 RETURN LOG_CTX
    1219 IS
    1220     pCTX       LOG_CTX;
    1221 BEGIN
    1222 
    1223     pCTX.isDefaultInit   := TRUE;
    1224     pCTX.LSection        := nvl(pSECTION, calleurname);
    1225     pCTX.INIT_LSECTION   := pSECTION;
    1226     pCTX.LLEVEL          := pLEVEL;
    1227     pCTX.INIT_LLEVEL     := pLEVEL;
    1228     pCTX.USE_LOG4J       := pLOG4J;
    1229     pCTX.USE_OUT_TRANS   := pOUT_TRANS;
    1230     pCTX.USE_LOGTABLE    := pLOGTABLE;
    1231     pCTX.USE_ALERT       := pALERT;
    1232     pCTX.USE_TRACE       := pTRACE;
    1233     pCTX.USE_DBMS_OUTPUT := pDBMS_OUTPUT;
    1234     pCTX.DBMS_PIPE_NAME  := pDBMS_PIPE_NAME;
    1235     pCTX.DBMS_OUTPUT_WRAP := pDBMS_OUTPUT_WRAP;
    1236 
    1237     return pCTX;
    1238 end init;
    1239 
    1240 --------------------------------------------------------------------
    1241 PROCEDURE setBeginSection
    1242 -- initialisation d'un debut de niveaux hierarchique de log
    1243 (
    1244     pCTX          IN OUT NOCOPY LOG_CTX                           ,  -- Context
    1245     pSECTION      IN       TLOG.LSECTION%type                        -- Texte du log
    1246 ) IS
    1247 BEGIN
    1248     checkAndInitCTX(pCTX);
    1249     pCTX.LSection := pCTX.LSection||PLOGPARAM.DEFAULT_Section_sep||pSECTION;
    1250 
    1251 end setBeginSection;
    1252 
    1253 --------------------------------------------------------------------
    1254 FUNCTION getSection
    1255 -- renvoie la section en cours
    1256 (
    1257     pCTX        IN OUT NOCOPY LOG_CTX                        -- Context
    1258 )
    1259 RETURN TLOG.LSECTION%type
    1260 IS
    1261 BEGIN
    1262 
    1263     return pCTX.LSection;
    1264 
    1265 end getSection;
    1266 
    1267 
    1268 --------------------------------------------------------------------
    1269 FUNCTION getSection
    1270 -- renvoie la section en cours
    1271 RETURN TLOG.LSECTION%type
    1272 IS
    1273     generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext;
    1274 BEGIN
    1275 
    1276     return getSection(pCTX =>generiqueCTX) ;
    1277 
    1278 end getSection;
    1279 
    1280 
    1281 --------------------------------------------------------------------
    1282 PROCEDURE setEndSection
    1283 -- fin d'un niveau hierarchique de log et dee  tout c'est sup閞ieur
    1284 -- par default [/]
    1285 (
    1286     pCTX          IN OUT NOCOPY LOG_CTX                        ,  -- Context
    1287     pSECTION      IN       TLOG.LSECTION%type  default 'EndAllSection'  -- Texte du log
    1288 ) IS
    1289 BEGIN
    1290     checkAndInitCTX(pCTX);
    1291     if pSECTION = 'EndAllSection' THEN
    1292         pCTX.LSection := nvl(pCTX.INIT_LSECTION, calleurname);
    1293         RETURN;
    1294     END IF;
    1295 
    1296     pCTX.LSection := substr(pCTX.LSection,1,instr(UPPER(pCTX.LSection), UPPER(pSECTION), -1)-2);
    1297 
    1298 
    1299 end setEndSection;
    1300 
    1301 
    1302 
    1303 -------------------------------------------------------------------
    1304 PROCEDURE setTransactionMode
    1305 -- utlisation des log dans ou en dehors des transactions
    1306 -- TRUE => Les log sont dans la transaction
    1307 -- FALSE => les log sont en dehors de la transaction
    1308 (
    1309     pCTX          IN OUT NOCOPY LOG_CTX                      ,  -- Context
    1310     inTransaction IN boolean default TRUE                       -- TRUE => Les log sont dans la transaction,
    1311                                                                 -- FALSE => les log sont en dehors de la transaction
    1312 )
    1313 IS
    1314 BEGIN
    1315     checkAndInitCTX(pCTX);
    1316     pCTX.USE_OUT_TRANS := inTransaction;
    1317 
    1318 end setTransactionMode;
    1319 
    1320 
    1321 -------------------------------------------------------------------
    1322 FUNCTION getTransactionMode
    1323 -- TRUE => Les log sont dans la transaction
    1324 -- FALSE => les log sont en dehors de la transaction
    1325 (
    1326     pCTX        IN OUT NOCOPY LOG_CTX                      -- Context
    1327 )
    1328 RETURN boolean
    1329 IS
    1330 BEGIN
    1331     return pCTX.USE_OUT_TRANS;
    1332 end getTransactionMode;
    1333 -------------------------------------------------------------------
    1334 FUNCTION getTransactionMode
    1335 RETURN boolean
    1336 IS
    1337         generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext;
    1338 BEGIN
    1339     return getTransactionMode(pCTX => generiqueCTX);
    1340 end getTransactionMode;
    1341 
    1342 
    1343 -------------------------------------------------------------------
    1344 PROCEDURE setUSE_LOG4JMode
    1345 --TRUE => Log is send to USE_LOG4J
    1346 --FALSE => Log is not send to USE_LOG4J
    1347 (
    1348     pCTX          IN OUT NOCOPY LOG_CTX                      ,  -- Context
    1349     inUSE_LOG4J IN boolean default TRUE                         -- TRUE => Log is send to USE_LOG4J,
    1350                                                                 -- FALSE => Log is not send to USE_LOG4J
    1351 )
    1352 IS
    1353 BEGIN
    1354     checkAndInitCTX(pCTX);
    1355     pCTX.USE_LOG4J := inUSE_LOG4J;
    1356 
    1357 end setUSE_LOG4JMode;
    1358 
    1359 
    1360 -------------------------------------------------------------------
    1361 FUNCTION getUSE_LOG4JMode
    1362 --TRUE => Log is send to USE_LOG4J
    1363 --FALSE => Log is not send to USE_LOG4J
    1364 (
    1365     pCTX        IN OUT NOCOPY LOG_CTX                      -- Context
    1366 )
    1367 RETURN boolean
    1368 IS
    1369 BEGIN
    1370     return pCTX.USE_LOG4J;
    1371 end getUSE_LOG4JMode;
    1372 -------------------------------------------------------------------
    1373 FUNCTION getUSE_LOG4JMode
    1374 RETURN boolean
    1375 IS
    1376         generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext;
    1377 BEGIN
    1378     return getTransactionMode(pCTX => generiqueCTX);
    1379 end getUSE_LOG4JMode;
    1380 
    1381 
    1382 -------------------------------------------------------------------
    1383 PROCEDURE setLOG_TABLEMode
    1384 --TRUE => Log is send to LOG_TABLEMODE
    1385 --FALSE => Log is not send to LOG_TABLEMODE
    1386 (
    1387     pCTX          IN OUT NOCOPY LOG_CTX                      ,  -- Context
    1388     inLOG_TABLE IN boolean default TRUE                         -- TRUE => Log is send to LOG_TABLEMODE,
    1389                                                                 -- FALSE => Log is not send to LOG_TABLEMODE
    1390 )
    1391 IS
    1392 BEGIN
    1393     checkAndInitCTX(pCTX);
    1394     pCTX.USE_LOGTABLE := inLOG_TABLE;
    1395 
    1396 end setLOG_TABLEMode;
    1397 
    1398 
    1399 -------------------------------------------------------------------
    1400 FUNCTION getLOG_TABLEMode
    1401 --TRUE => Log is send to LOG_TABLEMODE
    1402 --FALSE => Log is not send to LOG_TABLEMODE
    1403 (
    1404     pCTX        IN OUT NOCOPY LOG_CTX                      -- Context
    1405 )
    1406 RETURN boolean
    1407 IS
    1408 BEGIN
    1409     return pCTX.USE_LOGTABLE;
    1410 end getLOG_TABLEMode;
    1411 -------------------------------------------------------------------
    1412 FUNCTION getLOG_TABLEMode
    1413 RETURN boolean
    1414 IS
    1415         generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext;
    1416 BEGIN
    1417     return getTransactionMode(pCTX => generiqueCTX);
    1418 end getLOG_TABLEMode;
    1419 
    1420 
    1421 
    1422 -------------------------------------------------------------------
    1423 PROCEDURE setLOG_ALERTMode
    1424 --TRUE => Log is send to LOG_ALERT
    1425 --FALSE => Log is not send to LOG_ALERT
    1426 (
    1427     pCTX          IN OUT NOCOPY LOG_CTX                      ,  -- Context
    1428     inLOG_ALERT IN boolean default TRUE                         -- TRUE => Log is send to LOG_ALERT,
    1429                                                                 -- FALSE => Log is not send to LOG_ALERT
    1430 )
    1431 IS
    1432 BEGIN
    1433     checkAndInitCTX(pCTX);
    1434     pCTX.USE_ALERT := inLOG_ALERT;
    1435 
    1436 end setLOG_ALERTMode;
    1437 
    1438 
    1439 -------------------------------------------------------------------
    1440 FUNCTION getLOG_ALERTMode
    1441 --TRUE => Log is send to LOG_ALERT
    1442 --FALSE => Log is not send to LOG_ALERT
    1443 (
    1444     pCTX        IN OUT NOCOPY LOG_CTX                      -- Context
    1445 )
    1446 RETURN boolean
    1447 IS
    1448 BEGIN
    1449     return pCTX.USE_ALERT;
    1450 end getLOG_ALERTMode;
    1451 -------------------------------------------------------------------
    1452 FUNCTION getLOG_ALERTMode
    1453 RETURN boolean
    1454 IS
    1455         generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext;
    1456 BEGIN
    1457     return getTransactionMode(pCTX => generiqueCTX);
    1458 end getLOG_ALERTMode;
    1459 
    1460 
    1461 
    1462 -------------------------------------------------------------------
    1463 PROCEDURE setLOG_TRACEMode
    1464 --TRUE => Log is send to LOG_TRACE
    1465 --FALSE => Log is not send to LOG_TRACE
    1466 (
    1467     pCTX          IN OUT NOCOPY LOG_CTX                      ,  -- Context
    1468     inLOG_TRACE IN boolean default TRUE                         -- TRUE => Log is send to LOG_TRACE,
    1469                                                                 -- FALSE => Log is not send to LOG_TRACE
    1470 )
    1471 IS
    1472 BEGIN
    1473     checkAndInitCTX(pCTX);
    1474     pCTX.USE_TRACE := inLOG_TRACE;
    1475 
    1476 end setLOG_TRACEMode;
    1477 
    1478 
    1479 -------------------------------------------------------------------
    1480 FUNCTION getLOG_TRACEMode
    1481 --TRUE => Log is send to LOG_TRACE
    1482 --FALSE => Log is not send to LOG_TRACE
    1483 (
    1484     pCTX        IN OUT NOCOPY LOG_CTX                      -- Context
    1485 )
    1486 RETURN boolean
    1487 IS
    1488 BEGIN
    1489     return pCTX.USE_TRACE;
    1490 end getLOG_TRACEMode;
    1491 -------------------------------------------------------------------
    1492 FUNCTION getLOG_TRACEMode
    1493 RETURN boolean
    1494 IS
    1495         generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext;
    1496 BEGIN
    1497     return getTransactionMode(pCTX => generiqueCTX);
    1498 end getLOG_TRACEMode;
    1499 
    1500 
    1501 -------------------------------------------------------------------
    1502 PROCEDURE setDBMS_OUTPUTMode
    1503 --TRUE => Log is send to DBMS_OUTPUT
    1504 --FALSE => Log is not send to DBMS_OUTPUT
    1505 (
    1506     pCTX          IN OUT NOCOPY LOG_CTX                      ,  -- Context
    1507     inDBMS_OUTPUT IN boolean default TRUE                       -- TRUE => Log is send to DBMS_OUTPUT,
    1508                                                                 -- FALSE => Log is not send to DBMS_OUTPUT
    1509 )
    1510 IS
    1511 BEGIN
    1512     checkAndInitCTX(pCTX);
    1513     pCTX.USE_DBMS_OUTPUT := inDBMS_OUTPUT;
    1514 
    1515 end setDBMS_OUTPUTMode;
    1516 
    1517 
    1518 -------------------------------------------------------------------
    1519 FUNCTION getDBMS_OUTPUTMode
    1520 --TRUE => Log is send to DBMS_OUTPUT
    1521 --FALSE => Log is not send to DBMS_OUTPUT
    1522 (
    1523     pCTX        IN OUT NOCOPY LOG_CTX                      -- Context
    1524 )
    1525 RETURN boolean
    1526 IS
    1527 BEGIN
    1528     checkAndInitCTX(pCTX);
    1529     return pCTX.USE_DBMS_OUTPUT;
    1530 end getDBMS_OUTPUTMode;
    1531 -------------------------------------------------------------------
    1532 FUNCTION getDBMS_OUTPUTMode
    1533 RETURN boolean
    1534 IS
    1535         generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext;
    1536 BEGIN
    1537     return getTransactionMode(pCTX => generiqueCTX);
    1538 end getDBMS_OUTPUTMode;
    1539 
    1540 
    1541 
    1542 
    1543 
    1544 
    1545 
    1546 -------------------------------------------------------------------
    1547 PROCEDURE setLevel
    1548 -- il est possible de modifier avec setLevell  dynamiquement le niveau de log
    1549 -- l'appel de setLevel sans paramettre re-poossitionne le niveaux a celuis specifier
    1550 -- dans le package.
    1551 -- erreur possible : -20501, 'Set Level not in LOG predefine constantes'
    1552 (
    1553     pCTX          IN OUT NOCOPY LOG_CTX                      ,  -- Context
    1554     pLEVEL        IN TLOG.LLEVEL%type   default NOLEVEL         -- Level sup閞ieur attribuer dynamiquement
    1555 ) IS
    1556     nbrl number;
    1557 BEGIN
    1558     checkAndInitCTX(pCTX);
    1559     IF pLEVEL = NOLEVEL then
    1560         pCTX.LLEVEL := pCTX.INIT_LLEVEL;
    1561     END IF;
    1562 
    1563     select count(*) into nbrl FROM TLOGLEVEL where TLOGLEVEL.LLEVEL=pLEVEL;
    1564     IF nbrl > 0 then
    1565         pCTX.LLEVEL := pLEVEL;
    1566     ELSE
    1567         raise_application_error(-20501, 'SetLevel ('||pLEVEL||') not in TLOGLEVEL table');
    1568     END IF;
    1569 EXCEPTION
    1570     WHEN OTHERS THEN
    1571         PLOG.ERROR;
    1572 end setLevel;
    1573 
    1574 PROCEDURE setLevel
    1575 -- il est possible de modifier avec setLevell  dynamiquement le niveau de log
    1576 -- l'appel de setLevel sans paramettre re-poossitionne le niveaux a celuis specifier
    1577 -- dans le package.
    1578 -- erreur possible : -20501, 'Set Level not in LOG predefine constantes'
    1579 (
    1580     pCTX          IN OUT NOCOPY LOG_CTX                      ,  -- Context
    1581     pLEVEL        IN TLOGLEVEL.LCODE%type                       -- Level sup閞ieur attribuer dynamiquement
    1582 ) IS
    1583     nbrl number;
    1584 BEGIN
    1585 
    1586     setLevel (pCTX, getTextInLevel(pLEVEL));
    1587 
    1588 end setLevel;
    1589 
    1590 
    1591 -------------------------------------------------------------------
    1592 FUNCTION getLevel
    1593 -- Retourne le level courant
    1594 (
    1595     pCTX       IN LOG_CTX                      -- Context
    1596 )
    1597 RETURN TLOG.LLEVEL%type
    1598 IS
    1599 BEGIN
    1600     return pCTX.LLEVEL;
    1601 end getLevel;
    1602 
    1603 FUNCTION getLevel
    1604 RETURN TLOG.LLEVEL%type
    1605 IS
    1606     generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext;
    1607 BEGIN
    1608     return getLevel( pCTX => generiqueCTX);
    1609 end getLevel;
    1610 
    1611 
    1612 -------------------------------------------------------------------------
    1613 FUNCTION islevelEnabled
    1614 -- fonction outil appeler par les is[Debug|Info|Warn|Error]Enabled
    1615 (
    1616     pCTX        IN   LOG_CTX,                      -- Context
    1617     pLEVEL       IN TLOG.LLEVEL%type                       -- Level a tester
    1618 )
    1619 RETURN boolean
    1620 IS
    1621 BEGIN
    1622     if getLevel(pCTX) >= pLEVEL then
    1623         return TRUE;
    1624     else
    1625         return FALSE;
    1626     end if;
    1627 end islevelEnabled;
    1628 
    1629 FUNCTION islevelEnabled
    1630 (
    1631     pLEVEL       IN TLOG.LLEVEL%type                       -- Level a tester
    1632 )
    1633 RETURN boolean
    1634 IS
    1635     generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext;
    1636 BEGIN
    1637     return islevelEnabled( pCTX => generiqueCTX, pLEVEL => pLEVEL);
    1638 end islevelEnabled;
    1639 -------------------------------------------------------------------
    1640 FUNCTION isFatalEnabled RETURN boolean is begin return islevelEnabled(getTextInLevel('FATAL')); end;
    1641 FUNCTION isErrorEnabled RETURN boolean is begin return islevelEnabled(getTextInLevel('ERROR')); end;
    1642 FUNCTION isWarnEnabled  RETURN boolean is begin return islevelEnabled(getTextInLevel('WARN')) ; end;
    1643 FUNCTION isInfoEnabled  RETURN boolean is begin return islevelEnabled(getTextInLevel('INFO')) ; end;
    1644 FUNCTION isDebugEnabled RETURN boolean is begin return islevelEnabled(getTextInLevel('DEBUG')); end;
    1645 FUNCTION isFatalEnabled ( pCTX IN LOG_CTX ) RETURN boolean is begin return islevelEnabled(pCTX, getTextInLevel('FATAL')); end;
    1646 FUNCTION isErrorEnabled ( pCTX IN LOG_CTX ) RETURN boolean is begin return islevelEnabled(pCTX, getTextInLevel('ERROR')); end;
    1647 FUNCTION isWarnEnabled  ( pCTX IN LOG_CTX ) RETURN boolean is begin return islevelEnabled(pCTX, getTextInLevel('WARN')) ; end;
    1648 FUNCTION isInfoEnabled  ( pCTX IN LOG_CTX ) RETURN boolean is begin return islevelEnabled(pCTX, getTextInLevel('INFO')) ; end;
    1649 FUNCTION isDebugEnabled ( pCTX IN LOG_CTX ) RETURN boolean is begin return islevelEnabled(pCTX, getTextInLevel('DEBUG')); end;
    1650 
    1651 
    1652 
    1653 --------------------------------------------------------------------
    1654 PROCEDURE purge
    1655 --  Purge de la log
    1656 IS
    1657    tempLogCtx PLOG.LOG_CTX;
    1658 BEGIN
    1659     purge(tempLogCtx);
    1660 end purge;
    1661 --------------------------------------------------------------------
    1662 PROCEDURE purge
    1663 --  Purge de la log
    1664 (
    1665     pCTX          IN OUT NOCOPY LOG_CTX                        -- Context
    1666 ) IS
    1667 BEGIN
    1668     checkAndInitCTX(pCTX);
    1669     execute immediate ('truncate table tlog');
    1670     purge(pCTX, sysdate+1);
    1671 end purge;
    1672 
    1673 
    1674 --------------------------------------------------------------------
    1675 PROCEDURE purge
    1676 --  Purge de la log avec date max
    1677 (
    1678     pCTX          IN OUT NOCOPY LOG_CTX                      ,  -- Context
    1679     DateMax       IN Date                                       -- Tout les enregistrements supperieur a
    1680                                                                 -- la date sont purg?
    1681 
    1682 ) IS
    1683    tempLogCtx  PLOG.LOG_CTX := PLOG.init(pSECTION => 'plog.purge', pLEVEL => PLOG.LINFO);
    1684 BEGIN
    1685    checkAndInitCTX(pCTX);
    1686 
    1687  delete from tlog where ldate < DateMax;
    1688  INFO(tempLogCtx, 'Purge by user:'||USER);
    1689 
    1690 end purge;
    1691 
    1692 
    1693 
    1694 --------------------------------------------------------------------
    1695 PROCEDURE log
    1696 (
    1697     pCTX        IN OUT NOCOPY LOG_CTX                      ,  -- Context
    1698     pLEVEL      IN TLOG.LLEVEL%type                        ,  -- log level
    1699     pTEXTE      IN TLOG.LTEXTE%type default DEFAULTEXTMESS    -- log text
    1700 ) IS
    1701 
    1702      lId        TLOG.ID%type        ;
    1703      lLSECTION  TLOG.LSECTION%type  := getSection(pCTX);
    1704      lLHSECS    TLOG.LHSECS%type                       ;
    1705      m varchar2(100);
    1706 
    1707 BEGIN
    1708     checkAndInitCTX(pCTX);
    1709     IF pLEVEL > getLevel(pCTX) THEN
    1710         RETURN;
    1711     END IF;
    1712     lId := getNextID(pCTX);
    1713 
    1714     log (   pCTX        =>pCTX,
    1715             pID         =>lId,
    1716             pLDate      =>sysdate,
    1717             pLHSECS     =>DBMS_UTILITY.GET_TIME,
    1718             pLLEVEL     =>pLEVEL,
    1719             pLSECTION   =>lLSECTION,
    1720             pLUSER      =>user,
    1721             pLTEXTE     =>pTEXTE
    1722         );
    1723 
    1724 end log;
    1725 
    1726 PROCEDURE log
    1727 (
    1728     pCTX        IN OUT NOCOPY LOG_CTX                      ,  -- Context
    1729     pLEVEL      IN TLOGLEVEL.LCODE%type                    ,  -- log level
    1730     pTEXTE      IN TLOG.LTEXTE%type default DEFAULTEXTMESS    -- log text
    1731 ) IS
    1732 BEGIN
    1733     LOG(pLEVEL => getTextInLevel(pLEVEL), pCTX => pCTX, pTEXTE => pTEXTE);
    1734 end log;
    1735 
    1736 
    1737 PROCEDURE log
    1738 (
    1739     pLEVEL      IN TLOG.LLEVEL%type                        ,  -- log level
    1740     pTEXTE      IN TLOG.LTEXTE%type default DEFAULTEXTMESS    -- log text
    1741 ) IS
    1742    generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext;
    1743 BEGIN
    1744     LOG(pLEVEL => pLEVEL, pCTX => generiqueCTX, pTEXTE => pTEXTE);
    1745 end log;
    1746 
    1747 PROCEDURE log
    1748 (
    1749     pLEVEL      IN TLOGLEVEL.LCODE%type                        ,  -- log level
    1750     pTEXTE      IN TLOG.LTEXTE%type default DEFAULTEXTMESS    -- log text
    1751 ) IS
    1752 BEGIN
    1753     LOG(pLEVEL => getTextInLevel(pLEVEL), pTEXTE => pTEXTE);
    1754 end log;
    1755 
    1756 
    1757 PROCEDURE scm_log
    1758 (
    1759     PLEVEL       IN TLOG.LLEVEL%TYPE,  -- log level
    1760     i_operator IN TOPER, --操作员代码
    1761     i_address  IN TADDRESS, --操作员地址
    1762     i_func_no  IN TFUNCNO, --功能号
    1763     o_errcode  IN TERRCODE , -- 错误代码
    1764     o_errmsg   IN TLSTR --出错信息
    1765 ) IS
    1766      pCTX       PLOG.LOG_CTX := PLOG.getDefaultContext;  -- Context
    1767      lId        TLOG.ID%type        ;
    1768      lLSECTION  TLOG.LSECTION%type  := getSection(pCTX);
    1769      lLHSECS    TLOG.LHSECS%type                       ;
    1770      m varchar2(100);
    1771        v_len       NUMBER;
    1772         v_start     NUMBER;
    1773 BEGIN
    1774 
    1775     checkAndInitCTX(pCTX);
    1776     IF pLEVEL > getLevel(pCTX) THEN
    1777         RETURN;
    1778     END IF;
    1779     lId := getNextID(pCTX);
    1780 
    1781     log (   pCTX        =>pCTX,
    1782             pID         =>lId,
    1783             pLDate      =>sysdate,
    1784             pLHSECS     =>DBMS_UTILITY.GET_TIME,
    1785             pLLEVEL     =>PLEVEL,
    1786             pLSECTION   =>lLSECTION,
    1787             pLUSER      =>user,
    1788             pLTEXTE     =>o_errmsg,
    1789             OPER        =>i_operator,
    1790             ADDRESS        =>i_address,
    1791             FUNC_NO        =>i_func_no,
    1792             ERRCODE        =>o_errcode
    1793         );
    1794       --dbms_output.put_line(o_errmsg);
    1795 
    1796 
    1797 
    1798 
    1799         /*v_len := length(o_errmsg);
    1800         v_start := 1;
    1801 
    1802         WHILE v_len > 0
    1803         LOOP
    1804             dbms_output.put_line(substr(o_errmsg,v_start,250));
    1805             v_start := v_start + 250;
    1806             v_len   := v_len - 250;
    1807         end loop;*/
    1808 
    1809 end scm_log;
    1810 
    1811 --------------------------------------------------------------------
    1812 PROCEDURE debug
    1813 (
    1814     pCTX        IN OUT NOCOPY LOG_CTX                      ,  -- Context
    1815     pTEXTE      IN TLOG.LTEXTE%type default null            -- log text
    1816 ) IS
    1817 BEGIN
    1818     LOG(pLEVEL => getTextInLevel('DEBUG'), pCTX => pCTX, pTEXTE => pTEXTE);
    1819 end debug;
    1820 
    1821 PROCEDURE debug
    1822 (
    1823     pTEXTE      IN TLOG.LTEXTE%type default null    -- log text
    1824 ) IS
    1825 BEGIN
    1826     LOG(pLEVEL => getTextInLevel('DEBUG'), pTEXTE => pTEXTE);
    1827 end debug;
    1828 
    1829 PROCEDURE debug
    1830 (
    1831            i_operator IN TOPER, --操作员代码
    1832         i_address  IN TADDRESS, --操作员地址
    1833         i_func_no  IN TFUNCNO, --功能号
    1834         o_errmsg   IN TLSTR --出错信息
    1835 ) IS
    1836 BEGIN
    1837       scm_log(
    1838             PLEVEL     => LDEBUG,
    1839             i_operator => i_operator,
    1840             i_address  => i_address,
    1841             i_func_no  => i_func_no,
    1842             o_errcode  => 0,
    1843             o_errmsg   => o_errmsg
    1844             );
    1845 
    1846 END debug;
    1847 
    1848 PROCEDURE info
    1849 (
    1850            i_operator IN TOPER, --操作员代码
    1851         i_address  IN TADDRESS, --操作员地址
    1852         i_func_no  IN TFUNCNO, --功能号
    1853         o_errmsg   IN TLSTR --出错信息
    1854 ) IS
    1855 BEGIN
    1856       scm_log(
    1857             PLEVEL     => LINFO,
    1858             i_operator => i_operator,
    1859             i_address  => i_address,
    1860             i_func_no  => i_func_no,
    1861             o_errcode  => 0,
    1862             o_errmsg   => o_errmsg
    1863             );
    1864 
    1865 END info;
    1866 
    1867 PROCEDURE warn
    1868 (
    1869            i_operator IN TOPER, --操作员代码
    1870         i_address  IN TADDRESS, --操作员地址
    1871         i_func_no  IN TFUNCNO, --功能号
    1872         o_errmsg   IN TLSTR --出错信息
    1873 ) IS
    1874 BEGIN
    1875       scm_log(
    1876             PLEVEL     => LWARN,
    1877             i_operator => i_operator,
    1878             i_address  => i_address,
    1879             i_func_no  => i_func_no,
    1880             o_errcode  => 0,
    1881             o_errmsg   => o_errmsg
    1882             );
    1883 END warn;
    1884 
    1885 PROCEDURE error
    1886 (
    1887          i_operator IN TOPER, --操作员代码
    1888         i_address  IN TADDRESS, --操作员地址
    1889         i_func_no  IN TFUNCNO, --功能号
    1890         o_errcode  IN TERRCODE,
    1891         o_errmsg   IN TLSTR --出错信息
    1892 ) IS
    1893 BEGIN
    1894       scm_log(
    1895             PLEVEL     => LERROR,
    1896             i_operator => i_operator,
    1897             i_address  => i_address,
    1898             i_func_no  => i_func_no,
    1899             o_errcode  => o_errcode,
    1900             o_errmsg   => o_errmsg
    1901             );
    1902 END error;
    1903 
    1904 PROCEDURE state
    1905 (
    1906              i_operator IN TOPER, --操作员代码
    1907         i_address  IN TADDRESS, --操作员地址
    1908         i_func_no  IN TFUNCNO, --功能号
    1909         i_state_code  IN TLSTR,--状态编码
    1910         i_state_msg  IN TLSTR--状态信息
    1911 ) IS
    1912 BEGIN
    1913       scm_log(
    1914             PLEVEL     => LERROR,
    1915             i_operator => i_operator,
    1916             i_address  => i_address,
    1917             i_func_no  => i_func_no,
    1918             o_errcode  => 0,
    1919             o_errmsg   => i_state_code || ' | ' || i_state_msg
    1920             );
    1921 END state;
    1922 
    1923 PROCEDURE fatal
    1924 (
    1925           i_operator IN TOPER, --操作员代码
    1926         i_address  IN TADDRESS, --操作员地址
    1927         i_func_no  IN TFUNCNO, --功能号
    1928         o_errcode  OUT TERRCODE,
    1929         o_errmsg   OUT TLSTR --出错信息
    1930 ) IS
    1931   v_errmsg VARCHAR2(4000);
    1932   v_exist INTEGER;
    1933 BEGIN
    1934     o_errcode := ROUND(i_func_no /100,0)*100 + 99;
    1935   o_errcode := CASE WHEN NVL(o_errcode,0) = 0  THEN 99 ELSE o_errcode END;
    1936     v_errmsg  := 'SQLCODE:' || SQLCODE || 'SQLERRM:' || SQLERRM;
    1937     v_errmsg  := v_errmsg || 'ERROR_BACKTRACE:' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE;
    1938       scm_log(
    1939             PLEVEL     => LFATAL,
    1940             i_operator => i_operator,
    1941             i_address  => i_address,
    1942             i_func_no  => i_func_no,
    1943             o_errcode  => o_errcode,
    1944             o_errmsg   => v_errmsg
    1945             );
    1946   o_errmsg := SUBSTR(v_errmsg,1,255);
    1947   IF (SQLCODE = -6508) THEN
    1948      --SELECT COUNT(ROWID) INTO v_exist FROM INTERFACE.TP_WEEKEND;
    1949      --IF (v_exist > 0) THEN
    1950      DBMS_SESSION.RESET_PACKAGE;
    1951      DBMS_SESSION.FREE_UNUSED_USER_MEMORY;
    1952      scm_log(
    1953             PLEVEL     => LFATAL,
    1954             i_operator => i_operator,
    1955             i_address  => i_address,
    1956             i_func_no  => i_func_no,
    1957             o_errcode  => o_errcode,
    1958             o_errmsg   => 'could find program error occur,reset package'
    1959             );
    1960      --END IF;
    1961   END IF;
    1962 END fatal;
    1963 
    1964 --------------------------------------------------------------------
    1965 PROCEDURE info
    1966 (
    1967     pCTX        IN OUT NOCOPY LOG_CTX                      ,  -- Context
    1968     pTEXTE      IN TLOG.LTEXTE%type default null    -- log text
    1969 ) IS
    1970 BEGIN
    1971     LOG(pLEVEL => getTextInLevel('INFO'), pCTX => pCTX,  pTEXTE => pTEXTE);
    1972 end info;
    1973 PROCEDURE info
    1974 (
    1975     pTEXTE      IN TLOG.LTEXTE%type default null    -- log text
    1976 ) IS
    1977 BEGIN
    1978     LOG(pLEVEL => getTextInLevel('INFO'),  pTEXTE => pTEXTE);
    1979 end info;
    1980 
    1981 --------------------------------------------------------------------
    1982 PROCEDURE warn
    1983 (
    1984     pCTX        IN OUT NOCOPY LOG_CTX                      ,  -- Context
    1985     pTEXTE      IN TLOG.LTEXTE%type default null    -- log text
    1986 ) IS
    1987 BEGIN
    1988     LOG(pLEVEL => getTextInLevel('WARN'), pCTX => pCTX,  pTEXTE => pTEXTE);
    1989 end warn;
    1990 PROCEDURE warn
    1991 (
    1992     pTEXTE      IN TLOG.LTEXTE%type default null    -- log text
    1993 ) IS
    1994 BEGIN
    1995     LOG(pLEVEL => getTextInLevel('WARN'),  pTEXTE => pTEXTE);
    1996 end warn;
    1997 
    1998 --------------------------------------------------------------------
    1999 PROCEDURE error
    2000 (
    2001     pCTX        IN OUT NOCOPY LOG_CTX                      ,  -- Context
    2002     pTEXTE      IN TLOG.LTEXTE%type  default null                         -- log text
    2003 ) IS
    2004 BEGIN
    2005     LOG(pLEVEL => getTextInLevel('ERROR'), pCTX => pCTX,  pTEXTE => pTEXTE);
    2006 end error;
    2007 PROCEDURE error
    2008 (
    2009     pTEXTE      IN TLOG.LTEXTE%type  default null                         -- log text
    2010 ) IS
    2011 BEGIN
    2012     LOG(pLEVEL => getTextInLevel('ERROR'),  pTEXTE => pTEXTE);
    2013 end error;
    2014 
    2015 --------------------------------------------------------------------
    2016 PROCEDURE fatal
    2017 (
    2018     pCTX        IN OUT NOCOPY LOG_CTX                      ,  -- Context
    2019     pTEXTE      IN TLOG.LTEXTE%type  default null             -- log text
    2020 ) IS
    2021 BEGIN
    2022     LOG(pLEVEL => getTextInLevel('FATAL'), pCTX => pCTX,  pTEXTE => pTEXTE);
    2023 end fatal;
    2024 
    2025 PROCEDURE fatal
    2026 (
    2027     pTEXTE      IN TLOG.LTEXTE%type default null                          -- log text
    2028 ) IS
    2029 BEGIN
    2030     LOG(pLEVEL => getTextInLevel('FATAL'),  pTEXTE => pTEXTE);
    2031 end fatal;
    2032 
    2033 --------------------------------------------------------------------
    2034 PROCEDURE assert (
    2035     pCTX                     IN OUT NOCOPY LOG_CTX                        , -- Context
    2036     pCONDITION               IN BOOLEAN                                   , -- error condition
    2037     pLogErrorMessageIfFALSE  IN VARCHAR2 default 'assert condition error' , -- message if pCondition is true
    2038     pLogErrorCodeIfFALSE     IN NUMBER   default -20000                   , -- error code is pCondition is true range -20000 .. -20999
    2039     pRaiseExceptionIfFALSE   IN BOOLEAN  default FALSE                    , -- if true raise pException_in if pCondition is true
    2040     pLogErrorReplaceError    in BOOLEAN  default FALSE                      -- TRUE, the error is placed on the stack of previous errors.
    2041                                                                            -- If FALSE (the default), the error replaces all previous errors
    2042                                                                            -- see Oracle Documentation RAISE_APPLICATION_ERROR
    2043 
    2044 )
    2045 IS
    2046 BEGIN
    2047   checkAndInitCTX(pCTX);
    2048   IF not islevelEnabled(pCTX, PLOGPARAM.DEFAULT_ASSET_LEVEL) then
    2049         RETURN;
    2050   END IF;
    2051 
    2052   IF NOT pCONDITION THEN
    2053      LOG (pLEVEL => PLOGPARAM.DEFAULT_ASSET_LEVEL, pCTX => pCTX,  pTEXTE => 'AAS'||pLogErrorCodeIfFALSE||': '||pLogErrorMessageIfFALSE);
    2054      IF pRaiseExceptionIfFALSE THEN
    2055         raise_application_error(pLogErrorCodeIfFALSE, pLogErrorMessageIfFALSE, pLogErrorReplaceError);
    2056      END IF;
    2057   END IF;
    2058 END assert;
    2059 
    2060 
    2061 PROCEDURE assert (
    2062     pCONDITION               IN BOOLEAN                                   , -- error condition
    2063     pLogErrorMessageIfFALSE  IN VARCHAR2 default 'assert condition error' , -- message if pCondition is true
    2064     pLogErrorCodeIfFALSE     IN NUMBER   default -20000                   , -- error code is pCondition is true range -20000 .. -20999
    2065     pRaiseExceptionIfFALSE   IN BOOLEAN  default FALSE                    , -- if true raise pException_in if pCondition is true
    2066     pLogErrorReplaceError    in BOOLEAN  default FALSE                      -- TRUE, the error is placed on the stack of previous errors.
    2067                                                                            -- If FALSE (the default), the error replaces all previous errors
    2068                                                                            -- see Oracle Documentation RAISE_APPLICATION_ERROR
    2069 )
    2070 IS
    2071    generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext;
    2072 BEGIN
    2073 assert (
    2074     pCTX                        => generiqueCTX,
    2075     pCONDITION                  => pCONDITION,
    2076     pLogErrorCodeIfFALSE        => pLogErrorCodeIfFALSE,
    2077     pLogErrorMessageIfFALSE     => pLogErrorMessageIfFALSE,
    2078     pRaiseExceptionIfFALSE      => pRaiseExceptionIfFALSE,
    2079     pLogErrorReplaceError       => pLogErrorReplaceError );
    2080 END assert ;
    2081 
    2082 --------------------------------------------------------------------
    2083 PROCEDURE full_call_stack
    2084 IS
    2085    generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext;
    2086 BEGIN
    2087     full_call_stack (Pctx => generiqueCTX);
    2088 END full_call_stack;
    2089 
    2090 
    2091 PROCEDURE full_call_stack (
    2092     pCTX                     IN OUT NOCOPY LOG_CTX                       -- Context
    2093 )
    2094 IS
    2095 BEGIN
    2096      checkAndInitCTX(pCTX);
    2097      LOG (pLEVEL => PLOGPARAM.DEFAULT_FULL_CALL_STACK_LEVEL, pCTX => pCTX,  pTEXTE => dbms_utility.format_call_stack );
    2098 END full_call_stack;
    2099 
    2100 --------------------------------------------------------------------
    2101 FUNCTION getLOG4PLSQVersion return varchar2
    2102 IS
    2103 begin
    2104 
    2105     return LOG4PLSQL_VERSION;
    2106 
    2107 end getLOG4PLSQVersion;
    2108 
    2109 --------------------------------------------------------------------
    2110 FUNCTION getLevelInText (
    2111     pLevel TLOG.LLEVEL%type default PLOGPARAM.DEFAULT_LEVEL
    2112 ) return  varchar2
    2113 IS
    2114     ret varchar2(1000);
    2115 BEGIN
    2116 
    2117     SELECT LCODE into ret
    2118     FROM TLOGLEVEL
    2119     WHERE LLEVEL = pLevel;
    2120     RETURN ret;
    2121 EXCEPTION
    2122     WHEN OTHERS THEN
    2123         return 'UNDEFINED';
    2124 END getLevelInText;
    2125 
    2126 --------------------------------------------------------------------
    2127 FUNCTION getTextInLevel (
    2128     pCode TLOGLEVEL.LCODE%type
    2129 ) return  TLOG.LLEVEL%type
    2130 IS
    2131     ret TLOG.LLEVEL%type ;
    2132 BEGIN
    2133 
    2134     SELECT LLEVEL into ret
    2135     FROM TLOGLEVEL
    2136     WHERE LCODE = pCode;
    2137     RETURN ret;
    2138 EXCEPTION
    2139     WHEN OTHERS THEN
    2140         return PLOGPARAM.DEFAULT_LEVEL;
    2141 END getTextInLevel;
    2142 
    2143 
    2144 
    2145 FUNCTION getDBMS_PIPE_NAME
    2146 (
    2147     pCTX        IN OUT NOCOPY LOG_CTX                      -- Context
    2148 )
    2149 RETURN varchar2
    2150 IS
    2151 BEGIN
    2152     return pCTX.DBMS_PIPE_NAME;
    2153 END getDBMS_PIPE_NAME;
    2154 
    2155 FUNCTION getDBMS_PIPE_NAME
    2156 RETURN varchar2
    2157 IS
    2158     generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext;
    2159 BEGIN
    2160     return getDBMS_PIPE_NAME( pCTX => generiqueCTX);
    2161 end getDBMS_PIPE_NAME;
    2162 
    2163 
    2164 PROCEDURE setDBMS_PIPE_NAME
    2165 (
    2166     pCTX             IN OUT NOCOPY LOG_CTX          ,  -- Context
    2167     inDBMS_PIPE_NAME IN VARCHAR2
    2168 )
    2169 IS
    2170 BEGIN
    2171     pCTX.DBMS_PIPE_NAME := inDBMS_PIPE_NAME;
    2172 END setDBMS_PIPE_NAME;
    2173 
    2174 --------------------------------------------------------------------
    2175 --------------------------------------------------------------------
    2176 END PLOG;
    View Code

    --PLOGPARAM

     1 CREATE OR REPLACE PACKAGE PLOGPARAM IS
     2 /**
     3 *  package name : PLOGPARAM
     4 *<br/>
     5 *<br/>
     6 *See : <a href="http://log4plsql.sourceforge.net">http://log4plsql.sourceforge.net</a>
     7 *<br/>
     8 *<br/>
     9 *Objectif : Store updatable paramter for PLOG.
    10 *<br/><br/><br/><br/>
    11 * This package is create befort PLOG
    12 *<br/><br/><br/>
    13 *
    14 *
    15 *@headcom
    16 *<br/>
    17 *<br/>
    18 *<br/>
    19 *History who               date     comment
    20 *V3     Guillaume Moulard 05-AUG-03 Creation
    21 *V3.2     Greg Woolsey      29-MAR-04 add MDC (Mapped Domain Context) Feature
    22 *<br/>
    23 *<br/>
    24 * Copyright (C) LOG4PLSQL project team. All rights reserved.<br/>
    25 *<br/>
    26 * This software is published under the terms of the The LOG4PLSQL <br/>
    27 * Software License, a copy of which has been included with this<br/>
    28 * distribution in the LICENSE.txt file.  <br/>
    29 * see: <http://log4plsql.sourceforge.net>  <br/><br/>
    30 *
    31 */
    32 
    33 
    34 
    35 -------------------------------------------------------------------
    36 -- Constants (tools general parameter)
    37 -- you can update regard your context
    38 -------------------------------------------------------------------
    39 
    40 -- LERROR default level for production system.
    41 -- DEFAULT_LEVEL         CONSTANT TLOG.LLEVEL%type     := 30 ; -- LERROR
    42 
    43 APP_ID CONSTANT VARCHAR2(255) := 'bizdb';
    44 -- LDEBUG for developement phase
    45 DEFAULT_LEVEL         CONSTANT TLOG.LLEVEL%type     := 70 ; -- LERROR
    46 
    47 -- TRUE default value for Logging in table
    48 DEFAULT_LOG_TABLE     CONSTANT BOOLEAN              := TRUE;
    49 
    50 -- if DEFAULT_USE_LOG4J is TRUE log4j Log4JbackgroundProcess are necessary
    51 DEFAULT_USE_LOG4J     CONSTANT BOOLEAN              := FALSE;
    52 
    53 -- TRUE default value for Logging out off transactional limits
    54 DEFAULT_LOG_OUT_TRANS CONSTANT BOOLEAN              := TRUE;
    55 
    56 -- if DEFAULT_LOG_ALERTLOG is true the log is write in alert.log file
    57 DEFAULT_LOG_ALERT     CONSTANT BOOLEAN              := FALSE;
    58 
    59 -- if DEFAULT_LOG_TRACE is true the log is write in trace file
    60 DEFAULT_LOG_TRACE     CONSTANT BOOLEAN              := FALSE;
    61 
    62 -- if DEFAULT_DBMS_OUTPUT is true the log is send in standard output (DBMS_OUTPUT.PUT_LINE)
    63 DEFAULT_DBMS_OUTPUT   CONSTANT BOOLEAN              := FALSE;
    64 
    65 
    66 -- default level for asset
    67 DEFAULT_ASSET_LEVEL   CONSTANT TLOG.LLEVEL%type            := DEFAULT_LEVEL ;
    68 
    69 -- default level for call_stack_level
    70 DEFAULT_FULL_CALL_STACK_LEVEL CONSTANT  TLOG.LLEVEL%type   := DEFAULT_LEVEL ;
    71 
    72 -- use for build a string section
    73 DEFAULT_Section_sep CONSTANT TLOG.LSECTION%type := '.';
    74 
    75 -- default PIPE_NAME
    76 DEFAULT_DBMS_PIPE_NAME CONSTANT VARCHAR2(255) := 'LOG_PIPE';
    77 
    78 -- Formats output sent to DBMS_OUTPUT to this width.
    79 DEFAULT_DBMS_OUTPUT_LINE_WRAP  CONSTANT NUMBER := 100;
    80 
    81 END PLOGPARAM;
    View Code

    --PLOG_UTL

      1 CREATE OR REPLACE PACKAGE PLOG_UTL AS
      2   --get oracle database instant name
      3   FUNCTION fn_inst_name RETURN VARCHAR2;
      4   --get oracle database pipe name
      5   FUNCTION fn_pipe_name RETURN VARCHAR2;
      6   --get log file name
      7   FUNCTION fn_log_fname RETURN VARCHAR2;
      8   --write log to pipe
      9   PROCEDURE sp_log;
     10   PROCEDURE sp_open_pipe;
     11   PROCEDURE sp_close_pipe;
     12   --write log file
     13   PROCEDURE sp_write_log_file;
     14   --start job
     15   PROCEDURE sp_start_job(IF_ASYC BOOLEAN);
     16   --stop job
     17   PROCEDURE sp_stop_job(TIME_OUT INT,IF_FORCE BOOLEAN);
     18   --set cancel flag
     19   PROCEDURE sp_set_cancel_flag(i_if_cancel CHAR);
     20 END;
     21 
     22 
     23 
     24 CREATE OR REPLACE PACKAGE BODY PLOG_UTL AS  --get oracle database instant name
     25   FUNCTION fn_inst_name RETURN VARCHAR2
     26   AS
     27     v_instant_name VARCHAR2(255);
     28   BEGIN
     29         SELECT SYS_CONTEXT('USERENV','INSTANCE_NAME') INTO v_instant_name FROM DUAL;
     30         RETURN v_instant_name;
     31   END;
     32   --get oracle database pipe name
     33   FUNCTION fn_pipe_name RETURN VARCHAR2
     34   AS
     35   BEGIN
     36        RETURN 'LOG_PIPE@' || UPPER(fn_inst_name);
     37   END;
     38   --get log file name
     39   FUNCTION fn_log_fname RETURN VARCHAR2
     40   AS
     41    BEGIN
     42         RETURN 'log_' || LOWER(fn_inst_name) || '_' || TO_CHAR(SYSDATE,'YYYYMMDD') || '.log';
     43    END;
     44   /*FUNCTIN fn_plogfile RETURN UTL_FILE.FILE_TYPE
     45   AS
     46   BEGIN
     47 
     48   END; */
     49   --write log to pipe
     50   PROCEDURE sp_log
     51   AS
     52        v_pipe_name VARCHAR2(255);
     53        v_line VARCHAR2(4000);
     54        v_ret_code NUMBER;
     55   BEGIN
     56        v_pipe_name := fn_pipe_name;
     57        --DBMS_OUTPUT.PUT_LINE(v_pipe_name);
     58        FOR i IN 1..100
     59        LOOP
     60            v_line := 'LINE' || i || 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
     61            DBMS_PIPE.PACK_MESSAGE(v_line);
     62            v_ret_code := DBMS_PIPE.SEND_MESSAGE(v_pipe_name);
     63            --DBMS_OUTPUT.PUT_LINE(v_ret_code);
     64        END LOOP;
     65   END;
     66   PROCEDURE sp_open_pipe
     67   AS
     68     v_ret_code NUMBER;
     69   BEGIN
     70     v_ret_code := DBMS_PIPE.CREATE_PIPE(fn_pipe_name);
     71     --DBMS_OUTPUT.PUT_LINE(v_ret_code);
     72   END;
     73   PROCEDURE sp_close_pipe
     74   AS
     75     v_ret_code NUMBER;
     76   BEGIN
     77     v_ret_code := DBMS_PIPE.REMOVE_PIPE(fn_pipe_name);
     78     --DBMS_OUTPUT.PUT_LINE(v_ret_code);
     79   END;
     80   --write log file
     81   PROCEDURE sp_write_log_file
     82   AS
     83     v_dir VARCHAR2(255) := 'TMP';
     84     v_pfile UTL_FILE.FILE_TYPE;
     85     v_line VARCHAR2(4000);
     86     v_pipe_name VARCHAR2(255);
     87     v_ret_code NUMBER;
     88     --v_exit BOOLEAN := FALSE;
     89     v_if_cancel CHAR(1);
     90   BEGIN
     91     v_pipe_name := fn_pipe_name;
     92     --DBMS_OUTPUT.PUT_LINE(fn_pipe_name);
     93     --DBMS_OUTPUT.PUT_LINE(fn_log_fname);
     94     v_pfile := UTL_FILE.FOPEN(v_dir,fn_log_fname,'W',4000);
     95 <<L_LOOP>>
     96     LOOP
     97         v_ret_code := DBMS_PIPE.RECEIVE_MESSAGE(v_pipe_name,1);
     98         --DBMS_OUTPUT.PUT_LINE('RECEIVE MESSAGE'||v_ret_code);
     99         IF (v_ret_code = 1) THEN
    100            SELECT IF_CANCEL INTO v_if_cancel FROM TLOG_INFO
    101            WHERE INST_NAME = fn_inst_name;
    102            IF (v_if_cancel = '1') THEN
    103               --DBMS_OUTPUT.PUT_LINE('CANCEL RECEIVE'||v_ret_code);
    104               EXIT;
    105            END IF;
    106            --DBMS_OUTPUT.PUT_LINE('LOOP RECEIVE MESSAGE'||v_ret_code);
    107            UTL_FILE.FFLUSH(v_pfile);
    108            GOTO L_LOOP;
    109         END IF;
    110         --DBMS_LOCK.SLEEP(5);
    111         --DBMS_OUTPUT.PUT_LINE('UNPACK MESSAGE'||v_ret_code);
    112         DBMS_PIPE.UNPACK_MESSAGE(v_line);
    113         DBMS_OUTPUT.PUT_LINE(v_line);
    114         UTL_FILE.PUT_LINE(v_pfile,v_line);
    115     END LOOP;
    116     UTL_FILE.FFLUSH(v_pfile);
    117     UTL_FILE.FCLOSE(v_pfile);
    118   END;
    119   --set cancel status
    120   PROCEDURE sp_set_cancel_flag(i_if_cancel CHAR)
    121   AS
    122     PRAGMA AUTONOMOUS_TRANSACTION;
    123     v_if_cancel CHAR(1);
    124   BEGIN
    125     DBMS_OUTPUT.PUT_LINE('SET IF_CANCLE:'||i_if_cancel);
    126     UPDATE TLOG_INFO SET IF_CANCEL = i_if_cancel
    127     WHERE INST_NAME = fn_inst_name
    128     RETURNING IF_CANCEL INTO v_if_cancel;
    129     DBMS_OUTPUT.PUT_LINE('IF_CANCLE:'||v_if_cancel);
    130     COMMIT;
    131   EXCEPTION
    132     WHEN OTHERS THEN
    133       ROLLBACK;
    134       RAISE;
    135   END;
    136   --start job
    137   PROCEDURE sp_start_job(IF_ASYC BOOLEAN)
    138   AS
    139     v_exist INTEGER;
    140   BEGIN
    141     --若JOB不存在则创建JOB
    142     SELECT COUNT(*) INTO v_exist FROM ALL_SCHEDULER_JOBS WHERE JOB_NAME = 'LOG_JOB';
    143     DBMS_OUTPUT.PUT_LINE('EXIT:'||v_exist);
    144     IF (v_exist = 0) THEN
    145        DBMS_SCHEDULER.CREATE_JOB('LOG_JOB','STORED_PROCEDURE','plog_utl.sp_write_log_file',0,NULL,NULL,NULL,'DEFAULT_JOB_CLASS',FALSE,TRUE,NULL);
    146        DBMS_OUTPUT.PUT_LINE('CREATE JOB');
    147     END IF;
    148     --若JOB未运行则启动JOB
    149     SELECT COUNT(*) INTO v_exist FROM ALL_SCHEDULER_RUNNING_JOBS WHERE JOB_NAME = 'LOG_JOB';
    150     DBMS_OUTPUT.PUT_LINE('EXIT:'||v_exist);
    151     IF (v_exist = 0) THEN
    152        --清除退出标志
    153        sp_set_cancel_flag('0');
    154        DBMS_OUTPUT.PUT_LINE('RESET JOB CANCEL FLAG');
    155        DBMS_SCHEDULER.RUN_JOB('LOG_JOB',NOT IF_ASYC);
    156        DBMS_OUTPUT.PUT_LINE('START JOB');
    157     END IF;
    158   END;
    159 
    160   PROCEDURE sp_stop_job(TIME_OUT INT,IF_FORCE BOOLEAN)
    161   AS
    162     v_exist INTEGER;
    163   BEGIN
    164        --设置退出标志
    165        sp_set_cancel_flag('1');
    166        DBMS_LOCK.SLEEP(TIME_OUT);
    167        --若JOB未停止则强行停止JOB
    168        SELECT COUNT(*) INTO v_exist FROM ALL_SCHEDULER_RUNNING_JOBS WHERE JOB_NAME = 'LOG_JOB';
    169        IF (v_exist > 0 AND IF_FORCE) THEN
    170           DBMS_SCHEDULER.STOP_JOB('LOG_JOB',IF_FORCE);
    171           DBMS_OUTPUT.PUT_LINE('STOP JOB FORCE');
    172        ELSE
    173           DBMS_OUTPUT.PUT_LINE('STOP JOB');
    174        END IF;
    175   END;
    176 END;
    View Code

    --PMDC

      1 CREATE OR REPLACE PACKAGE BODY PMDC AS
      2 -------------------------------------------------------------------
      3 --
      4 --  Nom package        : PMDC
      5 --
      6 --  Objectif           : MDC Features
      7 --
      8 --  Version            : 1.0
      9 -------------------------------------------------------------------
     10 -- see package spec for history
     11 -------------------------------------------------------------------
     12 
     13 
     14 -------------------------------------------------------------------
     15 -- Variable global priv?au package
     16 -------------------------------------------------------------------
     17 /*
     18  * Copyright (C) LOG4PLSQL project team. All rights reserved.
     19  *
     20  * This software is published under the terms of the The LOG4PLSQL
     21  * Software License, a copy of which has been included with this
     22  * distribution in the LICENSE.txt file.
     23  * see: <http://log4plsql.sourceforge.net>  */
     24 
     25 -------------------------------------------------------------------
     26     gSeparator constant varchar2(1) := chr(29);
     27     gSepLength pls_integer := length(gSeparator);
     28 
     29     gKeys varchar2(4096) := gSeparator;
     30     gValues varchar2(4096) := gSeparator;
     31 --
     32 function getPos(pKey varchar2) return pls_integer
     33 is
     34     cnt pls_integer := 0;
     35     pos pls_integer := 0;
     36     sep pls_integer := 1;
     37 begin
     38     if gKeys = gSeparator then return 0; end if;
     39     pos := instr(gKeys, pKey || gSeparator);
     40     if pos = 0 then return 0; end if;
     41     --
     42     while sep > 0 and sep <= pos loop
     43         cnt := cnt + 1;
     44         sep := instr(gKeys, gSeparator, sep+gSepLength);
     45     end loop;
     46     return cnt;
     47 end getPos;
     48 --
     49 procedure put(pKey varchar2, pValue varchar2)
     50 is
     51     idx pls_integer := 0;
     52     posStart pls_integer := 0;
     53 begin
     54     idx := getPos(pKey);
     55     if idx = 0 then -- new key, add to end
     56         gKeys := gKeys || pKey || gSeparator;
     57         gValues := gValues || pValue || gSeparator;
     58     else -- replace value for existing key
     59         posStart := instr(gValues, gSeparator, 1, idx);
     60         gValues := substr(gValues, 1, posStart + (gSepLength -1) ) ||
     61                         pValue ||
     62                       substr(gValues, instr(gValues, gSeparator, posStart+gSepLength, 1));
     63     end if;
     64 end put;
     65 --
     66 function get(pKey varchar2) return varchar2
     67 is
     68     idx pls_integer := 0;
     69     lStart pls_integer := 0;
     70     lEnd pls_integer := 0;
     71 begin
     72     idx := getPos(pKey);
     73     if idx = 0 then return ''; end if;
     74 --
     75     lStart := instr(gValues, gSeparator, 1, idx);
     76     lEnd := instr(gValues, gSeparator, lStart+gSepLength, 1);
     77     return substr(gValues, lStart+gSepLength, lEnd-lStart-gSepLength);
     78 end get;
     79 --
     80 procedure remove(pKey varchar2)
     81 is
     82     idx pls_integer := 0;
     83     lStart pls_integer := 0;
     84     lEnd pls_integer := 0;
     85 begin
     86     idx := getPos(pKey);
     87     if idx = 0 then return; end if; -- key doesn't exist, nothing to do.
     88 --
     89     lStart := instr(gValues, gSeparator, 1, idx);
     90     lEnd := instr(gValues, gSeparator, lStart+gSepLength, 1);
     91     gValues := substr(gValues, 1, lStart) || substr(gValues, lEnd+gSepLength);
     92 --
     93     lStart := instr(gKeys, gSeparator, 1, idx);
     94     lEnd := instr(gKeys, gSeparator, lStart+gSepLength, 1);
     95     gKeys := substr(gKeys, 1, lStart) || substr(gKeys, lEnd+gSepLength);
     96 end remove;
     97 --
     98 function getKeyString return varchar2 is
     99 begin
    100     return gKeys;
    101 end getKeyString;
    102 --
    103 function getValueString return varchar2 is
    104 begin
    105     return gValues;
    106 end getValueString;
    107 --
    108 function getSeparator return varchar2 is
    109 begin
    110     return gSeparator;
    111 end getSeparator;
    112 --
    113 END PMDC;
    View Code
  • 相关阅读:
    C++中迭代器失效的问题
    怎么转载别人的博客
    Linux下模拟实现shell
    Linux下的文件描述符与文件指针及其区别
    智能指针
    C++模板(下)
    C++中的模板(上)
    僵尸进程和孤儿进程
    Linux下的atexit函数
    多线程练习
  • 原文地址:https://www.cnblogs.com/linbo3168/p/8488841.html
Copyright © 2011-2022 走看看