写在前面

需求

1.备份系统日志表T_S_LOG, 按照操作时间字段OPERATETIME, 将每天的日志增量备份到另一张表.

思路

1.创建一张数据结构完全相同的表T_S_LOG_BAK作为备份表

2.查出T_S_LOG中需要备份的数据

3.将数据赋给游标变量

4.遍历游标将数据逐条插入T_S_LOG_BAK

5.创建无参存储过程将游标的这部分操作作为存储过程主体执行

6.创建定时任务定时执行该存储过程

操作环境

Oracle11g

T_S_LOG日志表(部分数据)

 -- ----------------------------
-- Table structure for T_S_LOG
-- ----------------------------
DROP TABLE "T_S_LOG";
CREATE TABLE "T_S_LOG" (
"ID" NVARCHAR2(32) NOT NULL ,
"BROSWER" NVARCHAR2(100) NULL ,
"LOGCONTENT" NCLOB NOT NULL ,
"LOGLEVEL" NUMBER(6) NULL ,
"NOTE" NCLOB NULL ,
"OPERATETIME" DATE NOT NULL ,
"OPERATETYPE" NUMBER(6) NULL ,
"USERID" NVARCHAR2(32) NULL ,
"USERNAME" NVARCHAR2(50) NULL ,
"REALNAME" NVARCHAR2(50) NULL
)
LOGGING
NOCOMPRESS
NOCACHE ;
COMMENT ON COLUMN "T_S_LOG"."ID" IS 'id';
COMMENT ON COLUMN "T_S_LOG"."BROSWER" IS '???';
COMMENT ON COLUMN "T_S_LOG"."LOGCONTENT" IS '????';
COMMENT ON COLUMN "T_S_LOG"."LOGLEVEL" IS '????';
COMMENT ON COLUMN "T_S_LOG"."NOTE" IS 'IP';
COMMENT ON COLUMN "T_S_LOG"."OPERATETIME" IS '????';
COMMENT ON COLUMN "T_S_LOG"."OPERATETYPE" IS '????';
COMMENT ON COLUMN "T_S_LOG"."USERID" IS '??ID';
COMMENT ON COLUMN "T_S_LOG"."USERNAME" IS '????';
COMMENT ON COLUMN "T_S_LOG"."REALNAME" IS '????'; -- ----------------------------
-- Records of T_S_LOG
-- ----------------------------
INSERT INTO "T_S_LOG" VALUES ('402881f363ba3bfc0163ba3ddd270002', 'Chrome', '入职员工更新成功', '', '本地', TO_DATE('2018-06-01 15:26:46', 'YYYY-MM-DD HH24:MI:SS'), '', '8a8ab0b246dc81120146dc8181950052', 'admin', '管理员');
INSERT INTO "T_S_LOG" VALUES ('402881f363ba41670163ba41cafe0000', 'Chrome', '用户: admin[JEECG开源社区]common.login.success', '', '192.168.1.115', TO_DATE('2018-06-01 15:31:04', 'YYYY-MM-DD HH24:MI:SS'), '', '8a8ab0b246dc81120146dc8181950052', 'admin', '管理员');
INSERT INTO "T_S_LOG" VALUES ('402881f363ba41670163ba4234b50001', 'Chrome', '订单主信息删除成功', '', '本地', TO_DATE('2018-06-01 15:31:31', 'YYYY-MM-DD HH24:MI:SS'), '', '8a8ab0b246dc81120146dc8181950052', 'admin', '管理员');
INSERT INTO "T_S_LOG" VALUES ('402881f363ba41670163ba4270e80002', 'Chrome', '错误异常: NumberFormatException,错误描述:For input string: "2017-10-26 12:00"', '', '本地', TO_DATE('2018-06-01 15:31:46', 'YYYY-MM-DD HH24:MI:SS'), '', '8a8ab0b246dc81120146dc8181950052', 'admin', '管理员');
INSERT INTO "T_S_LOG" VALUES ('402881f363ba41670163ba42f3ab0008', 'Chrome', '添加成功', '', '本地', TO_DATE('2018-06-01 15:32:20', 'YYYY-MM-DD HH24:MI:SS'), '', '8a8ab0b246dc81120146dc8181950052', 'admin', '管理员');
INSERT INTO "T_S_LOG" VALUES ('402881f363ba41670163ba434993000a', 'Chrome', '错误异常: BusinessException,错误描述:Data truncation: Out of range value adjusted for column ''order_money'' at row 1; SQL [n/a]; nested exception is org.hibernate.exception.DataException: Data truncation: Out of range value adjusted for column ''order_money'' at row 1', '', '本地', TO_DATE('2018-06-01 15:32:42', 'YYYY-MM-DD HH24:MI:SS'), '', '8a8ab0b246dc81120146dc8181950052', 'admin', '管理员');
INSERT INTO "T_S_LOG" VALUES ('402881f363ba41670163ba43946d000b', 'Chrome', '更新成功', '', '本地', TO_DATE('2018-06-01 15:33:01', 'YYYY-MM-DD HH24:MI:SS'), '', '8a8ab0b246dc81120146dc8181950052', 'admin', '管理员'); -- ----------------------------
-- Indexes structure for table T_S_LOG
-- ----------------------------
CREATE INDEX "FK_OE64K4852UYLHYC5A00RFWTAY"
ON "T_S_LOG" ("USERID" ASC)
LOGGING
VISIBLE; -- ----------------------------
-- Checks structure for table T_S_LOG
-- ----------------------------
ALTER TABLE "T_S_LOG" ADD CHECK ("ID" IS NOT NULL);
ALTER TABLE "T_S_LOG" ADD CHECK ("LOGCONTENT" IS NOT NULL);
ALTER TABLE "T_S_LOG" ADD CHECK ("OPERATETIME" IS NOT NULL); -- ----------------------------
-- Primary Key structure for table T_S_LOG
-- ----------------------------
ALTER TABLE "T_S_LOG" ADD PRIMARY KEY ("ID");

