PL/SQL实现Oracle数据库任务调度

正在看的ORACLE教程是:PL/SQL实现Oracle数据库任务调度。摘要:本文主要就数据库恢复与系统任务的调度,在结合一般性的数据库后台处理的经验上,提出较为实用而新颖的解决方法,拓宽了数据库后台开发的思路。

  关键词:数据恢复,任务调度,ORACLE,PL/SQL

  在数据库操作中时常会有这样的情况发生,由于一时的疏忽而误删或误改了一些重要的数据,另外还有一些重要的任务需要周期性地运行。显然,前一类问题主要是数据备份与恢复方面的,而后一类则主要是系统的任务调度。本文将针对这两类问题,从应用程序开发角度给出一个解决方法。

  一.技术基础

  由于本文是使用PL/SQL作为开发平台来提供解决方案,所以首先了解相关的背景知识。

  PL/SQL本身只是作为SQL语句的一个补充,通过引入过程化的概念来增强数据库处理能力。然而,相对于C,C++,JAVA等过程化语言来说,PL/SQL的处理功能依然不够强大。为此,Oracle数据库提供了大量的应用程序开发包,来增强应用程序开发能力。根据本文的主题,介绍如下两个开发包:DBMS_FLASHBACK和DBMS_JOB。

  1. DBMS_FLASHBACK包主要是用来进行倒叙查询使用的,即通过设置查询时间来确定该时刻下的查询结果。一般情况下,我们平时使用的查询是查询当前时间(sysdate)下的数据。使用DBMS_FLASHBACK包就可以查询以前数据的状态,这一功能对于误处理的情形而言就显得极为重要。下面是该包中的两个主要函数介绍:

  ·Enable与disable:分别是启动和关闭倒叙查询功能。应该注意的是,每次启动倒叙查询之前应首先关闭倒叙模式。

  ·Enable_at_time:设置查询的时间点,它是以当前时间为起点进行设置的。

  2. DBMS_JOB包是用来对PL/SQL块进行调度的实用包,它允许PL/SQL块在指定的时间内自动运行,类似于VC中的Settimer这样的定时器。为便于该包的运行,需要首先设置两个init.ora参数:

  ·JOB_QUEUE_PROCESS指定启动的后台处理数。如果它是0或没有被设置,将没有后台处理进入作业,它们也就不会运行。

  ·JOB_QUEUE_INTERVAL以秒为单位,指定每一个过程在检查新的作业前等待的时间。在JOB_QUEUE_INTERVA所指定的时间内,一个作业最多只能运行一次。

  设置好这两个参数后,就可对程序进行调度了,该包主要使用SUBMIT函数进行调度,该函数的原型为:

submit(返回的作业号,程序过程名,sysdate,下次运行的时间);

  二.数据恢复

  数据恢复是数据库本身一个极其重要的功能,通常重要的数据可以通过其系统的数据备份功能来实现,所以在实际的开发中,重要的数据往往容易恢复,反而是一些平常的数据因为误操作而引起一些麻烦。

  对于有经验的开发人员来说,往往会对那些开发需要的基表(基表就是提供数据源的数据表)做一些备份。这样,即使以后出现一些数据误操作也不会导致重大的事故。

  更为实用而又很少为开发人员所使用的方法就是采用倒叙查询,鉴于前面已经有了一定的技术铺垫,现在就可以使用DBMS_FLASHBACK包来对数据进行恢复了。为方便讲述,假定一个基表emp_table,其表记录如下:

  即此表仅有3条记录,那么由于对数据库的误操作,导致第一条记录被删除,那么执行下面的SQL语句:

  其执行结果为:

  由于已经执行了提交操作(COMMIT),所以无法进行回滚(ROLLBACK),这样原来的数据就无法用正常方法进行恢复。不过,由于误操作的时候在不久以前(假设是5分钟之前),在这种情况下,可以使用DBMS_FLASHBACK包来恢复数据,可以在SQL*PLUS里键入如下代码:

