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;
--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;
--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;
--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;