佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > PL/SQL實(shí)現(xiàn)Oracle數(shù)據(jù)庫(kù)任務(wù)調(diào)度

PL/SQL實(shí)現(xiàn)Oracle數(shù)據(jù)庫(kù)任務(wù)調(diào)度

熱門標(biāo)簽:Linux服務(wù)器 百度競(jìng)價(jià)排名 呼叫中心市場(chǎng)需求 地方門戶網(wǎng)站 AI電銷 服務(wù)外包 鐵路電話系統(tǒng) 網(wǎng)站排名優(yōu)化
正在看的ORACLE教程是:PL/SQL實(shí)現(xiàn)Oracle數(shù)據(jù)庫(kù)任務(wù)調(diào)度。摘要:本文主要就數(shù)據(jù)庫(kù)恢復(fù)與系統(tǒng)任務(wù)的調(diào)度,在結(jié)合一般性的數(shù)據(jù)庫(kù)后臺(tái)處理的經(jīng)驗(yàn)上,提出較為實(shí)用而新穎的解決方法,拓寬了數(shù)據(jù)庫(kù)后臺(tái)開(kāi)發(fā)的思路。

  關(guān)鍵詞:數(shù)據(jù)恢復(fù),任務(wù)調(diào)度,ORACLE,PL/SQL

  在數(shù)據(jù)庫(kù)操作中時(shí)常會(huì)有這樣的情況發(fā)生,由于一時(shí)的疏忽而誤刪或誤改了一些重要的數(shù)據(jù),另外還有一些重要的任務(wù)需要周期性地運(yùn)行。顯然,前一類問(wèn)題主要是數(shù)據(jù)備份與恢復(fù)方面的,而后一類則主要是系統(tǒng)的任務(wù)調(diào)度。本文將針對(duì)這兩類問(wèn)題,從應(yīng)用程序開(kāi)發(fā)角度給出一個(gè)解決方法。

  一.技術(shù)基礎(chǔ)

  由于本文是使用PL/SQL作為開(kāi)發(fā)平臺(tái)來(lái)提供解決方案,所以首先了解相關(guān)的背景知識(shí)。

  PL/SQL本身只是作為SQL語(yǔ)句的一個(gè)補(bǔ)充,通過(guò)引入過(guò)程化的概念來(lái)增強(qiáng)數(shù)據(jù)庫(kù)處理能力。然而,相對(duì)于C,C++,JAVA等過(guò)程化語(yǔ)言來(lái)說(shuō),PL/SQL的處理功能依然不夠強(qiáng)大。為此,Oracle數(shù)據(jù)庫(kù)提供了大量的應(yīng)用程序開(kāi)發(fā)包,來(lái)增強(qiáng)應(yīng)用程序開(kāi)發(fā)能力。根據(jù)本文的主題,介紹如下兩個(gè)開(kāi)發(fā)包:DBMS_FLASHBACK和DBMS_JOB。

  1. DBMS_FLASHBACK包主要是用來(lái)進(jìn)行倒敘查詢使用的,即通過(guò)設(shè)置查詢時(shí)間來(lái)確定該時(shí)刻下的查詢結(jié)果。一般情況下,我們平時(shí)使用的查詢是查詢當(dāng)前時(shí)間(sysdate)下的數(shù)據(jù)。使用DBMS_FLASHBACK包就可以查詢以前數(shù)據(jù)的狀態(tài),這一功能對(duì)于誤處理的情形而言就顯得極為重要。下面是該包中的兩個(gè)主要函數(shù)介紹:

  ·Enable與disable:分別是啟動(dòng)和關(guān)閉倒敘查詢功能。應(yīng)該注意的是,每次啟動(dòng)倒敘查詢之前應(yīng)首先關(guān)閉倒敘模式。

  ·Enable_at_time:設(shè)置查詢的時(shí)間點(diǎn),它是以當(dāng)前時(shí)間為起點(diǎn)進(jìn)行設(shè)置的。

  2. DBMS_JOB包是用來(lái)對(duì)PL/SQL塊進(jìn)行調(diào)度的實(shí)用包,它允許PL/SQL塊在指定的時(shí)間內(nèi)自動(dòng)運(yùn)行,類似于VC中的Settimer這樣的定時(shí)器。為便于該包的運(yùn)行,需要首先設(shè)置兩個(gè)init.ora參數(shù):

  ·JOB_QUEUE_PROCESS指定啟動(dòng)的后臺(tái)處理數(shù)。如果它是0或沒(méi)有被設(shè)置,將沒(méi)有后臺(tái)處理進(jìn)入作業(yè),它們也就不會(huì)運(yùn)行。 

  ·JOB_QUEUE_INTERVAL以秒為單位,指定每一個(gè)過(guò)程在檢查新的作業(yè)前等待的時(shí)間。在JOB_QUEUE_INTERVA所指定的時(shí)間內(nèi),一個(gè)作業(yè)最多只能運(yùn)行一次。

  設(shè)置好這兩個(gè)參數(shù)后,就可對(duì)程序進(jìn)行調(diào)度了,該包主要使用SUBMIT函數(shù)進(jìn)行調(diào)度,該函數(shù)的原型為:

