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
原文地址:https://www.cnblogs.com/linbo3168/p/8488841.html