execute dbms_flashback.enable_at_time(sysdate-5/1440);

  此时,将数据库调整到5分钟之前的状态,如果再执行查询表的命令就会为如下结果:

  那么就可以在此时将其数据备份到emp_table_bk,即:

  这样,就把以前误操作的数据给恢复回来了。

  从上面的结果看的出,调用DBMS_FLASHBACK包的ENABLE_AT_TIME函数,可以将数据库的当前查询时间调整到以前,这样给数据恢复提供了帮助。

  在使用DBMS_FLASHBACK包的时候还应该注意以下几点:

  ·倒叙查询是有前提的,即该数据库必须具有撤消管理功能。具体做法是,DBA应该建立一个撤消表空间,并启动自动撤消管理,并建立一个撤消保留时间窗。这样,Oracle将在撤消表空间中维护足够的撤消信息以便在保留时间内支持倒叙查询。

  ·由于撤消表空间的大小直接决定了倒叙查询执行的成败。即撤消表空间越大,那么可以查询的时间可以越早,那么对于一般的撤消表空间的大小,为了保证倒叙查询的成功,尽量查询5天以内的数据,这样成功的可能性更高一些。

  三.任务调度

  在UNIX系统中,任务与进程的概念是等同的,即当系统执行一段程序代码时会自动给其分配一个进程号和任务号,这样使用进程号和任务号就可以对该任务进行操作(如挂起,停止,启动等)。而Oracle数据库内部也存在任务调度,比如,需要对某一操作进行周期性的执行,或者是在某事件发生的时候才执行。一般性的做法是使用触发器,即将所有操作封装在触发器里,然后通过指定触发事件即可将该操作等待执行。另外,还可以直接利用操作系统来实现,比如在Windows平台就可以编写Windows脚本并结合"任务计划"来实施;如果在Unix平台,就可以写Shell来实现任务的周期性的执行操作。

  而这里主要是采用ORACLE数据库的DBMS_JOB包来实现的。

  例如,由于每个月都需要对员工进行考评以进行薪水的调整,那么就需要对emp_table表进行更新处理。更新处理代码如下:

  为了定期每个月都运行上面的程序,可以执行如下代码:

  submit执行后将使得salary_upt过程马上执行。在上面的代码中,v_jobNum是该作业返回的作业号(任务号),后面两个时间分别为开始时间和结束时间,所以salary_upt过程将每隔30天执行一次salary_upt程序,以此达到了定期更新的目的。

  如果要禁止该作业的继续执行,可以执行下面的命令:

  使用DBMS_JOB包来实现任务的调度便于跟应用程序集成,有时候这样处理更为的便捷。

  四.小结

  很多时候,数据库的功能可以通过应用程序来进行扩展,对于进行后台数据库开发操作的用户而言,除了对数据库整体架构熟悉以外,掌握一定的应用程序开发能力是很有必要的。系统通过本文能够给读者一定的启发。

  本文的开发环境为:

  服务器端:UNIX+ORACLE9.2

  客户端:WINDOWS2000 PRO+TOAD(或者SQL*PLUS)

  本文中的代码在上述环境已调试通过。

(0)

