Oracle9iPL/SQL編程的經(jīng)驗小結(jié)
更新時間:2007年03月07日 00:00:00 作者:
正在看的ORACLE教程是:Oracle9iPL/SQL編程的經(jīng)驗小結(jié)。平時在PL/SQL中的編程中遇到一些問題,這里以問答的形式來進(jìn)行把它們總結(jié)下來,以供大家分享。
1、當(dāng)需要向表中裝載大量的數(shù)據(jù)流或者需要處理大量的數(shù)據(jù)流的時候,能否使用管道提高處理效率?
管道函數(shù)對于改善并行查詢的性能非常方便,它加快往表中加載數(shù)據(jù)的速度。管道函數(shù)的使用總結(jié)如下兩點:
每當(dāng)在查詢里使用PL/SQL函數(shù)時,該查詢將被序列化,即一個處理器只能運行一個查詢實例,那么在這種情況下不可能使用并行查詢(比如在數(shù)據(jù)倉庫中要經(jīng)常使用這項技術(shù))。因此,為了使用并行查詢就必須使用管道函數(shù),這樣也就加快了執(zhí)行的速度。
管道函數(shù)的輸入?yún)?shù)必須是一個引用記錄集類型(即ref cursor),而返回的是嵌套表類型(其表中每一行對應(yīng)每一個引用記錄)。在使用管道函數(shù)之前,必須先在程序頭寫上PARALLEL_ENABLE,這樣才能在查詢語句中使用管道函數(shù)來處理了。
2. 如何使PL/SQL程序等待一段時間執(zhí)行?
方法就是使用DBMS_LOCK包的SLEEP函數(shù),可以進(jìn)行精確定時,其語法為:
DBMS_LOCK.SLEEP (seconds IN NUMBER);
3.需要在一張表插入一條記錄之后等若干秒后再執(zhí)行另外一個操作,如何在PL/SQL程序里進(jìn)行定時操作?
一般的做法是用循環(huán)作延遲,利用 DBMS_UTILITY的gettime函數(shù)來檢測當(dāng)前的時間,程序代碼如下:
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)或者簡單的耗時執(zhí)行語句*/
End loop;
END;
/
另外如果是不同會話(session)之間的定時,就必須使用DBMS_PIPE包的函數(shù)來實現(xiàn)會話間的消息傳遞。
4.當(dāng)PL/SQL返回一個數(shù)據(jù)集的時候,該使用集合還是游標(biāo)?
一般情況下,有以下兩點作為依據(jù):
1) 如果PL/SQL程序返回多多行數(shù)據(jù)給另外一個PL/SQL程序的話,這里就建議使用集合,因為這樣可以利用集合的批收集(bulk collection)來提高從數(shù)據(jù)庫提取數(shù)據(jù)的速度。
2) 如果需要在PL/SQL程序的環(huán)境中把數(shù)據(jù)返回到宿主語言環(huán)境中(如Sql*plus,c,delphi等),這時應(yīng)該使用游標(biāo)變量來返回這些數(shù)據(jù),因為幾乎所有的宿主語言都支持游標(biāo)變量,但不是所有的宿主語言都支持集合。這樣可以增強程序的可移植性。
5.如何更有效的在PL/SQL中使用游標(biāo)?
游標(biāo)是PL/SQL中一個非常重要的概念,對數(shù)據(jù)庫的檢索主要依靠游標(biāo)來操作。在PL/SQL中有兩類游標(biāo),一類是隱式游標(biāo),如select clno into v_clno from table_detail.另外一類是顯式游標(biāo),如cursor v_cur is select clno from table_detail。對于游標(biāo)的使用這里給出以下幾點建議:
1) 盡可能的使用bulk collection。它能夠較大的提高運行性能,在Oracl9i的第二版,甚至可以使用bulk collection來直接將數(shù)據(jù)寫入到記錄表
2) 盡量使用顯式游標(biāo)來處理,因為相對于隱式游標(biāo)來說,顯式游標(biāo)的速度更快一些。
3) 如果查詢的表很小或者是靜態(tài)的,可以把該表緩存到一個包級的集合里。這樣,你的查詢函數(shù)就直接從集合里(即進(jìn)程全局區(qū),PGA cache),而不是從系統(tǒng)全局區(qū)(SGA)來取數(shù)據(jù),這樣的處理速度會提升很多。
1、當(dāng)需要向表中裝載大量的數(shù)據(jù)流或者需要處理大量的數(shù)據(jù)流的時候,能否使用管道提高處理效率?
管道函數(shù)對于改善并行查詢的性能非常方便,它加快往表中加載數(shù)據(jù)的速度。管道函數(shù)的使用總結(jié)如下兩點:
每當(dāng)在查詢里使用PL/SQL函數(shù)時,該查詢將被序列化,即一個處理器只能運行一個查詢實例,那么在這種情況下不可能使用并行查詢(比如在數(shù)據(jù)倉庫中要經(jīng)常使用這項技術(shù))。因此,為了使用并行查詢就必須使用管道函數(shù),這樣也就加快了執(zhí)行的速度。
管道函數(shù)的輸入?yún)?shù)必須是一個引用記錄集類型(即ref cursor),而返回的是嵌套表類型(其表中每一行對應(yīng)每一個引用記錄)。在使用管道函數(shù)之前,必須先在程序頭寫上PARALLEL_ENABLE,這樣才能在查詢語句中使用管道函數(shù)來處理了。
2. 如何使PL/SQL程序等待一段時間執(zhí)行?
方法就是使用DBMS_LOCK包的SLEEP函數(shù),可以進(jìn)行精確定時,其語法為:
DBMS_LOCK.SLEEP (seconds IN NUMBER);
3.需要在一張表插入一條記錄之后等若干秒后再執(zhí)行另外一個操作,如何在PL/SQL程序里進(jìn)行定時操作?
一般的做法是用循環(huán)作延遲,利用 DBMS_UTILITY的gettime函數(shù)來檢測當(dāng)前的時間,程序代碼如下:
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)或者簡單的耗時執(zhí)行語句*/
End loop;
END;
/
另外如果是不同會話(session)之間的定時,就必須使用DBMS_PIPE包的函數(shù)來實現(xiàn)會話間的消息傳遞。
4.當(dāng)PL/SQL返回一個數(shù)據(jù)集的時候,該使用集合還是游標(biāo)?
一般情況下,有以下兩點作為依據(jù):
1) 如果PL/SQL程序返回多多行數(shù)據(jù)給另外一個PL/SQL程序的話,這里就建議使用集合,因為這樣可以利用集合的批收集(bulk collection)來提高從數(shù)據(jù)庫提取數(shù)據(jù)的速度。
2) 如果需要在PL/SQL程序的環(huán)境中把數(shù)據(jù)返回到宿主語言環(huán)境中(如Sql*plus,c,delphi等),這時應(yīng)該使用游標(biāo)變量來返回這些數(shù)據(jù),因為幾乎所有的宿主語言都支持游標(biāo)變量,但不是所有的宿主語言都支持集合。這樣可以增強程序的可移植性。
5.如何更有效的在PL/SQL中使用游標(biāo)?
游標(biāo)是PL/SQL中一個非常重要的概念,對數(shù)據(jù)庫的檢索主要依靠游標(biāo)來操作。在PL/SQL中有兩類游標(biāo),一類是隱式游標(biāo),如select clno into v_clno from table_detail.另外一類是顯式游標(biāo),如cursor v_cur is select clno from table_detail。對于游標(biāo)的使用這里給出以下幾點建議:
1) 盡可能的使用bulk collection。它能夠較大的提高運行性能,在Oracl9i的第二版,甚至可以使用bulk collection來直接將數(shù)據(jù)寫入到記錄表
2) 盡量使用顯式游標(biāo)來處理,因為相對于隱式游標(biāo)來說,顯式游標(biāo)的速度更快一些。
3) 如果查詢的表很小或者是靜態(tài)的,可以把該表緩存到一個包級的集合里。這樣,你的查詢函數(shù)就直接從集合里(即進(jìn)程全局區(qū),PGA cache),而不是從系統(tǒng)全局區(qū)(SGA)來取數(shù)據(jù),這樣的處理速度會提升很多。
您可能感興趣的文章:
- Oracle中PL/SQL中if語句的寫法介紹
- Oracle中在pl/sql developer修改表的2種方法
- oracle iSQL*PLUS配置設(shè)置圖文說明
- ORACLE PL/SQL 觸發(fā)器編程篇介紹
- plsql連接oracle數(shù)據(jù)庫報ora 12154錯誤解決方法
- oracle客戶端PLSQL連接失敗解決方法
- Oracle 10G:PL/SQL正規(guī)表達(dá)式(正則表達(dá)式)手冊
- oracle 安裝與SQLPLUS簡單用法
- oracle sqlplus 常用命令大全
- 在Oracle PL/SQL中游標(biāo)聲明中表名動態(tài)變化的方法
- Oracle使用PL/SQL操作COM對象
- PL/SQL實現(xiàn)Oracle數(shù)據(jù)庫任務(wù)調(diào)度
- Oracle PL/SQL語言入門基礎(chǔ)
- PL/SQL編程經(jīng)驗小結(jié)開發(fā)者網(wǎng)絡(luò)Oracle
- Oracle PL/SQL入門案例實踐
- Oracle PL/SQL入門慨述
- OraclePL/SQL單行函數(shù)和組函數(shù)詳解
- 64位win7下pl/sql無法連接oracle解決方法
相關(guān)文章
Oracle中update和select 關(guān)聯(lián)操作
本文主要向大家介紹了Oracle數(shù)據(jù)庫之oracle update set select from 關(guān)聯(lián)更新,通過具體的內(nèi)容向大家展現(xiàn),本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2022-01-01oracle 11g 數(shù)據(jù)庫常用操作實例總結(jié)
這篇文章主要介紹了oracle 11g 數(shù)據(jù)庫常用操作,結(jié)合實例形式總結(jié)分析了oracle 11g數(shù)據(jù)庫進(jìn)入、創(chuàng)建、權(quán)限、用戶等相關(guān)操作技巧與注意事項,需要的朋友可以參考下2023-05-05Oracle中定時任務(wù)的使用(創(chuàng)建查看刪除等)
Oracle沒有內(nèi)置的定時任務(wù)功能,但可以使用Oracle的Job Scheduler來實現(xiàn)類似的功能,本文主要介紹了Oracle中定時任務(wù)的使用,具有一定的參考價值,感興趣的可以了解一下2024-02-02Oracle移動數(shù)據(jù)文件不停機和停機兩種方式詳解
這篇文章主要為大家介紹了Oracle移動數(shù)據(jù)文件不停機和停機兩種方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09用Oracle9ias開發(fā)無線應(yīng)用程序開發(fā)者網(wǎng)絡(luò)Oracle
用Oracle9ias開發(fā)無線應(yīng)用程序開發(fā)者網(wǎng)絡(luò)Oracle...2007-03-03Oracle數(shù)據(jù)庫中基本的查詢優(yōu)化與子查詢優(yōu)化講解
這篇文章主要介紹了Oracle數(shù)據(jù)庫中基本的查詢優(yōu)化與子查詢優(yōu)化講解,舉了實例來分析子查詢對性能的影響,需要的朋友可以參考下2016-01-01