專(zhuān)利名稱(chēng):用于處理觸發(fā)器返回結(jié)果不確定性的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)軟件技術(shù)領(lǐng)域,尤其涉及一種用于處理觸發(fā)器返回結(jié)果不確定性的方法。
背景技術(shù):
隨著當(dāng)前互聯(lián)網(wǎng)迅速發(fā)展,對(duì)數(shù)據(jù)存儲(chǔ)、通訊的要求也隨之劇增,從而加速了數(shù)據(jù)庫(kù)軟件的不斷更新?lián)Q代。以往的數(shù)據(jù)庫(kù)軟件,一般僅可以滿足本地?cái)?shù)據(jù)存 儲(chǔ)、訪問(wèn),存在容量小、不易交互等特點(diǎn)。隨著網(wǎng)絡(luò)規(guī)模的不斷擴(kuò)大,人們需要一種大型的、分布式的、海量存儲(chǔ)的數(shù)據(jù)庫(kù)管理軟件,oracle數(shù)據(jù)庫(kù)軟件應(yīng)運(yùn)而生,并且在許多大型網(wǎng)絡(luò)通訊系統(tǒng)中得到廣泛應(yīng)用。如今,國(guó)內(nèi)一些企業(yè)在開(kāi)發(fā)應(yīng)用系統(tǒng)時(shí),往往會(huì)選擇oracle數(shù)據(jù)庫(kù),這樣,可以滿足其不同領(lǐng)域需求。相對(duì)于小型應(yīng)用系統(tǒng),使用較大型數(shù)據(jù)庫(kù)反而影響系統(tǒng)性能,成為一種浪費(fèi),這些系統(tǒng)的數(shù)據(jù)庫(kù)無(wú)非就是處理一些基本的SQL語(yǔ)句,很少會(huì)有需要數(shù)據(jù)庫(kù)自動(dòng)處理的流程。對(duì)一些大公司而言,其分支機(jī)構(gòu)不會(huì)在同一地區(qū),但需要與總服務(wù)器進(jìn)行業(yè)務(wù)流程的交互,在對(duì)這些公司的軟件開(kāi)發(fā)時(shí),一般會(huì)使用oracle數(shù)據(jù)庫(kù),在實(shí)際應(yīng)用中,oracle會(huì)承擔(dān)一些自動(dòng)完成的流程,這樣簡(jiǎn)化了程序代碼的結(jié)構(gòu),使得代碼層次清晰,減輕了開(kāi)發(fā)端的工作量。比如,觸發(fā)器操作、定時(shí)JOB等,這樣,減少了整個(gè)軟件系統(tǒng)的過(guò)多的關(guān)聯(lián),使得數(shù)據(jù)庫(kù)獨(dú)立出來(lái)。觸發(fā)器是一種很有應(yīng)用價(jià)值的數(shù)據(jù)庫(kù)開(kāi)發(fā)模式,它主要作用于對(duì)指定表某個(gè)字段的操作發(fā)生時(shí)或發(fā)生后,其他表的數(shù)據(jù)改變,例如當(dāng)A表中al字段更新時(shí),整條記錄都會(huì)插入到B表中;當(dāng)然,這是一個(gè)極其簡(jiǎn)單的例子,在實(shí)際應(yīng)用中,都是一些較大數(shù)據(jù)量的操作,不僅要求觸發(fā)器處理迅速、流暢,還要求數(shù)據(jù)準(zhǔn)確性,這對(duì)觸發(fā)器的要求是十分高的。在觸發(fā)器中,經(jīng)常會(huì)用到游標(biāo),其主要就是一個(gè)具有條件限制的結(jié)果集,通過(guò)游標(biāo)得到需要進(jìn)行操作的字段的數(shù)據(jù),提取數(shù)據(jù)后做出相應(yīng)計(jì)算等操作,以完成相應(yīng)任務(wù)。游標(biāo)的使用有一定的流程,首先,需要聲明游標(biāo);然后,需要使用時(shí),調(diào)用游標(biāo),通常,先打開(kāi)游標(biāo),再循環(huán)調(diào)用,直到找不到結(jié)果;最后,對(duì)相應(yīng)數(shù)據(jù)進(jìn)行操作。游標(biāo)分為隱式游標(biāo)和顯示游標(biāo)兩種,其中隱式游標(biāo)不用聲明,它是游標(biāo)的一種特例——只有一個(gè)結(jié)果返回,而顯式游標(biāo)需要聲明、循環(huán)調(diào)用,這樣的設(shè)計(jì)在實(shí)際開(kāi)發(fā)中會(huì)帶來(lái)一些問(wèn)題。在實(shí)際工作中,一些涉及數(shù)據(jù)庫(kù)的業(yè)務(wù)不僅工作量大,而且各種數(shù)據(jù)、關(guān)系處理起來(lái)十分復(fù)雜,數(shù)據(jù)表的字段多,如果交給后臺(tái)處理,沒(méi)有數(shù)據(jù)庫(kù)直接處理起來(lái)速度快,但是,正事由于在設(shè)計(jì)觸發(fā)器時(shí)游標(biāo)返回值的不確定性,往往會(huì)導(dǎo)致數(shù)據(jù)庫(kù)端的程序錯(cuò)誤,從而影響這個(gè)系統(tǒng)的流程暢通,加之?dāng)?shù)據(jù)庫(kù)編程語(yǔ)言沒(méi)有高級(jí)語(yǔ)言那樣簡(jiǎn)潔、清晰,不少開(kāi)發(fā)人員會(huì)放棄數(shù)據(jù)庫(kù)端的編程開(kāi)發(fā),轉(zhuǎn)而將工作交給后臺(tái),這樣會(huì)加重后臺(tái)的負(fù)荷,讓功能強(qiáng)大的數(shù)據(jù)庫(kù)空閑,只處理一些SQL語(yǔ)句。所謂游標(biāo)結(jié)果返回值的不確定性,就是指當(dāng)返回一個(gè)結(jié)果集時(shí),有時(shí)是一個(gè)結(jié)果,有時(shí)是多個(gè)結(jié)果,當(dāng)遇到多個(gè)結(jié)果的時(shí)候,使用隱式游標(biāo)就會(huì)報(bào)錯(cuò),相反,同樣會(huì)報(bào)錯(cuò),這一問(wèn)題沒(méi)有一個(gè)有效的解決辦法,而且有的數(shù)據(jù)庫(kù)處理軟件沒(méi)有調(diào)試觸發(fā)器的功能,讓問(wèn)題顯得棘手。因此,當(dāng)下需要迫切解決的一個(gè)技術(shù)問(wèn)題就是如何能夠提出一種有效的措施,以解決現(xiàn)有技術(shù)中存在的問(wèn)題。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問(wèn)題是提供一種用于處理觸發(fā)器返回結(jié)果不確定性的方法,通過(guò)分析結(jié)果,巧妙解決數(shù)據(jù)庫(kù)觸發(fā)器返回結(jié)果不確定性問(wèn)題。為了解決上述技術(shù)問(wèn)題,本發(fā)明提供了一種用于處理觸發(fā)器返回結(jié)果不確定性的方法,包括將需要使用的游標(biāo)進(jìn)行聲明,同時(shí)聲明一個(gè)變量,并賦值; 在使用游標(biāo)時(shí)用隱式調(diào)用,拋出異常情形,按照不同的異常情況改變?cè)撟兞康闹?;通過(guò)判斷變量值,進(jìn)入不同的分支語(yǔ)句中,執(zhí)行程序。進(jìn)一步地,當(dāng)返回多個(gè)結(jié)果時(shí),使用顯式游標(biāo)調(diào)用。進(jìn)一步地,當(dāng)返回I個(gè)結(jié)果時(shí),使用隱式游標(biāo)調(diào)用。進(jìn)一步地,使用顯式游標(biāo)調(diào)用時(shí),還包括判定游標(biāo)循環(huán)是否結(jié)束。綜上,本發(fā)明提供的用于處理觸發(fā)器返回結(jié)果不確定性的方法,首先給其賦值,在處理游標(biāo)時(shí),根據(jù)返回結(jié)果數(shù)量不同改變變量值,如,變量開(kāi)始時(shí)為1,當(dāng)游標(biāo)返回一個(gè)結(jié)果時(shí),值不變,當(dāng)游標(biāo)返回多個(gè)結(jié)果時(shí),變量值賦值為2,當(dāng)游標(biāo)沒(méi)有結(jié)果返回時(shí),變量值賦值為0,再通過(guò)判斷語(yǔ)句,不同的變量值執(zhí)行不同的程序段,這樣,結(jié)構(gòu)清晰、簡(jiǎn)單明確,觸發(fā)器可以準(zhǔn)確處理游標(biāo)的返回結(jié)果,將復(fù)雜問(wèn)題簡(jiǎn)化,從而完成預(yù)期目標(biāo)。
圖I是本發(fā)明具體實(shí)施方式
中所述的用于處理觸發(fā)器返回結(jié)果不確定性的方法流程示意圖。
具體實(shí)施例方式下面結(jié)合附圖和具體實(shí)施方式
對(duì)本發(fā)明作進(jìn)一步詳細(xì)的說(shuō)明。當(dāng)前在數(shù)據(jù)庫(kù)觸發(fā)器的開(kāi)發(fā)中,通常會(huì)使用游標(biāo),其主要功能就是通過(guò)一些條件限制,返回一條或者多條記錄,通過(guò)從記錄中提取字段來(lái)進(jìn)行計(jì)算,從而達(dá)到數(shù)據(jù)庫(kù)獨(dú)立處理事務(wù)的目的。在對(duì)游標(biāo)的使用中,其返回結(jié)果的數(shù)量存在不確定性,加之觸發(fā)器編程語(yǔ)言并不像其他面向?qū)ο箝_(kāi)發(fā)語(yǔ)言那樣靈活、簡(jiǎn)潔,使得觸發(fā)器的應(yīng)用并不廣泛,讓一些功能強(qiáng)大的數(shù)據(jù)庫(kù)沒(méi)有充分發(fā)揮其強(qiáng)大的性能。本方案中,在使用隱式游標(biāo)時(shí),有處理異常的屬性,這是解決問(wèn)題的關(guān)鍵,正是因?yàn)榭梢宰プ‘惓#趴梢灾赖降子螛?biāo)返回幾個(gè)結(jié)果。通常使用最多的是返回多行的異常,當(dāng)拋出異常時(shí),可以進(jìn)行相應(yīng)操作,通常使用改變變量值的方法,通過(guò)判斷變量的值進(jìn)行分支執(zhí)行程序。參見(jiàn)圖I給出了一種用于處理觸發(fā)器返回結(jié)果不確定性的方法流程示意圖,具體包括
步驟S101,將需要使用的游標(biāo)進(jìn)行聲明,同時(shí)聲明一個(gè)變量,并賦值;步驟S102,在使用游標(biāo)時(shí)用隱式調(diào)用,拋出異常情形,按照不同的異常情況改變?cè)撟兞康闹担徊襟ES103,通過(guò)判斷變量值,進(jìn)入不同的分支語(yǔ)句中,執(zhí)行程序。在實(shí)際應(yīng)用中,當(dāng)返回多個(gè)結(jié)果時(shí),使用顯式游標(biāo)調(diào)用。當(dāng)返回I個(gè)結(jié)果時(shí),使用隱式游標(biāo)調(diào)用。且,使用顯式游標(biāo)調(diào)用時(shí),還包括判定游標(biāo)循環(huán)是否結(jié)束。下面通過(guò)具體的實(shí)例對(duì)本發(fā)明所述的方案作更為詳細(xì)的介紹首先,在觸發(fā)器開(kāi)頭聲明一個(gè)變量,并賦值,如變量名a,初值為I ;同時(shí),聲明使用的游標(biāo)。然后,當(dāng)有列舉結(jié)果集的需要時(shí),使用隱式調(diào)用游標(biāo)的方法,捕捉到返回結(jié)果的異 常,并改變變量的值。比如,當(dāng)拋出多行返回異常時(shí),a的值賦值為2,當(dāng)拋出沒(méi)有找到數(shù)據(jù)異常時(shí),a的值賦值為O。最后,根據(jù)變量不同的值,進(jìn)入不同的分支,執(zhí)行語(yǔ)句。比如,當(dāng)a為I時(shí),說(shuō)明游標(biāo)返回一個(gè)結(jié)果,那么使用隱式游標(biāo)調(diào)用,用相應(yīng)的語(yǔ)法操作字段;當(dāng)a為2時(shí),說(shuō)明游標(biāo)返回多個(gè)結(jié)果,使用顯式游標(biāo)調(diào)用,通過(guò)開(kāi)啟游標(biāo),逐步循環(huán),操作相關(guān)數(shù)據(jù),直到?jīng)]有返回結(jié)果;當(dāng)a為O時(shí),說(shuō)明游標(biāo)為空,即沒(méi)有結(jié)果返回,再做出相應(yīng)處理。這樣每種異常都會(huì)有一個(gè)處理方法,不會(huì)因?yàn)楫惓5某霈F(xiàn)而崩潰,這樣一來(lái),觸發(fā)器可以準(zhǔn)確、快速的處理事務(wù),同時(shí),程序執(zhí)行的層次也變得分明,易于處理。在對(duì)觸發(fā)器進(jìn)行調(diào)試時(shí),可以清楚的看到程序執(zhí)行的順序,通過(guò)引入變量獲得不同的情況,從而進(jìn)入不同的分支,層次分明,執(zhí)行準(zhǔn)確,結(jié)構(gòu)清晰。當(dāng)然,在實(shí)際開(kāi)發(fā)工作中,觸發(fā)器的應(yīng)用并不是如此簡(jiǎn)單,并不拘泥于一張簡(jiǎn)單的表,有時(shí)操作的表會(huì)很多,聲明的變量會(huì)有多個(gè),涉及不止一個(gè)游標(biāo)的調(diào)用和循環(huán),在結(jié)構(gòu)上會(huì)很復(fù)雜,代碼量也很大,只要處理好事先聲明變量的值,進(jìn)入不同的分支語(yǔ)句執(zhí)行,觸發(fā)器的優(yōu)勢(shì)就能充分體現(xiàn)。更進(jìn)一步的,給出實(shí)際應(yīng)用中觸發(fā)器的一般格式及解決方法的一般程序格式觸發(fā)器的格式Create or replace trigger 觸發(fā)器名-觸發(fā)器頭After update (updating) on表名-說(shuō)明觸發(fā)器作用時(shí)間(更新后活更新時(shí))、所用的表For each row-對(duì)每一行起作用Declare一些變量游標(biāo)的聲明Begin程序塊;End ;一般情況下,觸發(fā)器的觸發(fā)是由于某一字段的值的變化引起的,該字段所在表在觸發(fā)前后用new和old區(qū)別,一般使用new.字段名來(lái)表示本表的字段。所以,在觸發(fā)器的程序體的開(kāi)頭一般會(huì)有一個(gè)判斷語(yǔ)句,如if (:new.字段名=某值then…,表示當(dāng)該字段變?yōu)橹贫ㄖ禃r(shí),觸發(fā)器開(kāi)始工作。游標(biāo)的顯示調(diào)用格式open 游標(biāo)名;loopfetch XXX into 相應(yīng)變量;exit when(游標(biāo)沒(méi)有返回結(jié)果);程序執(zhí)行語(yǔ)句。ο。 end loop;close 游標(biāo)名;隱式調(diào)用游標(biāo)格式Select 字段名。。。into 變量。。。from 表名 where 條件;其中,當(dāng)隱式調(diào)用時(shí),如有異常,會(huì)拋出異常,一般分為無(wú)結(jié)果返回和多行返回兩種,格式如下Exception when no_data_found then 執(zhí)行語(yǔ)句;Exception when too_many_rows then 執(zhí)行語(yǔ)句;本發(fā)明流程程序的一般格式Declare a number (2); -聲明變量Cursor XX is-聲明游標(biāo)Select XX from xx shere...;a :=1;-變量賦值Beginselect XXX into XXXX from XX where···;exceptionwhen no_data_found then a :=0;when too_many_rows then a :=2;if (a=l) then-只有一個(gè)結(jié)果返回select XXX into XXXX from XX where···;執(zhí)行語(yǔ)句。。。Else if (if = 2) then-返回多個(gè)結(jié)果Open游標(biāo)名-打開(kāi)游標(biāo)。執(zhí)行循環(huán)LoopFetch 游標(biāo) into 變量。。。;執(zhí)行語(yǔ)句end loop;close 游標(biāo)名;end;else-沒(méi)有結(jié)果返回的情況執(zhí)行語(yǔ)句。。End ;。
以上對(duì)本發(fā)明所提供的用于處理觸發(fā)器返回結(jié)果不確定性的方法進(jìn)行了詳細(xì)介 紹,本文中應(yīng)用了具體個(gè)例對(duì)本發(fā)明的原理及實(shí)施方式進(jìn)行了闡述,以上實(shí)施例的說(shuō)明只是用于幫助理解本發(fā)明的方法及其核心思想;同時(shí),對(duì)于本領(lǐng)域的一般技術(shù)人員,依據(jù)本發(fā)明的思想,在具體實(shí)施方式
及應(yīng)用范圍上均會(huì)有改變之處,綜上所述,本說(shuō)明書(shū)內(nèi)容不應(yīng)理解為對(duì)本發(fā)明的限制。
權(quán)利要求
1.一種用于處理觸發(fā)器返回結(jié)果不確定性的方法,其特征在于,包括 將需要使用的游標(biāo)進(jìn)行聲明,同時(shí)聲明一個(gè)變量,并賦值; 在使用游標(biāo)時(shí)用隱式調(diào)用,拋出異常情形,按照不同的異常情況改變?cè)撟兞康闹担? 通過(guò)判斷變量值,進(jìn)入不同的分支語(yǔ)句中,執(zhí)行程序。
2.根據(jù)權(quán)利要求I所述的用于處理觸發(fā)器返回結(jié)果不確定性的方法,其特征在于,當(dāng)返回多個(gè)結(jié)果時(shí),使用顯式游標(biāo)調(diào)用。
3.根據(jù)權(quán)利要求I所述的用于處理觸發(fā)器返回結(jié)果不確定性的方法,其特征在于,當(dāng)返回I個(gè)結(jié)果時(shí),使用隱式游標(biāo)調(diào)用。
4.根據(jù)權(quán)利要求2所述的用于處理觸發(fā)器返回結(jié)果不確定性的方法,其特征在于,使用顯式游標(biāo)調(diào)用時(shí),還包括判定游標(biāo)循環(huán)是否結(jié)束。
全文摘要
本發(fā)明主要提出一種用于處理觸發(fā)器返回結(jié)果不確定性的方法,涉及計(jì)算機(jī)軟件技術(shù)領(lǐng)域,具體的,首先給其賦值,在處理游標(biāo)時(shí),通過(guò)oracle中對(duì)不同返回結(jié)果做出的相應(yīng)異常處理,根據(jù)返回結(jié)果數(shù)量不同改變變量值,如,變量開(kāi)始時(shí)為1,當(dāng)游標(biāo)返回一個(gè)結(jié)果時(shí),值不變,當(dāng)游標(biāo)返回多個(gè)結(jié)果時(shí),變量值賦值為2,當(dāng)游標(biāo)沒(méi)有結(jié)果返回時(shí),變量值賦值為0,再通過(guò)判斷語(yǔ)句,不同的變量值執(zhí)行不同的程序段,這樣,結(jié)構(gòu)清晰、簡(jiǎn)單明確,觸發(fā)器可以準(zhǔn)確處理游標(biāo)的返回結(jié)果,將復(fù)雜問(wèn)題簡(jiǎn)化,從而完成預(yù)期目標(biāo)。本發(fā)明所要解決的技術(shù)問(wèn)題是提供一種用于處理觸發(fā)器返回結(jié)果不確定性的方法,通過(guò)分析結(jié)果,巧妙解決數(shù)據(jù)庫(kù)觸發(fā)器返回結(jié)果不確定性問(wèn)題。
文檔編號(hào)G06F9/44GK102707956SQ20121015680
公開(kāi)日2012年10月3日 申請(qǐng)日期2012年5月18日 優(yōu)先權(quán)日2012年5月18日
發(fā)明者何涇沙, 張玉強(qiáng), 王經(jīng)緯 申請(qǐng)人:北京工業(yè)大學(xué)