- 相關(guān)推薦
PL/SQL編程中的經(jīng)驗小結
平時(shí)在PL/SQL中的編程中遇到一些問(wèn)題,這里以問(wèn)答的形式來(lái)進(jìn)行把它們總結下來(lái),以供大家分享。
1、當需要向表中裝載大量的數據流或者需要處理大量的數據流的時(shí)候,能否使用管道提高處理效率?
管道函數對于改善并行查詢(xún)的性能非常方便,它加快往表中加載數據的速度。管道函數的使用總結如下兩點(diǎn):
每當在查詢(xún)里使用PL/SQL函數時(shí),該查詢(xún)將被序列化,即一個(gè)處理器只能運行一個(gè)查詢(xún)實(shí)例,那么在這種情況下不可能使用并行查詢(xún)(比如在數據倉庫中要經(jīng)常使用這項技術(shù))。因此,為了使用并行查詢(xún)就必須使用管道函數,這樣也就加快了執行的速度。
管道函數的輸入參數必須是一個(gè)引用記錄集類(lèi)型(即ref cursor),而返回的是嵌套表類(lèi)型(其表中每一行對應每一個(gè)引用記錄)。在使用管道函數之前,必須先在程序頭寫(xiě)上PARALLEL_ENABLE,這樣才能在查詢(xún)語(yǔ)句中使用管道函數來(lái)處理了。
2. 如何使PL/SQL程序等待一段時(shí)間執行?
方法就是使用DBMS_LOCK包的SLEEP函數,可以進(jìn)行精確定時(shí),其語(yǔ)法為:
DBMS_LOCK.SLEEP (seconds IN NUMBER);
3.需要在一張表插入一條記錄之后等若干秒后再執行另外一個(gè)操作,如何在PL/SQL程序里進(jìn)行定時(shí)操作?
一般的做法是用循環(huán)作延遲,利用 DBMS_UTILITY的gettime函數來(lái)檢測當前的時(shí)間,程序代碼如下:
DECLARE
v_delaytime CONSTANT INTEGER := 100;
v_starttime INTEGER ;
v_endtime INTEGER ;
BEGIN
V_starttime := DBMS_UTILITY.get_time;
V_endtime := DBMS_UTILITY.get_time;
While abs(V_endtime- V_starttime)< v_delaytime loop
/*空循環(huán)或者簡(jiǎn)單的耗時(shí)執行語(yǔ)句*/
End loop;
END;
/
另外如果是不同會(huì )話(huà)(session)之間的定時(shí),就必須使用DBMS_PIPE包的函數來(lái)實(shí)現會(huì )話(huà)間的消息傳遞。
4.當PL/SQL返回一個(gè)數據集的時(shí)候,該使用集合還是游標?
一般情況下,有以下兩點(diǎn)作為依據:
1) 如果PL/SQL程序返回多多行數據給另外一個(gè)PL/SQL程序的話(huà),這里就建議使用集合,因為這樣可以利用集合的批收集(bulk collection)來(lái)提高從數據庫提取數據的速度。
2) 如果需要在PL/SQL程序的環(huán)境中把數據返回到宿主語(yǔ)言環(huán)境中(如Sql*plus,c,delphi等),這時(shí)應該使用游標變量來(lái)返回這些數據,因為幾乎所有的宿主語(yǔ)言都支持游標變量,但不是所有的宿主語(yǔ)言都支持集合。這樣可以增強程序的可移植性。
5.如何更有效的在PL/SQL中使用游標?
游標是PL/SQL中一個(gè)非常重要的概念,對數據庫的檢索主要依靠游標來(lái)操作。在PL/SQL中有兩類(lèi)游標,一類(lèi)是隱式游標,如select clno into v_clno from table_detail.另外一類(lèi)是顯式游標,如cursor v_cur is select clno from table_detail。對于游標的使用這里給出以下幾點(diǎn)建議:
1) 盡可能的使用bulk collection。它能夠較大的提高運行性能,在Oracl9i的第二版,甚至可以使用bulk collection來(lái)直接將數據寫(xiě)入到記錄表
2) 盡量使用顯式游標來(lái)處理,因為相對于隱式游標來(lái)說(shuō),顯式游標的速度更快一些。
3) 如果查詢(xún)的表很小或者是靜態(tài)的,可以把該表緩存到一個(gè)包級的集合里。這樣,你的查詢(xún)函數就直接從集合里(即進(jìn)程全局區,PGA cache),而不是從系統全局區(SGA)來(lái)取數據,這樣的處理速度會(huì )提升很多。
【PL/SQL編程中的經(jīng)驗小結】相關(guān)文章:
SQL中的單記錄函數03-30
關(guān)于SQL在數據檢查中的應用03-29
《PHP編程最快明白》第八講:php啟發(fā)和小結03-31
SQL優(yōu)化大全03-08
oracle的sql語(yǔ)句01-21