精华内容
下载资源
问答
  • 怎么样在存储过程记录日志,将我进行的操作写入日志中
  • Oracle存储过程记录异常日志

    Oracle存储过程记录异常日志

    参考文章:

    (1)Oracle存储过程记录异常日志

    (2)https://www.cnblogs.com/wuxun1997/p/9831199.html


    备忘一下。


    展开全文
  • oracle 存储过程记录执行日志

    万次阅读 2019-06-11 18:06:16
    创建一个序列,用于标识[存储过程,函数,触发器]执行先后顺序 create sequence SEQ_PROGRAM_EXECUTE_LOG minvalue 1 maxvalue 1000000000000 ...创建日志表,用于存储[存储过程,函数,触发器]执行日志 CREATE TABL...

    本文主要介绍如何记录存储过程执行详细日志,统计存储过程执行时间,实现逻辑如下:

    • 创建一个序列,用于标识[存储过程,函数,触发器]执行先后顺序
    create sequence SEQ_PROGRAM_EXECUTE_LOG
    minvalue 1
    maxvalue 1000000000000
    start with 1
    increment by 1
    cache 100
    cycle
    order;
    
    • 创建日志表,用于存储[存储过程,函数,触发器]执行日志
    CREATE TABLE PROGRAM_EXECUTE_LOG
    (
      PROGRAM_NAME      VARCHAR2(1000),
      IS_SUCCEED        CHAR(1),
      LOG_DATE          DATE,
      EXECUTE_MSG       CLOB,
      TIME_CONSUMING    NUMBER,
      EXECUTE_ORDER     NUMBER,
      EXECUTE_BEGINTIME TIMESTAMP(6),
      EXECUTE_ENDTIME   TIMESTAMP(6),
      PROCESS_FLAG      VARCHAR2(10) DEFAULT 'N'
    );
    -- Add comments to the table 
    comment on table PROGRAM_EXECUTE_LOG
      is '过程、函数、触发器执行性能日志';
    -- Add comments to the columns 
    comment on column PROGRAM_EXECUTE_LOG.program_name
      is '程序名称';
    comment on column PROGRAM_EXECUTE_LOG.is_succeed
      is '执行结果(成功Y,失败N)';
    comment on column PROGRAM_EXECUTE_LOG.log_date
      is '日志时间';
    comment on column PROGRAM_EXECUTE_LOG.execute_msg
      is '执行详细信息';
    comment on column PROGRAM_EXECUTE_LOG.time_consuming
      is '耗时';
    comment on column PROGRAM_EXECUTE_LOG.execute_order
      is '流水号-SEQ_PROGRAM_EXECUTE_LOG';
    comment on column PROGRAM_EXECUTE_LOG.execute_begintime
      is '执行开始时间';
    comment on column PROGRAM_EXECUTE_LOG.execute_endtime
      is '执行结束时间';
    comment on column PROGRAM_EXECUTE_LOG.process_flag
      is '处理标识(已处理Y,未处理N)';
    CREATE INDEX PROGRAM_EXECUTE_LOG_IDX1 ON PROGRAM_EXECUTE_LOG (EXECUTE_ORDER);
    CREATE INDEX PROGRAM_EXECUTE_LOG_IDX2 ON PROGRAM_EXECUTE_LOG (TIME_CONSUMING);
    
    • 创建计算耗时的函数
    CREATE OR REPLACE FUNCTION F_TIMESTAMP_DIFF(ENDTIME   IN TIMESTAMP,
                                                STARTTIME IN TIMESTAMP)
      RETURN INTEGER AS
      STR      VARCHAR2(50);
      MISECOND INTEGER;
      SECONDS  INTEGER;
      MINUTES  INTEGER;
      HOURS    INTEGER;
      DAYS     INTEGER;
    BEGIN
      STR      := TO_CHAR(ENDTIME - STARTTIME);
      MISECOND := TO_NUMBER(SUBSTR(STR, INSTR(STR, ' ') + 10, 3));
      SECONDS  := TO_NUMBER(SUBSTR(STR, INSTR(STR, ' ') + 7, 2));
      MINUTES  := TO_NUMBER(SUBSTR(STR, INSTR(STR, ' ') + 4, 2));
      HOURS    := TO_NUMBER(SUBSTR(STR, INSTR(STR, ' ') + 1, 2));
      DAYS     := TO_NUMBER(SUBSTR(STR, 1, INSTR(STR, ' ')));
      RETURN DAYS * 24 * 60 * 60 * 1000 + HOURS * 60 * 60 * 1000 + MINUTES * 60 * 1000 + SECONDS * 1000 + MISECOND;
    END;
    
    • 创建日志记录过程
    CREATE OR REPLACE PROCEDURE SYS_SAVELOG(PROGRAM_NAME VARCHAR2, --过程名称
                                             IS_SUCCEED   VARCHAR2, --是否执行成功 Y|N
                                             EXECUTE_MSG  CLOB, --过程执行信息
                                             BEGIN_TIME   TIMESTAMP --过程开始执行TIMESTAMP
                                             ) AS
      V_PROGRAM_NAME VARCHAR2(1000) := SUBSTRB(PROGRAM_NAME, 1, 1000); --过程名称
      V_IS_SUCCEED   CHAR(1) := SUBSTR(IS_SUCCEED, 1, 1); --过程执行成功表示 Y N
      V_BEGIN_TIME   TIMESTAMP := BEGIN_TIME;
      PRAGMA AUTONOMOUS_TRANSACTION; --日志开启自治事务,不影响业务逻辑事务
      /*
      调用方式:
      1.正常日志:PROC_SAVELOG(V_PROC_NAME, 'Y', '执行成功。。。',V_BEGIN_TIME);
      2.异常日志:PROC_SAVELOG(V_PROC_NAME, 'N', SQLERRM,V_BEGIN_TIME);
      */
    BEGIN
      INSERT INTO PROGRAM_EXECUTE_LOG
        (PROGRAM_NAME,
         IS_SUCCEED,
         LOG_DATE,
         EXECUTE_MSG, --已改为CLOB
         TIME_CONSUMING,
         --EXECUTE_ORDER,
         EXECUTE_BEGINTIME,
         EXECUTE_ENDTIME)
      VALUES
        (V_PROGRAM_NAME,
         V_IS_SUCCEED,
         SYSDATE,
         EXECUTE_MSG,
         F_TIMESTAMP_DIFF(SYSTIMESTAMP, V_BEGIN_TIME),
         --PROGRAM_EXECUTE_LOG_SEQ.NEXTVAL,
         V_BEGIN_TIME,
         SYSTIMESTAMP);
      COMMIT;
    EXCEPTION
      WHEN OTHERS THEN
        ROLLBACK;
    END;
    
    • 异常日志处理存储过程
    CREATE OR REPLACE PROCEDURE SYS_PROCESS_ERRMSG(PROC_NAME  VARCHAR2, --过程信息
                                                    EXE_MSG    CLOB, --执行信息
                                                    ERR_MSG    VARCHAR2, --错误信息
                                                    BEGIN_TIME TIMESTAMP, --过程开始执行TIMESTAMP
                                                    RESULT     OUT VARCHAR2) AS
      /*faith@2016.11.24用于处理异常信息,方便后续扩展
      1.执行信息中添加ERR_MSG
      2.执行记录日志过程
      3.错误信息赋值给返回结果RESULT
      调用方式:
      SYS_PROCESS_ERRMSG(V_PROC_NAME, V_EXE_MSG,V_ERR_MSG,V_BEGIN_TIME,RESULT);
      */
    
      V_EXE_MSG CLOB := EXE_MSG;
    BEGIN
      RESULT := 'OK';
      --如果错误信息长度为0,返回OK
      IF LENGTH(ERR_MSG) = 0 OR ERR_MSG IS NULL THEN
        RETURN;
      END IF;
      DBMS_LOB.APPEND(V_EXE_MSG, ERR_MSG || CHR(10));
      SYS_SAVELOG(PROC_NAME, 'I', V_EXE_MSG, BEGIN_TIME);
      ROLLBACK;
      RESULT := ERR_MSG;
    EXCEPTION
      WHEN OTHERS THEN
        RESULT := '处理异常信息发生错误!';
    END;
    
    • 使用样例
      PROCEDURE SYS_SAVELOG_EXAMPLE(PLAN_DATE IN DATE,
                                    CONFIRM   IN VARCHAR2,
                                    RESULT    OUT VARCHAR2) AS
        V_PLAN_DATE  DATE := PLAN_DATE;
        V_CONFIRM    VARCHAR2(10) := CONFIRM; --CONFIRM标识, Y:报工确认  N:报工解锁
        V_ERR_MSG    VARCHAR2(1000);
        V_BEGIN_TIME TIMESTAMP := SYSTIMESTAMP;
        V_PROC_NAME  VARCHAR2(1000) := 'SYS_SAVELOG_EXAMPLE/' ||
                                       TO_CHAR(V_PLAN_DATE,
                                               'YYYY-MM-DD HH24:MI:SS') || '/' ||
                                       V_CONFIRM;
        V_EXE_MSG    CLOB;
      
      BEGIN
      
        DBMS_LOB.CREATETEMPORARY(V_EXE_MSG, TRUE); --初始化CLOB
        RESULT := 'OK';
      
        IF V_CONFIRM = 'Y' THEN
          V_ERR_MSG := '不允许确认今天或者今天之后的数据!'; --今天或者
          GOTO PROCESS_ERRMSG;
        END IF;
      
        COMMIT;
        DBMS_LOB.APPEND(V_EXE_MSG, '执行成功!');
      
        SYS_SAVELOG(V_PROC_NAME, 'Y', V_EXE_MSG, V_BEGIN_TIME);
        --异常处理
        RETURN; --若为顺序执行到此位置,则直接返回
        <<PROCESS_ERRMSG>>
        SYS_PROCESS_ERRMSG(V_PROC_NAME,
                           V_EXE_MSG,
                           V_ERR_MSG,
                           V_BEGIN_TIME,
                           RESULT);
      EXCEPTION
        WHEN OTHERS THEN
          V_ERR_MSG := SUBSTR(SQLERRM, 1, 160);
          DBMS_LOB.APPEND(V_EXE_MSG, V_ERR_MSG);
          SYS_SAVELOG(V_PROC_NAME, 'N', V_EXE_MSG, V_BEGIN_TIME);
          RESULT := V_ERR_MSG; --错误号对应的信息
      END;
    
    • PLSQL 中文乱码解决
    select userenv('language') from dual; 
    -- 配置环境变量
    -- NLS_LANG=sql查询出来的值
    
    展开全文
  • ORACLE存储记录日志

    2015-01-20 18:18:06
    自已写的可在ORACLE存储过程记录运行日志工具包,调用方便简单。
  • 转载别人的,在这里记录一下 ...第一步、创建日志表,用来存放oracle存储过程日志 create table TBL_WLF_SYS_LOG ( S_TIME VARCHAR2(32) not null, S_LEVEL VARCHAR2(32), S_PROCNAME VARCHAR2(64), ...

    转载别人的,在这里记录一下
    原文链接

    第一步、创建日志表,用来存放oracle存储过程的日志

    create table TBL_WLF_SYS_LOG
    (
          S_TIME            VARCHAR2(32) not null,
        S_LEVEL            VARCHAR2(32),
        S_PROCNAME        VARCHAR2(64),
        S_MSG            VARCHAR2(4000),
        S_ADVICE        VARCHAR2(1024)
    )
    tablespace TBS_WLF_DAT;
    -- Add comments to the table 
    comment on table TBL_WLF_SYS_LOG
      is '存储过程日志表';
    -- Add comments to the columns 
    comment on column TBL_WLF_SYS_LOG.S_TIME
      is '操作时间';
    -- Add comments to the columns 
    comment on column TBL_WLF_SYS_LOG.S_LEVEL
      is '操作级别';
    -- Add comments to the columns 
    comment on column TBL_WLF_SYS_LOG.S_PROCNAME
      is '执行存储过程名称';
    -- Add comments to the columns 
    comment on column TBL_WLF_SYS_LOG.S_MSG
      is '错误信息';
    -- Add comments to the columns 
    comment on column TBL_WLF_SYS_LOG.S_ADVICE
      is '建议信息';
    

    第二步、建立日志存储过程

    CREATE OR REPLACE PROCEDURE prc_wlf_sys_writelog(
      i_flag       INTEGER,
      i_id         INTEGER,
      str_procname varchar2,
      str_msg      varchar2,
      str_advice   varchar2
    ) IS
      -- 操作时间
      str_time   varchar2(32);
      -- 操作级别
      str_level  varchar2(32);
      -- 执行存储过程名称
      p_procname varchar2(1024);
      -- 错误信息,或者记录信息
      p_msg      varchar2(1024);
      -- 建议信息
      p_advice   varchar2(1024);
    
    BEGIN
      IF (i_flag = 2 AND i_id >= 1 AND i_id <= 4) THEN
        CASE
          WHEN i_id = 1 THEN
            str_level := 'log';
          WHEN i_id = 2 THEN
            str_level := 'debug';
          WHEN i_id = 3 THEN
            str_level := 'alarm';
          ELSE
            str_level := 'error';
        END CASE;
        p_procname := str_procname;
        p_msg      := str_msg;
        p_advice   := str_advice;
      ELSE
        str_level  := 'error';
        p_procname := 'p_public_writelog';
        p_msg      := 'writelog_error';
        p_advice   := '';
      END IF;
    
      str_time := to_char(SYSDATE, 'yyyy-mm-dd hh24:mi:ss');
    
      INSERT INTO tbl_wlf_sys_log
        (s_time, s_level, s_procname, s_msg, s_advice)
      VALUES
        (str_time, str_level, p_procname, p_msg, p_advice);
      COMMIT;
    END prc_wlf_sys_writelog;
    /
    

    第三步、在我们自己的存储过程中,调用日志存储过程(第二步中的)
    加粗的是要求加上的

    CREATE OR REPLACE PROCEDURE A_select1(
                                                            --传入实参
                                                            p_orgIds IN VARCHAR2,
                                                            p_period IN VARCHAR2,
                                                            p_userId IN VARCHAR2,
                                                            p_result OUT VARCHAR2)
    
     IS
    
      v_orgId            VARCHAR2(32);
      v_qty              INTEGER;
      v_finish_qty       INTEGER;
      v_status           INTEGER;
      v_month_report_num INTEGER;
      v_date             VARCHAR2(32);
      v_date2            VARCHAR2(32);
      v_date3            VARCHAR2(32);
      
      v_date4            VARCHAR2(32);
      v_date5            VARCHAR2(32);
      
       -- debug信息
        v_debugmsg      varchar2(1024);
        -- 错误信息
        v_errmsg      varchar2(1024);
        
      CURSOR c_orgIds IS
        select a.ORG_ID org_id
          from base_hs_health_org a
          left join (select distinct u.ref_id as org_id
                       from com_user u
                       left join com_user_role ur
                         on u.id = ur.user_id
                       left join com_role r
                         on r.id = ur.role_id
                      where r.id = '099d0eae68464cd59d83caed570a823f') H
            on a.org_id = H.ORG_ID
           where H.ORG_ID is not null
         start with a.org_id = p_orgIds
        connect by prior a.org_id = parent_id;
    
    begin
    **-- 存储过程开始日志
    v_debugmsg := 'A_select1 begin  log- ';
    prc_wlf_sys_writelog(2, 2, 'A_select1', v_debugmsg, '');**
    
    
    
      p_result := 0;
      ---遍历所有上报机构
      OPEN c_orgIds;
    LOOP
        FETCH c_orgIds
          INTO v_orgId;
        EXIT WHEN c_orgIds%NOTFOUND;
        BEGIN
           -- 表示输出buffer不受限制。
          DBMS_OUTPUT.ENABLE(buffer_size => null);
          -- DBMS_OUTPUT.PUT_LINE(v_orgId);
          --- 清除原有数据
         --- delete from rhsa_hs4_import_detail
         ---  where period = p_period
         ---    and org_id = v_orgId;
    
    v_date4:=dbms_utility.get_time;
    
     ---填报数量
          select count(*)
            into v_qty
            from RHSA_HS4_1_2013_TEMP
          where org_id = v_orgId
          and period in (select * from table(splitstr(p_period,',')));
    
    
    -- 计算时间差
    v_date5:=dbms_utility.get_time;
    dbms_output.put_line('时间差: '||(v_date5-v_date4)|| ' 毫秒  '   ||' 机构id: '||v_orgId|| ' v_qty: '||v_qty);
    
    
           
        END;
      END LOOP;
      CLOSE c_orgIds;
      p_result := 1;
      
       **-- 存储过程开始日志
      v_debugmsg := 'A_select1 end  log- ';
      prc_wlf_sys_writelog(2, 2, 'A_select1', v_debugmsg, '');**
      
      
    EXCEPTION
      WHEN OTHERS THEN
        p_result := 0;
        
        **begin
          rollback;
          v_errmsg := 'sqlexception~~sqlcode:' || to_char(sqlcode) ||
                      ' sqlstate:' || substr(sqlerrm, 1, 512);
          prc_wlf_sys_writelog(2, 4, 'A_select1', v_errmsg, '');
        end;**
        
        
        
    end;
    
    
    展开全文
  • 本包用于记录存储过程里面的日志,将日志...可以记录日志时间、过程名称、过程里面记录日志的行数、参数值。如果在异常处理部分记录日志,还可以记录异常代码、异常原因、异常产生的行数。 本人使用开发环境为oracle10g
  • ORACLE数据库存储过程记录错误日志

    千次阅读 2019-08-16 17:26:37
    目前主程序的大部分存储过程都是使用ZL_ErrorCenter来处理程序异常,但是ZL_ErrorCenter的主要功能... 在业务交互平台等三方接口的运行和调试过程中,虽然本身业务交互平台有日志记录,但是查询和定位问题并不是...

                 目前主程序的大部分存储过程都是使用ZL_ErrorCenter来处理程序异常,但是ZL_ErrorCenter的主要功能是用于对ZLHIS主程序的部分错误的异常进行友好的界面提示,并且对于异常的种类处理较少,对于未处理的异常提示反而不够详细。

           在业务交互平台等三方接口的运行和调试过程中,虽然本身业务交互平台有日志记录,但是查询和定位问题并不是很方便,因此考虑自定义错误日志处理过程来处理。

    处理过程及脚本:

       1)日志表

    -- Create table
    create table zlcd_错误日志
    (
      程序名称 varchar2(500),
      错误信息 varchar2(1000),
      入参   varchar2(2000),
      时间   date,
      用户   varchar2(100)
    )
    ;
    
    
    -- Create/Recreate indexes 
    create index ix_错如日志_时间 on zlcd_错误日志 (时间);
    
    
    ---同义词
    create public synonym zlcd_错误日志 for zlhis.zlcd_错误日志;
    --授权
    grant all on zlcd_错误日志 to public;
    

    2)存储过程

    CREATE OR REPLACE PROCEDURE 
    record_err_log(程序名称_in  varchar2,
                    错误信息_in   varchar2,
                    入参_in   varchar2
                  ) is
      PRAGMA AUTONOMOUS_TRANSACTION;
    BEGIN
      insert into zlcd_错误日志
        (程序名称,
         错误信息,
         入参,
         时间,
         用户
         )
      values
        (程序名称_in,
         错误信息_in,
         入参_in,
         sysdate,
         user);
      commit;
    END record_err_log;
    
    ---同义词
    create public synonym record_err_log for zlhis.record_err_log;
    --授权
    grant execute on record_err_log to public;
    

    3)使用示例

    create or replace procedure yuchen_testerro as
      
      n_count number:=0;
      begin
         select 病人id into n_count from 病人信息 where 姓名='张三' or 姓名='李四';
      exception
         When Others Then
    ----记录日志
           record_err_log('yuchen_testerro',dbms_utility.format_error_backtrace||'**'||SQLCODE||'**'||SQLERRM,'');
    --抛出异常
      Raise_application_error(-20999,dbms_utility.format_error_backtrace||'**'||SQLCODE||'**'||SQLERRM);
        
        end yuchen_testerro;
    

    4)效果图

    查询日志表如下:

    展开全文
  • JAVA开发过程中一般使用LOG4J来将程序的运行日志记录到文件中,在ORACLE存储过程中也需要记录日志,我将工作中自己整理的一个记录日志的包分享出来,希望大家多提意见。
  • Oracle存储过程中调用日志存储过程

    千次阅读 2018-03-15 17:04:48
    在写存储过程中一般需要书写过程运行日志,但是工作这么长时间自己从没认真研究过调用日志存储过程的问题。现因项目整合需要做日志监控,才发现日志的重要性:create or replace procedure bo_dw.sp_sys_log ( oi_...
  • --这段sql语句是用来实现oracle后台记录操作日志的,代替或者补充应用系统的操作日志。 --1.对应的日志记录表-------------------------------------------------------------------create table TEST( T_ID NUMBER...
  • 1.步骤一:创建一个序列,用于标识[存储过程,函数,触发器]执行先后顺序 --步骤一:创建一个序列,用于标识[存储过程,函数,触发器]执行先后顺序 CREATE SEQUENCE SEQ_PROGRAM_EXECUTE_LOG MINVALUE 1 MAXVALUE ...
  • Oracle存储过程记录异常

    千次阅读 2014-12-08 14:43:11
    对于Oracle存储过程,抛出异常可以抛向代码或是用表记录。如果你的系统应用有很多节点,像我们40个节点,如果抛错抛到代码里面,错误根本就无法找到,最好是错误用表记录记录错误的这个功能最好是通用的。 --...
  •  在编写存储过程时,一般情况直接调试,或者使用dbms_output.putline等来输出日志信息,便于诊断错误等。  但在有些时候,上面的方法就不行了。比如某些作为回调而编写的存储过程。  这时,可以采用oracle提供...
  • 请大神写一个详细示例。要不然我看不懂,急急急 急。有没有 oracle前辈 花点时间,有偿有偿指导一下我...正常insert会存储过程报错,四条都插不进去,我想继续执行把其他三条正常插入到目标表,报错那一条记录的到日志
  • SELECT t.name AS ts_name,d.name AS dbf_name, d.unrecoverable_change# AS nolog_chng,TO_CHAR (d.unrecoverable_time, 'Dy DD-Mon-YYYY HH24:MI:SS')AS nolog_time,db.force_logging FROM v$datafile d, v$...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 95,431
精华内容 38,172
关键字:

oracle存储过程记录日志