相关推荐

  • 在Oracle PL/SQL中游标声明中表名动态变化的方法

    /*     小弟刚刚接触ORACLE存储过程,有一个问题向各位同行求教,小弟写了一个存储过程,其目的是接收一个参数作为表名,然后查询该表中的全部记录的某一个字段的内容导入到另一个表中.     (     tabname in varchar     )     is     v_servicesname tabname.服务类型%type; --这个变量就是用来存放所要取得的字段内容,但不知该如何定义     cursor curSort1 is select 服务类型 from tabna

  • Oracle中在pl/sql developer修改表的2种方法

    一.方式一 select * from student for update student表需要操作人修改完commit之后才可以做其他的操作,否则该表会被锁住. 二.方式二 select t.*,t.rowid from student t 在pl/sql developer中右击某表,显示的就是该语句,这样做不会将该表锁住. 想修改某几个字段也没有问题select num,name,t.rowid from student t.

  • Oracle 10G:PL/SQL正规表达式(正则表达式)手册

    Oracle 的正规表达式的实施是以各种 SQL 函数和一个 WHERE 子句操作符的形式出现的.如果您不熟悉正规表达式,那么这篇文章可以让您了解一下这种新的极其强大然而表面上有点神秘的功能.已经对正规表达式很熟悉的读者可以了解如何在 Oracle SQL 语言的环境中应用这种功能. 什么是正规表达式? 正规表达式由一个或多个字符型文字和/或元字符组成.在最简单的格式下,正规表达式仅由字符文字组成,如正规表达式 cat.它被读作字母 c,接着是字母 a 和 t,这种模式匹配 cat.locati

  • ORACLE PL/SQL 触发器编程篇介绍

    1.基本概念 两种功能:完成由数据库的完整性约束难以完成的复杂业务规则的约束:监视数据库的各种操作,实现审计功能. 触发器分为:DML触发器(对表或视图执行DML操作时触发),INSTEAD OF触发器(只定义在视图上,替代实际的操作语句),系统触发器(对数据库系统进行操作时触发,如DDL语句.启动或关闭数据库等) 触发事件: 上述触发器中括号内容都是触发事件. 触发条件: WHEN子句 触发对象:包括表.视图.模式.数据库. 触发操作:触发器自动执行的程序. 触发时机:触发器相对操作执行的时间

  • Oracle PL/SQL语言入门基础

    正在看的ORACLE教程是:Oracle PL/SQL语言入门基础.PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本文将讲述PL/SQL基础语法,结构和组件.以及如何设计并执行一个PL/SQL程序. PL/SQL的优点 从版本6开始PL/SQL就被可靠的整合到ORACLE中了,一旦掌握PL/SQL的优点以及其独有的数据管理的便利性,那么你很难想象ORACLE缺了PL

  • oracle复习笔记之PL/SQL程序所要了解的知识点

    复习内容: PL/SQL的基本语法.记录类型.流程控制.游标的使用. 异常处理机制.存储函数/存储过程.触发器. 为方便大家跟着我的笔记练习,为此提供数据库表文件给大家下载:点我下载 为了要有输出的结果,在写PL/SQL程序前都在先运行这一句: set serveroutput on 结构: declare --声明变量.类型.游标 begin --程序的执行部分(类似于java里的main()方法) exception --针对begin块中出现的异常,提供处理的机制 --when...the

  • Oracle PL/SQL入门慨述

    正在看的ORACLE教程是:Oracle PL/SQL入门慨述.一.PL/SQL出现的目的 结构化查询语言(Structured Query Language,简称SQL)是用来访问关系型数据库一种通用语言,它属于第四代语言(4GL),其执行特点是非过程化,即不用指明执行的具体方法和途径,而是简单的调用相应语句来直接取得结果即可.显然,这种不关注任何实现细节的语言对于开发者来说有着极大的便利. 然而,对于有些复杂的业务流程又要求相应的程序来描述,那么4GL就有些无能为力了.PL/SQL的出现正是

  • 64位win7下pl/sql无法连接oracle解决方法

    1.pl/sql无法连接本机的oracle(ORA 12154:TNS:无法解析指定的连接标识符) 解决方法:pl/sql不能安装在Program Files(x86)文件夹下,要安装在Program Files文件夹下 2.pl/sql无法连接远程oracle(ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务) 解决方法:①在linux下找到oracle目录下的listener.ora,用vi编辑②下面红色为添加部分,其中GLOBAL_DBNAME要与客户机配置的or

  • Oracle教程之pl/sql简介

    本文实例讲述了Oracle的pl/sql.分享给大家供大家参考,具体如下: 一.pl/sql 是什么 pl/sql(procedural language/sql)是oracle在标准的sql语言上的扩展. pl/sql不仅允许嵌入sql语言,还可以定义变量和常量,允许使用条件语句和循环语句,允许使用例外处理各种错误,这样使得它的功能变得更加强大. 二.为什么要学pl/sql 1.提高应用程序的运行性能 2.模块化的设计思想(分页的过程,订单的过程,转账的过程..) 3.减少网络传输量 4.提高

  • PL/SQL Dev连接Oracle弹出空白提示框的解决方法分享

    没办法,只能自己研究,经过大概一天时间吧,还是搞好了,写个总结. 出现这种问题,解决方法大概有这几种: 1.权限不够,导致弹出空吧提示框.(直接上链接) http://jingyan.baidu.com/article/066074d6760959c3c21cb0d6.html 就PL/SQL图标上点右键---属性---兼容性--管理员身份运行此程序的勾打上,即可 2.环境变量没设对. ①在安装oracle服务器的机器上搜索下列文件,oci.dllocijdbc10.dll(其中10代表orac

  • Oracle中PL/SQL中if语句的写法介绍

    复制代码 代码如下: /*If语句:判断用户输入的数字.*/set serveroutput on --接收键盘输入accept num prompt '请输入一个数字:'; declare   --将屏幕输入的数字付给变量  pnum number := #begin  if pnum = 0 then dbms_output.put_line('您输入的是0');  end if; if pnum = 1 then dbms_output.put_line('您输入的是1');  e

  • Oracle PL/SQL入门案例实践

    正在看的ORACLE教程是:Oracle PL/SQL入门案例实践. 前面已经了解了关于PL/SQL编程的基础,本文将结合一个案例来加深对这些知识点的理解. 一. 案例介绍 某数据库有两张表,是关于某公司员工资料.薪水和部门信息的,它们分别是emp表和dept表,两张表的结构如下: 要求如下: 1.按照上表结构建立相应的表,并每张表写入5组合法数据. 2.操纵相关表,使得"技术部"的员工的薪水上涨20%. 3.建立日志,追踪薪水变动情况. 4.建立测试包. 二. 案例的分析与实现 从前

随机推荐