Oracle 10g實(shí)現(xiàn)存儲(chǔ)過程異步調(diào)用 |
發(fā)布時(shí)間: 2012/8/29 17:46:13 |
DBMS_JOB是什么? 主要用來在后臺(tái)運(yùn)行程序,是數(shù)據(jù)庫(kù)中一個(gè)極好的工具. 可用于自動(dòng)調(diào)整調(diào)度例程任務(wù),例如分析數(shù)據(jù)表,執(zhí)行一些歸檔操作,清理草稿表等等. 使用語(yǔ)法說明. JOB: 一個(gè)作業(yè)標(biāo)識(shí)符,由系統(tǒng)來分配(OUT參數(shù)). WHAT: 將要運(yùn)行的SQL文本,必須是有效的PL/SQL語(yǔ)句或一段代碼. 例如: 運(yùn)行存儲(chǔ)過程P,可以傳遞字符串P;(包括分號(hào))給這個(gè)例程。無論在WHAT參數(shù)中提交什么,將被封裝成如下PL/SQL塊: Declare Job Binary_Integer := :Job; Next_Date Date := :Mydate; Broken Boolean := False; Begin What :Mydate := Next_Date; If Broken Then :B := 1; Else :B := 0; End If; End; NEXT_DATE: 日期函數(shù)字符串,用來計(jì)算作業(yè)下次運(yùn)行的時(shí)間. NO_PARSE: 確定WHAT參數(shù)在提交時(shí)是否進(jìn)行有效性分析。 INSTANCE: 只得在松耦合聚簇的機(jī)器上,在并行服務(wù)器模式(一個(gè)Oracle可以運(yùn)行的模式)下才有意義,這將指定在哪個(gè)實(shí)例上作業(yè)可以執(zhí)行. FORCE: 只有在并行服務(wù)器模式下才有意義. 如設(shè)置為True(默認(rèn)值),可以使用任何實(shí)例數(shù)據(jù)庫(kù)提交作業(yè), 如設(shè)置為False, 相關(guān)實(shí)例不可用,提交請(qǐng)求將失敗. 在DBMS_JOB程序包中也有其它入口點(diǎn). SUBMIT是用來調(diào)度作業(yè)的一個(gè),其他的允許操作已調(diào)度的作業(yè),執(zhí)行操作,如RUN,REMOVE和CHANGE操作. 示例 利用DBMS_Job包功能, 將存儲(chǔ)過程的執(zhí)行集中提交給Oracle Job來處理, 客戶端無需等待. 1. 創(chuàng)建一張表,包含每個(gè)參數(shù)的字段,再加一個(gè)ID主碼字段. Create Table run_movedetail ( ID number primary key, Param1 varchar2(255), Param1 varchar2(255), RunDate Date ) 此表不僅作為將要提交的處理過程排隊(duì)的地方,而且當(dāng)提交時(shí),也可作為已提交處理過程保存永久日志的地方. 2. 創(chuàng)建fast_movedetail存儲(chǔ)過程(創(chuàng)建作業(yè)ID及把各參數(shù)Insert到run_movedetail). create or replace procedure fast_movedetail(p_Param1 varchar2,p_Param2 varchar2) As L_job number; Begin dbms_job.submit(L_job,’background_movedetail(JOB);’); Insert into run_movedetail(ID,Param1,Parma2) values (L_job, p_Param1, p_Param2); End; 該例程將提交一項(xiàng)作業(yè)background_movedetail,并且將它傳遞給JOB參數(shù). 3. 創(chuàng)建background_movedetail存儲(chǔ)過程. Create or replace procedure background_movedetail(p_job in number) As L_rec run_movedetail%rowtype; Begin Select * into L_rec from run_movedetail where id = p_job; Pr_movedetail(L_rec.Param1,L_rec.Param2); //業(yè)務(wù)存儲(chǔ)過程調(diào)用 Update run_movedetail set RunDate = sysdate where id = p_job; //調(diào)用實(shí)際使用的Pr_movedetail例程, 然后更新記錄,記錄實(shí)際提交時(shí)間. End; 最后在客戶端直接調(diào)用fast_movedetail即可. 本文出自:億恩科技【1tcdy.com】 服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |