关于Oracle存储过程和调度器实现自动对数据库过期数据清除的问题

简介

数据库中的某些数据不一定要长期保存,例如:日志等数据、当保存一定时间后,系统允许删除所以系统需要定期删除那些已经过期的数据。

实现原理

1张表(SYS_DBA_CONFIG)、1个Job定时器(Job_DBA_AutoRunScript)和2个存储过程(DBA_AUTODELETE、DBA_AUTORUNSCRIPT)实现自动清理不同表中的过期数据。 通过定时器调用存储过程查表判断是否开启过期数据清理功能,如果开启调用数据清理的存储过程。

建表

建立数据库任务配置表,用来管理数据库中那些表需要定期处理。

表格类型

字段名 Type 非空 注解
NAME VARCHAR2(200) 任务执行对象名称
VALUE VARCHAR2(200) 设置保存时间(天)
TYPE VARCHAR2(200) 执行类型
ISRUN NUMBER(1,0) 是否执行
REMARK VARCHAR2(200) 对应表中判断时间的字段
COLUMNTYPE VARCHAR2(200) 字段类型

建表语法

create table SYS_DBA_CONFIG
(
 NAME  VARCHAR2(200) not null,
 value  VARCHAR2(200) not null,
 type  VARCHAR2(200) not null,
 REMARK VARCHAR2(200) not null
 ISRUN  NUMBER(1) not null,
 COLUMNTYPE VARCHAR2(200)
);

数据展示

表中的数据有两种:

  • 存储过程是否启用
  • 表格设置保存时间

创建存储过程

判断系统是否启动定期清除功能的存储过程

根据类型和是否启用查找删除数据的存储过程

CREATE OR REPLACE PROCEDURE xxx."DBA_AUTORUNSCRIPT" AS
 /*******************************************************
 功能:定期运行指定脚本V1.0
 说明:SQL语句从配置表SYS_DBA_CONFIG读取
 ********************************************************/
 v_Name        VARCHAR2(500); --Sql语句变量
 v_Value        VARCHAR2(250); --Sql语句变量
 CURSOR CS IS SELECT UPPER(Name),VALUE FROM SYS_DBA_CONFIG WHERE LOWER(TYPE)='auto_run_script' AND ISRUN = 1;
BEGIN
OPEN CS;
LOOP
FETCH CS INTO v_Name, v_Value;--获得当前记录的数据
 EXIT WHEN CS%NOTFOUND;
 dbms_output.put_line('执行脚本('||v_Name||'):'||v_Value);
 EXECUTE IMMEDIATE ('BEGIN '||v_Name||'; COMMIT; END;');
END LOOP;
END DBA_AutoRunScript;

执行删除过期数据的存储过程

根据对应的表中的对应字段和当前时间比较,如果时间大于对应的保存时间天数,删除数据。

CREATE OR REPLACE PROCEDURE xxx."DBA_AUTODELETE" AS
 /*******************************************************
 功能:根据保留天数删除数据V1.0
 说明:表名称、保存天数从配置表SYS_DBA_CONFIG读取
 ********************************************************/
 v_name     varchar2(250); --对应的表名
 v_remark    varchar2(250); --对应的表字段
 v_value    number(10); --表对应的表数据天数
 v_endTime   date; --清除的具体时间
 v_sql    varchar2(250);
 v_columntype  varchar2(20);
 CURSOR CS IS SELECT Name,VALUE,remark,columntype FROM SYS_DBA_CONFIG WHERE LOWER(TYPE)='auto_delete_table' AND ISRUN=1;
BEGIN
OPEN CS;
LOOP
FETCH CS INTO v_name, v_value,v_remark,v_columntype;--获得当前记录的数据
 EXIT WHEN CS%NOTFOUND;
 dbms_output.put_line('删除的表名:' || v_name||' 保留天数:'||v_value);
 v_endTime:=TRUNC(SYSDATE- v_value);
 if v_columntype='DATE' then
 v_sql := 'delete from ' || v_name||' where '|| v_remark||' < TRUNC(SYSDATE- '||v_value||')' ;
 dbms_output.put_line('删除的sql:' || v_sql);
 else
 v_sql := 'delete from ' || v_name||' where to_date('||v_remark||',''yyyy-mm-dd hh24:mi:ss'') < TRUNC(SYSDATE- '||v_value||')';
 dbms_output.put_line('删除的sql:' || v_sql);
 end if;
 begin
  execute immediate v_sql;
 end;
