Oracle學習筆記整理之游標篇

2021-05-28 09:01:05 字數 4823 閱讀 2125

游標分為隱式、顯式、ref三種游標。

而隱式游標和顯式游標又都屬於靜態游標,ref游標屬於動態游標。

靜態游標和動態游標的最大區別在於靜態游標是在執行前將游標變數和sql關聯,而動態游標恰恰相反是在執行後將游標變數和sql進行關聯。

隱式游標是由oracle自動管理,也稱sql游標。所有的dml都被oracle解析成為乙個名為sql的隱式游標。dml包括insert、delete、update、merge into。而select屬於dql。

隱式游標的屬性有:

屬性名 說明

sql%found 影響行數大於等於1是為 ture

sql%notfound 沒有影響行是為true

sql%rowcount 受影響的行數

sql%isopen 游標是否開啟,始終為false

sql%bulk_rowcount(index) ...

sql%bulk_exceptions(index).error_index ...

sql%bulk_exceptions(index).error_code ...

隱式游標例項:

begin

--執行dml操作

update chg_test_b b set b.chg_name = 'ff' where b.chg_id = 5;

--判斷是否有受影響行

if sql%found then

--列印受影響行數

dbms_output.put_line('影響行數:' || sql%rowcount);

end if;

--判斷是否沒有受影響行

if sql%notfound then

dbms_output.put_line('id為5的記錄不存在');

end if;

end;

無參顯式游標例項:

declare

--宣告游標表變數並關聯sql

cursor rowlist is

select * from chg_test_b b;

--宣告行變數

--如果上面的查詢語句只有乙個查詢字段,這裡也可以使用正常的變數宣告方式(v_rowvalue varchar2(20);)。

rowvalue chg_test_b%rowtype;

begin

open rowlist;--開啟游標

--如果確定由表中只有一條記錄的話,loop和end loop可以不寫,而exit必須存在於游標迴圈內,所以也不需要寫。

loop

fetch rowlist

into rowvalue;--取出游標內的值放到rowvalue中

exit when rowlist%notfound;--判斷是否還存在記錄,如果不存在終止游標

dbms_output.put_line(rowvalue.chg_name);--將的到的值列印,如果查詢只有乙個字段這裡只需寫變數名即可。

end loop;

close rowlist;--關閉游標

end;

有參顯式游標例項:

declare

--宣告帶引數的游標變數並關聯sql,並將引數與sql進行關聯

cursor rowlist(c_name varchar2, c_id number) is

select * from chg_test_b b where b.chg_name = c_name and b.chg_id = c_id;

--宣告行變數

--如果上面的查詢語句只有乙個查詢字段,這裡也可以使用正常的變數宣告方式(v_rowvalue varchar2(20);)。

rowvalue chg_test_b%rowtype;

begin

open rowlist('chg1', 1);--開啟游標,並將引數給出

--如果確定由表中只有一條記錄的話,loop和end loop可以不寫,而exit必須存在於游標迴圈內,所以也不需要寫。

loop

fetch rowlist

into rowvalue;--取出游標內的值放到rowvalue中

exit when rowlist%notfound;--判斷是否還存在記錄,如果不存在終止游標

dbms_output.put_line(rowvalue.chg_name);--將的到的值列印,如果查詢只有乙個字段這裡只需寫變數名即可。

end loop;

close rowlist;--關閉游標

end;

在游標內進行dml操作例項:

declare

--宣告游標變數,並關聯sql

--如果要在游標內執行dml操作,必須使用for update。

--使用for update後你所操作的行或列將會被鎖,如果這時其他人操作就會進入等待狀態。

--如果你在執行select時記錄被鎖,那麼就會進入等待狀態,

--為了避免這種情況可以在 for update後使用 nowait,這樣你的結果就可以立即返回,但不建議使用

--如果被鎖在開啟游標時會報出ora-00054資源正忙異常,需捕獲異常進行處理

--使用of的區別時鎖字段和鎖行。

