如题,我想在存储过程中数据更改时手动记录日志,用什么函数,或有什么方法吗,
还有日志保存在哪呢... 
oracle的自己的操作日志又放在哪呢,基础为0 ,请详细赐教...

解决方案 »

  1.   

    create or replace procedure proc_name is
           v_result varchar2(200);
           proc_name varchar2(50) := 'proc_name';
           proc_num number(3);
    begin
           ......................
           proc_num := -10;
           ......................
           proc_num := -20;
           ......................
           proc_num := -30;
           
           exception
                 when others then
                       v_result := to_char(proc_num) ||' '|| substr(sqlerrm,1,180);
                       --写入异常日志的过程
                       proc_log(proc_name, v_result);  
    end proc_name;
             
      

  2.   

    proc_log('')????  是这样吗,不可以自己创建一个专门记录自定义操作日志的文件吗
      

  3.   

    一般来说,进行数据更改时,ORACLE会在REDO表空间中记录你的操作日志,这个可以通过一个查询语句查出你所做的操作。具体的语句忘记了。上网找下吧。如果要在数据更改时手动记录日志,一般是写一个存储过程sp_write_log,在这个存储过程中,你可以将你进行的操作,操作的记录数,操作时间等写入一个表operate_log中。具体的存储过程写法你就自己多研究SQL语句吧自己写的才是印象最深刻的。
      

  4.   

    刚才你都帮我解决了job的问题啦,赚了不少分哦。帮忙帮忙
      

  5.   

    这就是自定义的拉,proc_log(.....)是个过程啊,这个是自己写的:
    create or replace procedure proc_log()
    begin
       inster into log_name.....
    end;
      

  6.   

    说的有道理,可是急用诶...应该有什么函数直接可以添加吧,类似 log4j,或可以保持到文件的 print还有这个日志记录 网上不好搜,
      

  7.   


    我知道要在什么地方放...具体的过程该怎么写,不是记录到表中,如果要过程,那应该在过程中创建一个日志文件,然后追加日志内容,可ORACLE中该如何写呢??谢谢
      

  8.   

    百度了一下:从目前来看,分析Oracle日志的唯一方法就是使用Oracle公司提供的LogMiner来进行, Oracle数据库的所有更改都记录在日志中,但是原始的日志信息我们根本无法看懂,而LogMiner就是让我们看懂日志信息的工具。从这一点上看,它和tkprof差不多,一个是用来分析日志信息,一个则是格式化跟踪文件。通过对日志的分析我们可以实现下面的目的:  1、查明数据库的逻辑更改;  2、侦察并更正用户的误操作;  3、执行事后审计;  4、执行变化分析。  不仅如此,日志中记录的信息还包括:数据库的更改历史、更改类型(INSERT、UPDATE、DELETE、DDL等)、更改对应的SCN 号、以及执行这些操作的用户信息等,LogMiner在分析日志时,将重构等价的SQL语句和UNDO语句(分别记录在 V$LOGMNR_CONTENTS视图的SQL_REDO和SQL_UNDO中)。这里需要注意的是等价语句,而并非原始SQL语句,例如:我们最初执行的是“delete a where c1 <>'cyx';”,而LogMiner重构的是等价的6条DELETE语句。所以我们应该意识到V$LOGMNR_CONTENTS视图中显示的并非是原版的现实,从数据库角度来讲这是很容易理解的,它记录的是元操作,因为同样是“delete a where c1 <>'cyx';”语句,在不同的环境中,实际删除的记录数可能各不相同,因此记录这样的语句实际上并没有什么实际意义,LogMiner重构的是在实际情况下转化成元操作的多个单条语句。更多:http://hi.baidu.com/linrw/blog/item/ea149cd70cd12fd7a044df4e.html
      

  9.   


    Oracle的日志是Oracle自己產生的。
    你想人為追加日志?貌似不可以。
    只能記錄到表中。。-------
    要截取插入的动作用AUDIT就可以完成,但是要截取插入的纪录信息就必须用触发器来完成.  
     
     CREATE   TRIGGER   MYTRIGGER  
          BEFORE   INSERT   ON   MYTABLE  
          FOR   EACH   ROW  
              W_USER   VARCHAR2(30);  
          BEGIN  
              SELECT   USER   INTO   W_USER   FROM   DUAL;  
              IF   W_USER='ORA1'   THEN  
                    INSERT   INTO   MYTABLE_LOG(COL1,...,USER_NAME,LOG_DATE)  
                    VALUES   (:NEW.COL1,...W_USER,SYSDATE);  
              END   IF;  
          END;
      

  10.   

    就是说什么时候执行了什么动作,更改的数据ID。过程是job调用的
    数据量不大
      

  11.   


    /*************你是要这个效果吧**********************/
    --读取文件时,指定文件名一定要预先存在,否则程序会失败(MY_LOGFILE)
    create or replace directory MY_LOGFILE as 'd:/';create or replace procedure proc_name is 
          Out_File    UTL_FILE.FILE_TYPE;
          filename    varchar2(80);
          v_result varchar2(200); 
          proc_name varchar2(50) := 'proc_name'; 
          proc_num number(3); 
          b varchar2(1);
    begin 
          select '1' into b from dual; 
          proc_num := -10; 
          select '11111' into b from dual;  
          proc_num := -20; 
          
          exception 
                when others then 
                      v_result := to_char(proc_num) ||' '|| substr(sqlerrm,1,180); 
                      --写入文件日志
                      filename:='logfile_'||to_char(sysdate,'yyyy-mm-dd hh24-mi-ss')||'.log';--文件名
                      --读取文件时,指定文件名一定要预先存在,否则程序会失败(MY_LOGFILE)
                      Out_File:=UTL_FILE.fopen('MY_LOGFILE',filename,'a');
                      --写入异常
                      UTL_FILE.put_line(Out_File,v_result);
                      UTL_FILE.FCLOSE(Out_File);
                 rollback;
    end proc_name;
      

  12.   


    --读取文件时,指定文件名一定要预先存在,否则程序会失败(MY_LOGFILE) 
    create or replace directory MY_LOGFILE as 'd:/'; create or replace procedure proc_name is 
          Out_File    UTL_FILE.FILE_TYPE;
          filename    varchar2(80);
          v_result varchar2(200); 
          proc_name varchar2(50) := 'proc_name'; 
          proc_num number(3); 
          b varchar2(1);
    begin 
          select '1' into b from dual; 
          proc_num := -10; 
          select '11111' into b from dual;  
          proc_num := -20; 
          
          exception 
                when others then 
                      v_result := proc_name||'  '||to_char(proc_num) ||' '|| substr(sqlerrm,1,180); 
                      --写入文件日志
                      filename:='logfile_'||to_char(sysdate,'yyyy-mm-dd')||'.properties';--文件名
                      --读取文件时,指定文件名一定要预先存在,否则程序会失败(MY_LOGFILE)
                      Out_File:=UTL_FILE.fopen('MY_LOGFILE',filename,'a');
                      --写入异常
                      UTL_FILE.put_line(Out_File,v_result);
                      UTL_FILE.FCLOSE(Out_File);
                 rollback;
    end proc_name;