END LOOP;

END DBA_AutoDelete;

创建Jobs定时器

通过定时器启动判断系统是否启动定期清除功能的存储过程,然后存储过程再调用删除数据的存储过程完成数据清除。

begin
dbms_scheduler.create_job
(
job_name => 'Job_DBA_AutoRunScript',
job_type => 'PLSQL_BLOCK',
job_action => 'begin DBA_AutoRunScript; end;',
repeat_interval => 'FREQ=DAILY;BYHOUR=3;byminute=30',
enabled => true
);
end; 

总结

后端可以只通过维护SYS_DBA_CONFIG表来维护数据库的过期数据清除管理,不需要后端去处理删除数据的业务逻辑。

到此这篇关于Oracle存储过程和调度器实现自动对数据库过期数据清除的文章就介绍到这了,更多相关Oracle实现自动对数据库过期数据清除内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • PL/SQL中编写Oracle数据库分页的存储过程

    其实 Oracle数据库的分页还是比较容易理解的.此文以oracle数据库中的SCOTT用户的EMP表为例,用PL/SQL Developer编写一个分页存储过程,要求是:可以输入表名,每页显示记录数,当前页,返回总记录数,总页数和返回的结果集. 由于需要返回查询出来的结果集,需要在PL/SQL中创建一个package,这个包里面定义一个refcursor类型,用于记录sql语句查询出来的结果集.创建包的代码如下: create or replace package pagingPackage

  • Oracle中 关于数据库存储过程和存储函数的使用

    存储过程和存储函数指存储在数据库中供所有用户程序调用的子程序叫存储过程.存储函数.存储过程没有返回值.存储函数有返回值 创建存储过程      用CREATE PROCEDURE命令建立存储过程和存储函数. 语法:create [or replace] PROCEDURE过程名(参数列表) AS         PLSQL子程序体: 存储过程示例:为指定的职工在原工资的基础上长10%的工资 /*为指定的职工在原工资的基础上长10%的工资,并打印工资前和工资后的工资*/SQL> create or

  • oracle数据库中查看系统存储过程的方法

    复制代码 代码如下: select line,text from dba_source where name='PRO_E_F_ORDER_STAT'; select object_name,object_type from dba_objects where object_type='PROCEDURE';

  • Oracle存储过程之数据库中获取数据实例

    怎样才能将在表A取得的数据插入另一个表B中? (1)对于表A和表B两个表结构完全相同的话[字段个数,相应字段的类型等等],可以使用 insert INTO B select * FROM A; insert INTO B(field1,field2,field3) select A.field1,A.field2,A.field3 from A; (2) 对于两个表如果字段数不一样,但是有几个字段的结构一样时[类似于父子关系],必须使用 insert INTO B(field1,field2)

  • 关于Oracle存储过程和调度器实现自动对数据库过期数据清除的问题

    简介 数据库中的某些数据不一定要长期保存,例如:日志等数据.当保存一定时间后,系统允许删除所以系统需要定期删除那些已经过期的数据. 实现原理 1张表(SYS_DBA_CONFIG).1个Job定时器(Job_DBA_AutoRunScript)和2个存储过程(DBA_AUTODELETE.DBA_AUTORUNSCRIPT)实现自动清理不同表中的过期数据. 通过定时器调用存储过程查表判断是否开启过期数据清理功能,如果开启调用数据清理的存储过程. 建表 建立数据库任务配置表,用来管理数据库中那些表

  • FreeRTOS进阶之调度器启动过程分析

    目录 使用FreeRTOS,一个最基本的程序架构如下所示: int main(void) { 必要的初始化工作; 创建任务1; 创建任务2; ... vTaskStartScheduler(); /*启动调度器*/ while(1); } 任务创建完成后,静态变量指针pxCurrentTCB(见<FreeRTOS进阶之任务创建完全解析>第7节内容)指向优先级最高的就绪任务.但此时任务并不能运行,因为接下来还有关键的一步:启动FreeRTOS调度器. 调度器是FreeRTOS操作系统的核心,主要

  • Mysql存储过程、触发器、事件调度器使用入门指南

    目录 一.存储过程的简单使用 二.存储过程中的变量 三.变量的作用域 四.存储过程参数 五.逻辑控制语句 1.条件语句 2.循环语句 3.case分支 六.游标 七.自定义函数 八.触发器 九.事件 存储过程(Stored Procedure)是一种在数据库中存储复杂程序的数据库对象.为了完成特定功能的SQL语句集,经过编译创建并保存在数据库中. 一.存储过程的简单使用 创建存储过程 create procedure test() begin select * from users; end;

  • 老生常谈mysql event事件调度器(必看篇)

    概述 MySQL也有自己的事件调度器,简单地可以理解为linux的crontab job,不过对于SQL应用来说,它的功能更齐全,也更易于维护.个人感觉如果数量创建太多的话,也可能影响DB性能,且不易调试. MySQL事件调度器的主要内容 总开关 参数event_scheduler为事件调度器的总开关,一般来说设置为ON或者OFF就好,不建议设置成disabled,如果设置为ON,show processlist可看到该线程 创建,修改,查看等语法 关于如何创建,修改event这里不做叙述,创建

  • MySQL Event Scheduler(事件调度器)

    一.概述 事件调度器是在 MySQL 5.1 中新增的另一个特色功能,可以作为定时任务调度器,取代部分原先只能用操作系统任务调度器才能完成的定时功>能.例如,Linux 中的 crontabe 只能精确到每分钟执行一次,而 MySQL 的事件调度器则可以实现每秒钟执行一个任务,这在一些对实时性要>求较高的环境下就非常实用了. 事件调度器是定时触发执行的,在这个角度上也可以称作是"临时的触发器".触发器只是针对某个表产生的事件执行一些语句,而事件调度器则是在某一个(间隔)时间

  • 分析Linux内核调度器源码之初始化

    一.导语 调度器(Scheduler)子系统是内核的核心子系统之一,负责系统内 CPU 资源的合理分配,需要能处理纷繁复杂的不同类型任务的调度需求,还需要能处理各种复杂的并发竞争环境,同时还需要兼顾整体吞吐性能和实时性要求(本身是一对矛盾体),其设计与实现都极具挑战. 为了能够理解 Linux 调度器的设计与实现,我们将以 Linux kernel 5.4 版本(TencentOS Server3 默认内核版本)为对象,从调度器子系统的初始化代码开始,分析 Linux 内核调度器的设计与实现.

  • 分解oracle存储过程或函数调试过程步骤

    目录 第一步:选择调试模式 第二步:输入测试数据 第三步:点击开始调试器 第四步:输入要显示的变量名 第五步:点击单步调试 第六步:逐步点击单步调试,并查看变量的变化 第七步:不断重复前六步,直到函数或存储过程调试完成. 第一步:选择调试模式 找到数据库里functions包下需要调试的函数或存储过程,然后选中这个函数(或存储过程),单击右键,出现如下图所示,选中测试功能,进入调试模式. 第二步:输入测试数据 第三步:点击开始调试器 第四步:输入要显示的变量名 要输入的变量名,可以是输入的参数名

  • 深入理解SpringMVC中央调度器DispatcherServlet

    目录 SpringMVC请求处理过程: SrpingMVC容器和spring IOC容器关系 基于maven创建的一个springmvc工程. 1.创建maven项目中使用到了自动创建骨架 2.配置java 文件 和资源文件 3.添加jar包** 4.springMVC项目web.xml初始化配置中央调度器以及自定义springmvc.xml文件 web.xml: springMVC是spring的一个模块,专门做web的. SpringMVC请求处理过程: 请求发送,根据url-pattern

  • boost.asio框架系列之调度器io_service

    IO模型 io_service对象是asio框架中的调度器,所有异步io事件都是通过它来分发处理的(io对象的构造函数中都需要传入一个io_service对象). asio::io_service io_service; asio::ip::tcp::socket socket(io_service); 在asio框架中,同步的io主要流程如下: 应用程序调用IO对象成员函数执行IO操作 IO对象向io_service 提出请求. io_service 调用操作系统的功能执行连接操作. 操作系统

  • Oracle存储过程与函数的详细使用教程

    目录 一.存储过程 1.存储过程的创建 2.存储过程的调用及删除 3.存储过程的使用 4.存储过程的查询 二.函数 1.函数的创建 2.函数的调用与删除 3.函数的使用 4.函数的查询 补充:存储过程与存储函数的区别和联系 总结 一.存储过程 存储过程是一种命名的PL/SQL数据块,存储在Oracle数据库中,可以被用户调用.存储过程可以包含参数,也可以没有参数,它一般没有返回值.存储过程是事先编译好的代码,再次调用的时候不需再次编译,因此程序的运行效率非常高. 1.存储过程的创建 语法如下 c

随机推荐