T_S_LOG_BAK备份表

 -- ----------------------------
-- Table structure for T_S_LOG_BAK
-- ----------------------------
DROP TABLE "T_S_LOG_BAK";
CREATE TABLE "T_S_LOG_BAK" (
"ID" NVARCHAR2(32) NOT NULL ,
"BROSWER" NVARCHAR2(100) NULL ,
"LOGCONTENT" NCLOB NOT NULL ,
"LOGLEVEL" NUMBER(6) NULL ,
"NOTE" NCLOB NULL ,
"OPERATETIME" DATE NOT NULL ,
"OPERATETYPE" NUMBER(6) NULL ,
"USERID" NVARCHAR2(32) NULL ,
"USERNAME" NVARCHAR2(50) NULL ,
"REALNAME" NVARCHAR2(50) NULL
)
LOGGING
NOCOMPRESS
NOCACHE ;
COMMENT ON COLUMN "T_S_LOG_BAK"."ID" IS 'id';
COMMENT ON COLUMN "T_S_LOG_BAK"."BROSWER" IS '???';
COMMENT ON COLUMN "T_S_LOG_BAK"."LOGCONTENT" IS '????';
COMMENT ON COLUMN "T_S_LOG_BAK"."LOGLEVEL" IS '????';
COMMENT ON COLUMN "T_S_LOG_BAK"."NOTE" IS 'IP';
COMMENT ON COLUMN "T_S_LOG_BAK"."OPERATETIME" IS '????';
COMMENT ON COLUMN "T_S_LOG_BAK"."OPERATETYPE" IS '????';
COMMENT ON COLUMN "T_S_LOG_BAK"."USERID" IS '??ID';
COMMENT ON COLUMN "T_S_LOG_BAK"."USERNAME" IS '????';
COMMENT ON COLUMN "T_S_LOG_BAK"."REALNAME" IS '????'; -- ----------------------------
-- Indexes structure for table T_S_LOG_BAK
-- ----------------------------
CREATE INDEX "FK_OE64K4852UYLHYC5A00RFWTAY"
ON "T_S_LOG_BAK" ("USERID" ASC)
LOGGING
VISIBLE; -- ----------------------------
-- Checks structure for table T_S_LOG_BAK
-- ----------------------------
ALTER TABLE "T_S_LOG_BAK" ADD CHECK ("ID" IS NOT NULL);
ALTER TABLE "T_S_LOG_BAK" ADD CHECK ("LOGCONTENT" IS NOT NULL);
ALTER TABLE "T_S_LOG_BAK" ADD CHECK ("OPERATETIME" IS NOT NULL); -- ----------------------------
-- Primary Key structure for table T_S_LOG_BAK
-- ----------------------------
ALTER TABLE "T_S_LOG_BAK" ADD PRIMARY KEY ("ID");

操作步骤

1.创建备份表(上面贴了)

2.声明游标,定义记录变量接收查询出的数据,遍历记录插入到备份表,关闭游标

 declare
--定义游标
cursor cursor_log is
select * from t_s_log where to_char(t_s_log.operatetime,'yyyyMMdd') = to_char(sysdate,'yyyyMMdd');
--定义记录变量
ls_curinfo cursor_log%rowtype;
begin
open cursor_log;--打开游标
loop
FETCH cursor_log
INTO ls_curinfo;--获取记录值
EXIT WHEN cursor_log%NOTFOUND;
insert into t_s_log_bak(ID,
BROSWER,
LOGCONTENT,
LOGLEVEL,
NOTE,
OPERATETIME,
OPERATETYPE,
USERID,
USERNAME,
REALNAME) values(ls_curinfo.ID,
ls_curinfo.BROSWER,
ls_curinfo.LOGCONTENT,
ls_curinfo.LOGLEVEL,
ls_curinfo.NOTE,
ls_curinfo.OPERATETIME,
ls_curinfo.OPERATETYPE,
ls_curinfo.USERID,
ls_curinfo.USERNAME,
ls_curinfo.REALNAME); commit;
end loop;
close cursor_log;--关闭游标
end;

