Oracle學習筆記第十二天-01
阿新 • • 發佈:2019-01-05
Oracle學習筆記第十二天-01
遊標
概念: 遊標是系統為使用者開設的一個數據緩衝區,存放SQL 語句的執行結果,每個遊標區都有一個名字。使用者可以通過遊標逐一獲取記錄
分類:
靜態遊標: 在編譯時知道其SELECT 語句的遊標
動態遊標: 執行的時候動態決定執行何種查詢
--語法
-- 宣告遊標
CURSOR cursor_name is query_sql;
-- 開啟遊標
OPEN cursor_name;
-- 提取遊標
FETCH cursor_name INTO variable_list;
-- 使用FETCH語句實現對遊標內容的讀取
-- variable_list必須與從遊標提取的結果集型別相同
-- 關閉遊標
CLOSE cursor_name;
-- 使用CLOSE語句關閉一個遊標
-- 關閉遊標後,所有資源都將被釋放
舉例:先登入Scott使用者
SET SERVEROUTPUT ON; DECLARE -- 定義一個遊標 CURSOR c_emp IS SELECT * FROM emp; -- 定義一個變數來接收遊標讀取出來的值 v_emp emp%ROWTYPE; BEGIN -- 先開啟遊標 OPEN c_emp; -- 提取遊標 FETCH c_emp INTO v_emp; dbms_output.put_line('工號:'||v_emp.empno|| '姓名:'||v_emp.ename|| '工資:'||v_emp.sal); CLOSE c_emp; END; /
這裡只提取了一行,現在有個疑問就是怎麼提取下一行,其實很簡單,就是再次呼叫 提取遊標 就可以提取下一行。
SET SERVEROUTPUT ON; DECLARE -- 定義一個遊標 CURSOR c_emp IS SELECT * FROM emp; -- 定義一個變數來接收遊標讀取出來的值 v_emp emp%ROWTYPE; BEGIN -- 先開啟遊標(此時執行查詢sql,得到結果集) OPEN c_emp; LOOP -- 提取一行資料 FETCH c_emp INTO v_emp; -- 判斷是否要退出迴圈。 EXIT WHEN c_emp%NOTFOUND; dbms_output.put_line('工號:'||v_emp.empno|| '姓名:'||v_emp.ename|| '工資:'||v_emp.sal); END LOOP; CLOSE c_emp; END; /
屬性 | 作用 |
---|---|
%found | 用於檢驗遊標是否成功,通常在FETCH語句後使用,當遊標按照條件查詢出一條記錄時,返回true |
%isopen | 判斷遊標是否處於開啟狀態,試圖開啟一個已經開啟或者已經關閉的遊標,將會出現錯誤,開啟為true |
%notfound | 與%found的作用相反,當按照條件無法查詢到記錄時,返回true |
%rowcount | 迴圈執行遊標讀取資料時,返回檢索出的記錄資料的行數 ,當前取出來資料的行數 |
循環遊標
它是使用顯式遊標最簡單的方式。
-- 語法一:
for 記錄名 in (遊標名)
loop
end loop;
-- 語法二:
for 遊標名 in (select 語句)
loop
end loop;
舉例:
set serveroutput on;
declare
--定義遊標(查詢所有員工表的工號,姓名,工資)
cursor c_emp is select * from emp;
begin
for v_emp in c_emp loop
--輸出
dbms_output.put_line('工號:'||v_emp.empno||
'姓名:'||v_emp.ename||
'工資:'||v_emp.sal);
end loop;
end;
/
set serveroutput on;
declare
begin
for v_emp in (select empno,ename,sal from emp) loop
--輸出
dbms_output.put_line('工號:'||v_emp.empno||
'姓名:'||v_emp.ename||
'工資:'||v_emp.sal);
end loop;
end;
/
這兩個循環遊標是顯示遊標的簡化版,在這些版本中,不用自己去定義變數來接收遊標中的資料,不用自己手動開啟遊標,不用自己手動關閉遊標。
在迴圈過程中會自動開啟遊標,迴圈完候會自動關閉遊標。