1. 程式人生 > >Oracle學習筆記第十二天-01

Oracle學習筆記第十二天-01

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;
/

這兩個循環遊標是顯示遊標的簡化版,在這些版本中,不用自己去定義變數來接收遊標中的資料,不用自己手動開啟遊標,不用自己手動關閉遊標。

在迴圈過程中會自動開啟遊標,迴圈完候會自動關閉遊標。