到这里测试没什么问题就继续创建存储过程

3.创建无参存储过程

存储过程不细说了,大致结构就是:

CREATE OR REPLACE
procedure 存储过程名字 as
begin
...(过程体)...
end;

过程体就是第2步定义的游标及遍历那部分直接粘过来就可以了

完整的存储过程如下:(这里用Navicat执行时遇到点问题, 改为PL/SQL执行没问题, 不太清楚是什么操作)

 CREATE OR REPLACE
procedure procedure_log_bak as
begin
declare
--定义游标
cursor cursor_log is
select * from t_s_log where to_char(t_s_log.operatetime,'yyyyMMdd') = to_char(sysdate,'yyyyMMdd');
--定义记录变量
ls_curinfo cursor_log%rowtype;
begin
open cursor_log;--打开游标
loop
FETCH cursor_log
INTO ls_curinfo;--获取记录值
EXIT WHEN cursor_log%NOTFOUND;
insert into t_s_log_bak(ID,
BROSWER,
LOGCONTENT,
LOGLEVEL,
NOTE,
OPERATETIME,
OPERATETYPE,
USERID,
USERNAME,
REALNAME) values(ls_curinfo.ID,
ls_curinfo.BROSWER,
ls_curinfo.LOGCONTENT,
ls_curinfo.LOGLEVEL,
ls_curinfo.NOTE,
ls_curinfo.OPERATETIME,
ls_curinfo.OPERATETYPE,
ls_curinfo.USERID,
ls_curinfo.USERNAME,
ls_curinfo.REALNAME); commit;
end loop;
close cursor_log;--关闭游标
end;
end;

到这里手动执行存储过程也没问题就继续创建定时任务,即Oracle的job

4.创建定时任务

使用PL/SQL找到DBMS_Jobs右键New...不细说了,可以移步https://www.cnblogs.com/yx007/p/6519544.html这篇讲的很详细,这里主要记录一下创建完成后遇到的问题.当创建完成后job并没有执行,Last_date这个字段是空的, 并且Next_date并不是job定义的执行时间.

到这里需要手动执行job:

执行之后last_date字段有值了,而且next_date的值也是想要定义的job执行时间了

到这里就没什么问题了.

新需求补充

2.在日志表T_S_LOG中插入一条记录logcontent字段为yyyyMMdd日志备份成功.(后来提的需求)

思路

在存储过程的最后, 也就是遍历游标的结束后新增insert语句即可.

不细说了,只说一下变量的拼接是用的||符号.例如:bak_date := bak_date||'日志备份成功';

最新的存储过程为:

 CREATE OR REPLACE
procedure procedure_log_bak as
gen_guid varchar2(100);
bak_date varchar2(100);
begin
select sys_guid() into gen_guid from dual;
select to_char(sysdate,'yyyyMMdd') into bak_date from dual;
bak_date := bak_date||'日志备份成功';
declare
--定义游标
cursor cursor_log is
select * from t_s_log where to_char(t_s_log.operatetime,'yyyyMMdd') = to_char(sysdate,'yyyyMMdd');
--定义记录变量
ls_curinfo cursor_log%rowtype;
begin
open cursor_log;--打开游标
loop
FETCH cursor_log
INTO ls_curinfo;--获取记录值
EXIT WHEN cursor_log%NOTFOUND;
insert into t_s_log_bak(ID,
BROSWER,
LOGCONTENT,
LOGLEVEL,
NOTE,
OPERATETIME,
OPERATETYPE,
USERID,
USERNAME,
REALNAME) values(ls_curinfo.ID,
ls_curinfo.BROSWER,
ls_curinfo.LOGCONTENT,
ls_curinfo.LOGLEVEL,
ls_curinfo.NOTE,
ls_curinfo.OPERATETIME,
ls_curinfo.OPERATETYPE,
ls_curinfo.USERID,
ls_curinfo.USERNAME,
ls_curinfo.REALNAME); commit;
end loop;
close cursor_log;--关闭游标
end;
insert into t_s_log(id,logcontent,operatetime) values(gen_guid,bak_date,sysdate);
end;

同样,修改后用PL/SQL执行即可修改成功.

感谢

Oracle存储过程

Oracle游标

PL/SQL创建定时任务

Oracle定时器INTERVAI(时间段)写法

Oracle的job不执行解决方法