submit(返回的作業(yè)號(hào),程序過(guò)程名,sysdate,下次運(yùn)行的時(shí)間);

  二.?dāng)?shù)據(jù)恢復(fù)

  數(shù)據(jù)恢復(fù)是數(shù)據(jù)庫(kù)本身一個(gè)極其重要的功能,通常重要的數(shù)據(jù)可以通過(guò)其系統(tǒng)的數(shù)據(jù)備份功能來(lái)實(shí)現(xiàn),所以在實(shí)際的開(kāi)發(fā)中,重要的數(shù)據(jù)往往容易恢復(fù),反而是一些平常的數(shù)據(jù)因?yàn)檎`操作而引起一些麻煩。

  對(duì)于有經(jīng)驗(yàn)的開(kāi)發(fā)人員來(lái)說(shuō),往往會(huì)對(duì)那些開(kāi)發(fā)需要的基表(基表就是提供數(shù)據(jù)源的數(shù)據(jù)表)做一些備份。這樣,即使以后出現(xiàn)一些數(shù)據(jù)誤操作也不會(huì)導(dǎo)致重大的事故。

  更為實(shí)用而又很少為開(kāi)發(fā)人員所使用的方法就是采用倒敘查詢,鑒于前面已經(jīng)有了一定的技術(shù)鋪墊,現(xiàn)在就可以使用DBMS_FLASHBACK包來(lái)對(duì)數(shù)據(jù)進(jìn)行恢復(fù)了。為方便講述,假定一個(gè)基表emp_table,其表記錄如下: 


  即此表僅有3條記錄,那么由于對(duì)數(shù)據(jù)庫(kù)的誤操作,導(dǎo)致第一條記錄被刪除,那么執(zhí)行下面的SQL語(yǔ)句:


  其執(zhí)行結(jié)果為:


  由于已經(jīng)執(zhí)行了提交操作(COMMIT),所以無(wú)法進(jìn)行回滾(ROLLBACK),這樣原來(lái)的數(shù)據(jù)就無(wú)法用正常方法進(jìn)行恢復(fù)。不過(guò),由于誤操作的時(shí)候在不久以前(假設(shè)是5分鐘之前),在這種情況下,可以使用DBMS_FLASHBACK包來(lái)恢復(fù)數(shù)據(jù),可以在SQL*PLUS里鍵入如下代碼:

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

  此時(shí),將數(shù)據(jù)庫(kù)調(diào)整到5分鐘之前的狀態(tài),如果再執(zhí)行查詢表的命令就會(huì)為如下結(jié)果:



  那么就可以在此時(shí)將其數(shù)據(jù)備份到emp_table_bk,即:


  這樣,就把以前誤操作的數(shù)據(jù)給恢復(fù)回來(lái)了。

  從上面的結(jié)果看的出,調(diào)用DBMS_FLASHBACK包的ENABLE_AT_TIME函數(shù),可以將數(shù)據(jù)庫(kù)的當(dāng)前查詢時(shí)間調(diào)整到以前,這樣給數(shù)據(jù)恢復(fù)提供了幫助。

  在使用DBMS_FLASHBACK包的時(shí)候還應(yīng)該注意以下幾點(diǎn):

  ·倒敘查詢是有前提的,即該數(shù)據(jù)庫(kù)必須具有撤消管理功能。具體做法是,DBA應(yīng)該建立一個(gè)撤消表空間,并啟動(dòng)自動(dòng)撤消管理,并建立一個(gè)撤消保留時(shí)間窗。這樣,Oracle將在撤消表空間中維護(hù)足夠的撤消信息以便在保留時(shí)間內(nèi)支持倒敘查詢。 

  ·由于撤消表空間的大小直接決定了倒敘查詢執(zhí)行的成敗。即撤消表空間越大,那么可以查詢的時(shí)間可以越早,那么對(duì)于一般的撤消表空間的大小,為了保證倒敘查詢的成功,盡量查詢5天以內(nèi)的數(shù)據(jù),這樣成功的可能性更高一些。 

  三.任務(wù)調(diào)度

  在UNIX系統(tǒng)中,任務(wù)與進(jìn)程的概念是等同的,即當(dāng)系統(tǒng)執(zhí)行一段程序代碼時(shí)會(huì)自動(dòng)給其分配一個(gè)進(jìn)程號(hào)和任務(wù)號(hào),這樣使用進(jìn)程號(hào)和任務(wù)號(hào)就可以對(duì)該任務(wù)進(jìn)行操作(如掛起,停止,啟動(dòng)等)。而Oracle數(shù)據(jù)庫(kù)內(nèi)部也存在任務(wù)調(diào)度,比如,需要對(duì)某一操作進(jìn)行周期性的執(zhí)行,或者是在某事件發(fā)生的時(shí)候才執(zhí)行。一般性的做法是使用觸發(fā)器,即將所有操作封裝在觸發(fā)器里,然后通過(guò)指定觸發(fā)事件即可將該操作等待執(zhí)行。另外,還可以直接利用操作系統(tǒng)來(lái)實(shí)現(xiàn),比如在Windows平臺(tái)就可以編寫(xiě)Windows腳本并結(jié)合"任務(wù)計(jì)劃"來(lái)實(shí)施;如果在Unix平臺(tái),就可以寫(xiě)Shell來(lái)實(shí)現(xiàn)任務(wù)的周期性的執(zhí)行操作。

  而這里主要是采用ORACLE數(shù)據(jù)庫(kù)的DBMS_JOB包來(lái)實(shí)現(xiàn)的。

  例如,由于每個(gè)月都需要對(duì)員工進(jìn)行考評(píng)以進(jìn)行薪水的調(diào)整,那么就需要對(duì)emp_table表進(jìn)行更新處理。更新處理代碼如下:


  為了定期每個(gè)月都運(yùn)行上面的程序,可以執(zhí)行如下代碼:


  submit執(zhí)行后將使得salary_upt過(guò)程馬上執(zhí)行。在上面的代碼中,v_jobNum是該作業(yè)返回的作業(yè)號(hào)(任務(wù)號(hào)),后面兩個(gè)時(shí)間分別為開(kāi)始時(shí)間和結(jié)束時(shí)間,所以salary_upt過(guò)程將每隔30天執(zhí)行一次salary_upt程序,以此達(dá)到了定期更新的目的。

  如果要禁止該作業(yè)的繼續(xù)執(zhí)行,可以執(zhí)行下面的命令:


  使用DBMS_JOB包來(lái)實(shí)現(xiàn)任務(wù)的調(diào)度便于跟應(yīng)用程序集成,有時(shí)候這樣處理更為的便捷。

  四.小結(jié)

  很多時(shí)候,數(shù)據(jù)庫(kù)的功能可以通過(guò)應(yīng)用程序來(lái)進(jìn)行擴(kuò)展,對(duì)于進(jìn)行后臺(tái)數(shù)據(jù)庫(kù)開(kāi)發(fā)操作的用戶而言,除了對(duì)數(shù)據(jù)庫(kù)整體架構(gòu)熟悉以外,掌握一定的應(yīng)用程序開(kāi)發(fā)能力是很有必要的。系統(tǒng)通過(guò)本文能夠給讀者一定的啟發(fā)。 

  本文的開(kāi)發(fā)環(huán)境為:

  服務(wù)器端:UNIX+ORACLE9.2

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

  本文中的代碼在上述環(huán)境已調(diào)試通過(guò)。

您可能感興趣的文章:
  • oracle復(fù)習(xí)筆記之PL/SQL程序所要了解的知識(shí)點(diǎn)
  • PL/SQL Dev連接Oracle彈出空白提示框的解決方法分享
  • 64位win7下pl/sql無(wú)法連接oracle解決方法
  • Oracle中PL/SQL中if語(yǔ)句的寫(xiě)法介紹
  • Oracle中在pl/sql developer修改表的2種方法
  • ORACLE PL/SQL 觸發(fā)器編程篇介紹
  • Oracle 10G:PL/SQL正規(guī)表達(dá)式(正則表達(dá)式)手冊(cè)
  • 在Oracle PL/SQL中游標(biāo)聲明中表名動(dòng)態(tài)變化的方法
  • Oracle PL/SQL語(yǔ)言入門基礎(chǔ)
  • Oracle PL/SQL入門案例實(shí)踐
  • Oracle PL/SQL入門慨述
  • Oracle教程之pl/sql簡(jiǎn)介

標(biāo)簽:銅川 黃山 崇左 湘潭 蘭州 湖南 衡水 仙桃

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PL/SQL實(shí)現(xiàn)Oracle數(shù)據(jù)庫(kù)任務(wù)調(diào)度》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    奉新县| 黄冈市| 定远县| 江川县| 上蔡县| 鹤峰县| 庆安县| 斗六市| 富源县| 乳山市| 沙河市| 安庆市| 察雅县| 阿拉善右旗| 阿瓦提县| 信宜市| 阿克| 微博| 清徐县| 铁岭县| 铁力市| 青浦区| 石城县| 天全县| 苗栗市| 县级市| 罗甸县| 贵州省| 利津县| 大庆市| 新绛县| 阳泉市| 绿春县| 嘉祥县| 延寿县| 平山县| 新兴县| 马公市| 岫岩| 榆社县| 蓝山县|