Oracle PL/SQL顯示遊標、隱式遊標、遊標迴圈
dba基礎課程:Oracle PL/SQL顯示遊標、隱式遊標、遊標迴圈
顯示遊標
使用遊標順序
1.宣告遊標
2.開啟遊標
3.讀取遊標
4.資料是否為空,是關閉遊標,否繼續讀取
1.宣告遊標
cursor cur_name[(input_parameter1,input_parameter2...)]
[return ret_type]
is select_sentence;
input_parameter:para_name [in] datatype [{:= default|para_value}]
例子
cursor cur_orderinfo(ordercode in varchar2 := '0000000')
is select * from orderinfo where ordercode= ordercode;
這裡的引數不可以指定長度,否則會報錯
2.開啟遊標
open cur_name[(para_value[,para_value2]...)];
para_value:指定輸入引數的值
open cur_orderinfo('11111111');
param_value是可選引數,如果未指定則用宣告使用的預設值,如果指定了則用這裡指定的值
3.讀取遊標
fetch cur_name into {variable};
例子:
var_orderinfo orderinfo%rowtype;
fetch cur_order into var_orderinfo;
如果有值的話,可以用var_orderinfo.orderid讀取資料
4.關閉遊標
close cur_name;
例子:
close cur_orderinfo;
遊標的屬性
1.%found 布林型屬性 ,如果SQL語句至少影響到一行資料,則該屬性返回御前,否則返回false
2.%notfound 與%found屬性相反
3.%rowcount 數字型屬性,返回受SQL語句影響的行數
4.%isopen 布林型屬性,遊標開啟返回true,關閉返回false
例子:
set serveroutput on
declare
cursor cur_orderinfo (username in varchar2)
is select * from orderinfo where username= username;
var_orderinfo orderinfo%rowtype;
begin
open cur_orderinfo('abcd');
fetch cur_orderinfo into var_orderinfo;
while cur_orderinfo%found loop
dbms_output.put_line('訂單編號:' || var_orderinfo.ordercode);
fetch cur_orderinfo into var_orderinfo;
end loop;
close cur_orderinfo;
exception
when others then
dbms_output.put_line('錯誤');
end;
隱式遊標
在執行一個SQL語句時,Oracle會自動建立一個隱式遊標。這個遊標是記憶體中處理該語句的工作區域,隱式遊標主要是處理資料操縱語句(如update,
delete語句)的執行結果,當然特殊情況下,也可以處理select語句的查詢結果。由於隱式遊標也有屬性,當使用隱式遊標屬性時,需要在屬性前面加上隱式
遊標的預設名稱--SQL。在實際程式設計中,經常使用隱式遊標來判斷更新資料行或刪除資料行的情況。
set serveroutput on
begin
update orderinfo set mobilephone = '1111111111' where username = 'abcd';
if sql%notfound then
dbms_output.put_line('此使用者不需要更新手機號碼');
else
dbms_output.put_line('更新手機成功');
end if;
end;
通過for語句循環遊標
1.for語句迴圈隱式遊標
begin
for var_orderinfo in (select * from orderinfo)
loop
sql_sentences;
end loop;
end;
2.for語句迴圈顯示遊標
declare
cursor cur_orderinfo is select * from orderinfo;
begin
for var_orderinfo in cur_orderinfo
loop
sql_sentences;
end loop;
end;
for語句循環遊標時,可以宣告遊標,但不用開啟,讀取,關閉遊標。