中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

oracle如何優(yōu)化游標(biāo) oracle使用游標(biāo)更新數(shù)據(jù)

如何使用Oracle的游標(biāo)?

Oracle中的游標(biāo)分為顯示游標(biāo)和隱式游標(biāo)。

成都創(chuàng)新互聯(lián)公司為企業(yè)級客戶提高一站式互聯(lián)網(wǎng)+設(shè)計服務(wù),主要包括網(wǎng)站制作、網(wǎng)站設(shè)計、app軟件開發(fā)公司、重慶小程序開發(fā)、宣傳片制作、LOGO設(shè)計等,幫助客戶快速提升營銷能力和企業(yè)形象,創(chuàng)新互聯(lián)各部門都有經(jīng)驗豐富的經(jīng)驗,可以確保每一個作品的質(zhì)量和創(chuàng)作周期,同時每年都有很多新員工加入,為我們帶來大量新的創(chuàng)意。 

顯示游標(biāo):

顯示游標(biāo)是用cursor...is命令定義的游標(biāo),它可以對查詢語句(select)返回的多條記錄進(jìn)行處理;顯示游標(biāo)的操作:打開游標(biāo)、操作游標(biāo)、關(guān)閉游標(biāo);

隱式游標(biāo):

隱式游標(biāo)是在執(zhí)行插入(insert)、刪除(delete)、修改(update)和返回單條記錄的查詢(select)語句時由PL/SQL自動定義的。PL/SQL隱式地打開SQL游標(biāo),并在它內(nèi)部處理SQL語句,然后關(guān)閉它。

Oracle 游標(biāo)

游標(biāo)能夠根據(jù)查詢條件從數(shù)據(jù)表中提取一組記錄,將其作為一個臨時表置于數(shù)據(jù)緩沖區(qū)中,利用指針逐行對記錄數(shù)據(jù)進(jìn)行操作。

Oracle中的游標(biāo)分為顯示游標(biāo)和隱式游標(biāo) 。

在執(zhí)行SQL語句時,Oracle會自動創(chuàng)建隱式游標(biāo),該游標(biāo)是內(nèi)存中處理該語句的數(shù)據(jù)緩沖區(qū),存儲了執(zhí)行SQL語句的結(jié)果。通過隱式游標(biāo)屬性可獲知SQL語句的執(zhí)行狀態(tài)信息。

%found:布爾型屬性,如果sql語句至少影響到一行數(shù)據(jù),值為true,否則為false。

%notfound:布爾型屬性,與%found相反。

%rowcount:數(shù)字型屬性,返回受sql影響的行數(shù)。

%isopen:布爾型屬性,當(dāng)游標(biāo)已經(jīng)打開時返回true,游標(biāo)關(guān)閉時則為false。

用戶可以顯式定義游標(biāo)。使用顯式游標(biāo)處理數(shù)據(jù)要4個步驟:定義游標(biāo)、打開游標(biāo)、提取游標(biāo)數(shù)據(jù)和關(guān)閉游標(biāo)。

游標(biāo)由游標(biāo)名稱和游標(biāo)對應(yīng)的select結(jié)果集組成。定義游標(biāo)應(yīng)該放在pl/sql程序塊的聲明部分。

語法格式:cursor 游標(biāo)名稱(參數(shù)) is 查詢語句

打開游標(biāo)時,游標(biāo)會將符合條件的記錄送入數(shù)據(jù)緩沖區(qū),并將指針指向第一條記錄。

語法格式:open 游標(biāo)名稱(參數(shù));

將游標(biāo)中的當(dāng)前行數(shù)據(jù)賦給指定的變量或記錄變量。

語法格式:fetch 游標(biāo)名稱 into 變量名;

游標(biāo)一旦使用完畢,就應(yīng)將其關(guān)閉,釋放與游標(biāo)相關(guān)聯(lián)的資源。

語法格式:close 游標(biāo)名稱;

declare

cursor c1 is? select sno,cno,grade from sc;

v_sno sc.sno%type;

v_cno sc.cno%type;

v_grade sc.grade%type;

begin

open c1;

loop

? fetch c1 into v_sno,v_cno,v_grade;

? exit when c1%notfound;--緊跟fetch之后

if c1%found then

dbms_output.put_line(to_char(c1%rowcount)||v_cno);

end if;

end loop;

close c1;?

end;

declare

cursor c1 is select sno,cno,grade from sc;

v_sno sc.sno%type;

v_cno sc.cno%type;

v_grade sc.grade%type;

begin

open c1;

fetch c1 into v_sno,v_cno,v_grade;

while c1%found loop

? dbms_output.put_line(v_sno||v_cno||v_grade);

?fetch c1 into v_sno,v_cno,v_grade;

end loop;

close c1;?

end;

第三種:for

declare

cursor c1 is select sno,cno,grade from sc;

begin

for item in c1 loop