cursor rowlist is

select b.* from chg_test_b b for update of b.chg_name nowait;

--如果上面的查詢語句只有乙個查詢字段,這裡也可以使用正常的變數宣告方式(v_rowvalue varchar2(20);)。

rowvalue chg_test_b%rowtype;

v_i number(11);

begin

v_i := 1;

open rowlist;--開啟游標

--如果確定由表中只有一條記錄的話,loop和end loop可以不寫,而exit必須存在於游標迴圈內,所以也不需要寫。

loop

fetch rowlist

into rowvalue;--取出游標內的值放到rowvalue中

exit when rowlist%notfound;--判斷是否還存在記錄,如果不存在終止游標

dbms_output.put_line(rowvalue.chg_name);--將的到的值列印,如果查詢只有乙個字段這裡只需寫變數名即可。

--執行dml操作

update chg_test_b b

set b.chg_name = 'chg' || v_i

where current of rowlist;

v_i := v_i + 1;

end loop;

close rowlist;--關閉游標

commit;

end;

迴圈游標例項:

迴圈游標不需要手動進行開啟和管理操作,全部由oracle進行管理。

declare

--宣告游標變數並關聯sql

cursor rowlist is

select level a from dual connect by level <= 10;

begin

for rowvalue in rowlist loop

--rowvalue是每條記錄不需要事先宣告,rowlist是集合中的所有記錄

dbms_output.put_line(rowvalue.a);--取出集合中的值進行列印

end loop;

end;

declare

begin

--可以將select語句for xx in 內,無論傳參或是巢狀更為方便簡潔。

for rowvalue in (select level a from dual connect by level <=10) loop

for rv in (select col1 from tab1 where tab1.id = rowvalue.a) loop

dbms_output.put_line(rv.col1 );--將的到的值列印。

end loop;

end loop;

end;

declare

begin

for rowvalue in 1..10 loop

dbms_output.put_line(rowvalue);--將的到的值列印,如果查詢只有乙個字段這裡只需寫變數名即可。

end loop;

end;

ref游標例項:

declare

type cus_cur_type is ref cursor return chg_test_b%rowtype;--強型別ref游標,查詢的sql必須返回chg_test_b表型別

--type cus_cur_type is ref cursor; 弱型別ref游標,返回型別沒有限制

rowlist cus_cur_type;-- 宣告游標變數

rowvalue chg_test_b%rowtype;--宣告行變數

begin

open rowlist for--開啟游標,並關聯sql

select * from chg_test_b b;

loop

fetch rowlist

into rowvalue; --按行取出資料

exit when rowlist%notfound;--判斷是否還存在記錄,如果不存在終止游標

dbms_output.put_line(rowvalue.chg_name);--將的到的值列印,如果查詢只有乙個字段這裡只需寫變數名即可。

end loop;

close rowlist;--關閉游標

end;

Oracle學習筆記整理之游標篇

游標分為隱式 顯式 ref三種游標。而隱式游標和顯式游標又都屬於靜態游標,ref游標屬於動態游標。靜態游標和動態游標的最大區別在於靜態游標是在執行前將游標變數和sql關聯,而動態游標恰恰相反是在執行後將游標變數和sql進行關聯。隱式游標是由oracle自動管理,也稱sql游標。所有的dml都被ora...

Oracle資料庫學習筆記之游標

游標 游標 用來處理資料庫中臨時得到的資料,預設情況下oracle資料庫之允許在同乙個會話中,開啟300個游標 alter system set open cursors 400 scope both scope的取值memory 只更改當前值,不更改引數檔案 spfile 只更改引數檔案,不更改當...

入門oracle之游標

在寫oracle資料庫函式的時候,往往會返回乙個結果集,我們通過游標來實現這個操作,它的語法是 cursor 游標名 引數名 資料型別 引數名 資料型別 is select 語句 ex cusor a1 is select name from 表名 定義乙個a1的游標返回乙個表的所有name值。使用...