標籤:
一:遊標的基本原理
遊標用來處理從資料庫中檢索的多行記錄(使用SELECT語句)。利用遊標,程式可以逐個地處理和遍曆一次檢索返回的整個記錄集。
為了處理SQL語句,Oracle將在記憶體中分配一個地區,這就是上下文區。這個區包含了已經處理完的行數、指向被分析語句的指標,整個區是查詢語句返回的資料行集。遊標就是指向上下文區控制代碼或指標。
二:遊標的分類
1.靜態資料指標:在編譯時間知道其SELECT語句的遊標。
(1).顯示遊標
(2).隱式遊標
2.動態資料指標:使用者為遊標使用的查詢直到啟動並執行時候才能確定,必須聲明遊標變數。
(1):強型別REF遊標
(2):弱類型REF遊標。
三:顯示遊標的用法
顯示遊標被用於處理返回多行資料的SELECT 語句,遊標名通過CURSOR….IS 語句顯示地賦給SELECT 語句。
(一):使用步驟
1)聲明遊標:
CURSOR cursor_name(遊標名) IS select 語句;
2)為查詢開啟遊標:
OPEN cursor_name(遊標名)
3)取得結果放入PL/SQL變數中;
FETCH cursor_name(遊標名) INTO list_of_variables(變數);
FETCH cursor_name(遊標名) INTO PL/SQL_record(變數列表);
4)關閉遊標。
CLOSE cursor_name遊標名
注意:在聲明遊標時,select_statement不能包含INTO子句。當使用顯示遊標時,INTO子句是FETCH語句的一部分。
例:顯示僱員的名稱和薪水
方法一:
--使用LOOP遍曆遊標DECLARE v_name emp.ename%TYPE; v_sal emp.sal%TYPE; CURSOR cus_emp IS SELECT ename,sal FROM emp; --聲明遊標BEGIN OPEN cus_emp; --開啟遊標 LOOP FETCH cus_emp INTO v_name,v_sal; --提取遊標 EXIT WHEN cus_emp%NOTFOUND; dbms_output.put_line(‘第‘||cus_emp%ROWCOUNT||‘個使用者: name:‘||v_name||‘ sal:‘||v_sal); END LOOP; CLOSE cus_emp; --關閉遊標END;
顯示遊標的屬性
%isopen:遊標是否開啟
%found:遊標是否指向有效行
%notfounp:遊標是否沒有指向有效行
%rowcount:遊標抽取的行數
文法:遊標名 屬性名稱
方法二:使用遊標簡化遊標的讀取
For 自訂類型 in 遊標名 loop;
--操作各行的資料
end loop;
DECLARE CURSOR cus_emp IS SELECT ename,sal FROM emp; BEGIN FOR record_emp IN cus_emp LOOP dbms_output.put_line(‘第‘||cus_emp%ROWCOUNT||‘個使用者: name:‘||record_emp.ename||‘ sal:‘||record_emp.sal); END LOOP; END; |
四、隱式遊標:
所有的隱式遊標都被假設為只返回一條記錄。
使用隱式遊標時,使用者無需進行聲明、開啟及關閉。PL/SQL隱含地開啟、處理,然後關掉遊標。多條sql語句 隱式遊標SQL永遠指的是最後一條sql語句的結果,主要使用在update 和 delete語句上。
隱式遊標的四個屬性:
| 屬性 |
說明 |
| SQL%rowcount |
影響的記錄的行數整數(用來判斷插入,更新修改是否成功,必須在comit之前,否則提交後結果為0.) |
| SQL%found |
影響到了記錄 true() |
| SQL%notfound |
沒有影響到記錄 true |
| SQL%isopen |
是否開啟 布爾值 永遠是false |
例如:
DECLARE row_emp emp%ROWTYPE;BEGIN SELECT ename,sal INTO row_emp.ename,row_emp.sal FROM emp WHERE emp.empno = 7369; --判斷是否查到資料 if(SQL%ROWCOUNT=1) THEN dbms_output.put_line(‘找到了‘); END IF; --另一種方式判斷 IF(SQL%Found) THEN dbms_output.put_line(‘找到了‘); END IF; dbms_output.put_line(‘ename:‘||row_emp.ename||‘ sal:‘||row_emp.sal);END;
五:動態資料指標
Oracle 基礎 遊標