dbms_output.put_line(rpad(item.sno,'10',' ')||rpad(item.cno,'10',' ')||rpad(item.grade,'10',' '));

end loop;

end;

Oracle 數(shù)據(jù)量非常大(上億)時,使用存儲過程中的游標(biāo)返回分頁查詢的10條記錄非常耗時,請問如何優(yōu)化?

select * /*+ FIRST_ROWS */ from XXX where XXX

提高SQL語句的響應(yīng)時間,快速的先返回 n 行。

SELECT /*+ FIRST_ROWS */ * FROM

(

SELECT A.*, ROWNUM RN

FROM (SELECT * FROM TABLE_NAME) A

WHERE ROWNUM = 40

)

WHERE RN = 21

oracle 怎么提升游標(biāo)速度

游標(biāo)一般都是在執(zhí)行sql語句,我不知道你指的是這個sql語句比較慢,還是單純的游標(biāo)速度慢。

sql語句慢可以根據(jù)使用改寫sql語句的寫法,建立索引,建立分區(qū)等優(yōu)化手段來解決。

單純游標(biāo)速度慢,可以考略批量執(zhí)行

bulk collect這種方式提取數(shù)據(jù)

使用forall 替代for 循環(huán)也可以提升效率。

以下是我總結(jié)的plsql調(diào)優(yōu)的重點,你可以參考一下:

1. 盡早退出循環(huán)

2. static的變量盡量放在循環(huán)的外層

3. 因為and 和or 只要判斷左邊的表達(dá)式為真即可推出 邏輯判斷

所以

將容易出現(xiàn)true的邏輯表達(dá)式放在左邊,這樣可以省下處理的時間

4. if else 和case when 同上

5. 盡量使用迭代,而不是遞歸,因為調(diào)用存儲過程或者函數(shù),會開辟另外的內(nèi)存空間

6. 通常函數(shù)都是值傳遞,即傳參數(shù)的時候會copy參數(shù)的值到子程序中

對于數(shù)據(jù)量比較大的參數(shù)可以使用

in out nocopy 指定引用傳遞,可以節(jié)省大量時間

7. 可以使用關(guān)聯(lián)數(shù)組,較少查找集合中元素的時間

關(guān)聯(lián)數(shù)組

index by varchar2(xx) 類似于map,會省下很集合操作,以及時間。

8. 對于cpu密集型的plsql,可以使用native 本地編譯的特性

alter xxx compile plsql_code_type=native ;

9. 經(jīng)常使用的子程序可以使用inline函數(shù)內(nèi)嵌到主程序中

pragma inline($FUNCTION_NAME,'yes') ;

重載的程序只要擁有相同的名稱都會被內(nèi)嵌到program unit中

plsql_optimize_level=2的時候需要聲明inline使用內(nèi)聯(lián)

plsql_optimize_level=3的編譯的時候會自動的做這部分工作。不需要自己執(zhí)行inline操作。可以使用PRAGMA INLINE (p1, 'NO');禁止內(nèi)聯(lián)

當(dāng)level=3的時候聲明了inline會給予這個子程序更高的inline的優(yōu)先級。

下面的語句中

(1)PRAGMA INLINE (p1, 'YES');

(2)PRAGMA INLINE (p1, 'NO');

(3)PRAGMA INLINE (p1, 'YES');

第二行會覆蓋第一行以及第三行,也就是說program unit 中獎不使用內(nèi)聯(lián)

10. 大量數(shù)字操作的時候可以使用java存儲過程

11. 使用result cache功能 緩存經(jīng)過計算得到的結(jié)果

relies_on($TB_NAME)

指定當(dāng)表tb_name的數(shù)據(jù)改變時,結(jié)果集緩存失效

12. 使用

update of $COLUMN_NAME on $TB_NAME

for each row

when (new.xx1000)

可以省下需要處理時間

最好都使用after 觸發(fā)器,before可能會有鎖定的問題

網(wǎng)站名稱:oracle如何優(yōu)化游標(biāo) oracle使用游標(biāo)更新數(shù)據(jù)
文章起源:http://www.rwnh.cn/article34/higdse.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、營銷型網(wǎng)站建設(shè)、搜索引擎優(yōu)化云服務(wù)器、網(wǎng)站排名關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名
莎车县| 惠东县| 高尔夫| 巢湖市| 峨山| 澎湖县| 金坛市| 贞丰县| 武邑县| 五莲县| 深州市| 皮山县| 抚宁县| 南郑县| 宁城县| 枞阳县| 平凉市| 杂多县| 兴化市| 古浪县| 宁强县| 璧山县| 历史| 广州市| 石嘴山市| 宜阳县| 怀来县| 台湾省| 平凉市| 台中市| 水城县| 探索| 定日县| 时尚| 榆中县| 正定县| 长阳| 庄河市| 进贤县| 元阳县| 贵州省|