Oracle定时任务执行存储过程备份日志记录表的更多相关文章

  1. Dapper完美兼容Oracle,执行存储过程,并返回结果集。

    Dapper完美兼容Oracle,执行存储过程,并返回结果集. 这个问题,困扰了我整整两天. 刚刚用到Dapper的时候,感觉非常牛掰.特别是配合.net 4.0新特性dynamic,让我生成泛型集合 ...

  2. Oracle中执行存储过程call和exec区别

    Oracle中执行存储过程call和exec区别 在sqlplus中这两种方法都可以使用: exec pro_name(参数1..); call pro_name(参数1..); 区别: 1. 但是e ...

  3. Oracle定时执行存储过程(转)

    定时执行存储过程在平时开发中经常会用到,年前的时候自己也做了一个,由于时间关系一直没能记录,现记录下来.       首先用一个完整的例子来实现定时执行存储过程. 任务目标:每小时向test表中插入一 ...

  4. mysqldump 定时任务 执行后备份的文件为空

    #!/bin/bash mysql_host="127.0.0.1" mysql_user="root" mysql_passwd="******** ...

  5. ORACLE 定时执行存储过程

    推荐用dbms_scheduler方式更好 (2012-11-19注) /* 查询: select job,broken,what,interval,t.* from user_jobs t; job ...

  6. Oracle定时执行存储过程

    首先查看 SQL> show parameter job NAME                                 TYPE        VALUE-------------- ...

  7. oracle使用存储过程实现日志记录.sql

    --这段sql语句是用来实现oracle后台记录操作日志的,代替或者补充应用系统的操作日志. --1.对应的日志记录表----------------------------------------- ...

  8. Oracle job procedure 存储过程定时任务

    Oracle job procedure 存储过程定时任务 oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务. 一.查询系统中的job,可以查询视图 --相关视图 ...

  9. Oracle DB 执行用户管理的备份和恢复

    • 说明用户管理的备份和恢复与服务器管理的备份和恢复 之间的差异 • 执行用户管理的数据库完全恢复 • 执行用户管理的数据库不完全恢复 备份和恢复的使用类型 数据库备份和恢复的类型包括: • 用户管理 ...

随机推荐

  1. 基于Text-CNN模型的中文文本分类实战 流川枫 发表于AI星球订阅

    Text-CNN 1.文本分类 转眼学生生涯就结束了,在家待就业期间正好有一段空闲期,可以对曾经感兴趣的一些知识点进行总结. 本文介绍NLP中文本分类任务中核心流程进行了系统的介绍,文末给出一个基于T ...

  2. 最佳移动端h5自适应rem适配方案

    一.利用lib-flexible.postcss-plugin-px2rem插件 进行移动端rem适配. 1.第一 引入lib-flexible . 安装lib-flexible: npm i lib ...

  3. Jenkins系列之-—DevOps高效插件推荐【转】

    基于Jenkins及其插件生态实现自己的持续交付与DevOps平台. jenkins 插件官网 Blue Ocean Jenkins2.7以后可安装,是Jenkins的一种新视图,能够通过图形化的界面 ...

  4. HTMLTestRunner 用PyCharm执行测试成功但无法生成报告问题

    在pythoncharm中运行时,运行成功,但是没有生成测试报告这个问题 代码: if __name__ == '__main__': # 创建测试套件suite suite = unittest.T ...

  5. MySQL/MariaDB数据库的视图(VIEW)

     MySQL/MariaDB数据库的视图(VIEW) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.视图概述 1>.什么是视图 视图就是一个虚拟的表,保存有实表的查询结果 ...

  6. 下载恶意pcap包的网站

    说几个我经常用的,免费的:1.  Malware  Traffic  Analysis:  http://www.malware-traffic-analysis.net/2018/index.htm ...

  7. pycharm下site-packages文件标记为红的问题;pycharm无法识别本地site-packages问题

    当图示红框标记区域的文件夹颜色显示红色时,需要到FIle-setting里面设置好本地的运行环境,设置错误就会导致引用问题: 启动谷歌浏览器 from selenium import webdrive ...

  8. mybatis多数据库切换,(动态数据源)。

    项目中将一个库的某些标的某些数据保存到另一个库. 使用spring的aop编程动态切换数据源,代码如下,以备下次用到! 1.先将两个数据库连接,创建两个数据源,交于spring管理! <bean ...

  9. 鸡尾酒排序Cocktail Sort (双向冒泡排序)

    鸡尾酒排序 鸡尾酒排序思路,先从左边开始进行冒泡排序,第一趟冒泡排序完,最大值在的数组的最右端,然后进行第二趟排序,第二趟排序从右边开始排序,第二趟结束时,最小值在数组最左端,以此类推,每一趟排序完都 ...

  10. centos7部署etcd集群

    实验环境:centos7.4纯净版 192.168.216.130 node1 master 192.168.216.132 node2 slave 192.168.216.134 node3 sla ...