目錄
1遊標
遊標:是構建在PL/SQL中用來記錄查詢數據庫結果的指針,他能夠一次性訪問一行結果集。允許以編程的方式訪問數據,在oralce 系統中分爲顯示遊標和隱式遊標。
1.1 定義遊標
主要是定義一個名詞來對應一條sql查詢語句,從而可以利用該遊標對查詢結果集進行業務操作。
語法 cursor cursor_name [(parameter....) ] [return result_type] is select statement
cursor_name 遊標名稱
parameter 輸入參數,用戶在使用遊標時輸入參數輔助,也可以使用默認值。輸入參數有多個,用逗號分隔
return result_type 操作返回類型 可選項
select statement 將要處理的查詢語句
如:
declare
cursor test (dept number:=10)
is
select * from emp where dept:=dept;
begin
..
end;
1.2 打開遊標
在聲明過遊標以後,該遊標並不會被oracle執行,只有在打開過遊標後才能執行查詢語句。在打開遊標過程中,如果有輸入參數,這時候需要爲這些參數賦值。
語法 open cursor_name [value[....]]
當打開遊標時會完成以下幾件事情:
- 檢查聯遍變量的取值
- 根據取值,確定活動集
- 活動集的指針指向第一行
open test(10)
1.3 從遊標中獲取數據
在打開遊標後,如果想獲取結果集中的數據,就需要從遊標中獲取數據,這時候使用fetch語句,把獲取的單行數據保存到定義的變量中。
語法: fetch cursor_name into variable(,...) /pl/sql記錄
遊標中包含一個數據行指針,打開遊標後,指針指向結果集的第一行,fetch每執行一次,遊標向後移動一行,直到結束,遊標只能逐個向後移動,不能跳躍移動或者向前移動。當遊標的最後一條記錄是不存在的,爲空時,表示數據行已經遍歷完成,這時候遊標的%found 屬性爲false。
1.4 遊標for循環
使用for循環可以遍歷遊標,在打開遊標的過程中,不需要打開和關閉遊標,也不需要手動判斷遊標是否還有返回記錄。並在for循環語句中設置的循環變量值存儲了當前檢索記錄的所有值,所以不需要定義變量接受記錄值。
語法: for var_record in cursor_name loop
pl/sql statement
end loop;
var_record 類型變量 cursor_name 遊標名稱 pl/sql statement pl/sql 語句
declare
cursor test (dept number:=10) -- 定義遊標
is
select * from emp where dept=dept ;
begin
for current in test loop
....
end loop;
end;
1.5 遊標屬性
在遊標檢索的過程中檢索的時單行數據,而遊標返回的時一個結果集合,存在多行數據。這時候如何知道檢索的數據是結果集中的那一行,這時候我們就用到遊標的屬性%isopen %found %notfound %rowcount 。這些屬性描述遊標操作的執行情況。這些屬性只能存在PL/SQL的流程控制語句中,而不能使用在sql語句中
1%found
該屬性表示當前遊標是否指向有效一行,返回結果爲布爾值。通過這個屬性我們可以判斷是否結束遊標的使用
2% notfound
該屬性表示當前遊標是否指向有效一行,返回結果爲布爾值。通過這個屬性我們可以判斷是否結束遊標的使用。這個屬性值與%found類型 但是值正好相反。
3%rowcount
該屬性爲當前遊標所在的行數。這個屬性在循環判斷中有效,這時候不必檢索所有行,就可以中斷操作。
4%isopen
是否打開遊標
declare
vid number;-- 聲明變量
cursor test (vno number) is -- 定義遊標
select * from emp where dept= vno;
begin
if test%isopen = false then -- 判斷遊標是否打開
open test(20)
end if;
fetch test into vid ; -- 讀取當前遊標的數據
while test%found ; -- 如果遊標有效,則執行循環
loop
if test%rowcount = 4 then
exit
end if;
end loop;
end;
參考oracle 從入門到精通
下一篇 oracle 存儲過程 https://blog.csdn.net/lilongwangyamin/article/details/104405655