1. 程式人生 > >PL/SQL 遊標的使用詳解

PL/SQL 遊標的使用詳解

四個步驟 語法 list %type 查詢 dbms 打開 def default

一:通過遊標,PL/SQL 指向語句被分析以後的活動集

二:對於不同的SQL語句,遊標的使用情況不同:
1:非查詢語句--隱式的
2:結果是單行的查詢語句--隱式的或顯式的
3:結果是多行的查詢語句--顯式的

三:遊標屬性
1:%FOUND
2:%NOTFOUND
3:%ISOPEN
4:%ROWCOUNT

三:顯式遊標的用法
四個步驟
(1)定義一個遊標名,以及與其相對應的SELECT 語句。語法:CURSOR cursor_name IS select_statement
(2)打開遊標。語法:OPEN cursor_name
(3)提取遊標。語法:FETCH cursor_name INTO {variable_list | record_variable }。
如:FETCH c_cursor INTO v_ename, v_sal
(4)關閉遊標。語法:CLOSE cursor_name
例:
DECLARE
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
CURSOR c_cursor IS SELECT ename, sal FROM emp WHERE rownum<11;--聲明的最後部分定義遊標
BEGIN
OPEN c_cursor;--執行部分的開始打開遊標
FETCH c_cursor INTO v_ename, v_sal;--打開後提取一次遊標
WHILE c_cursor %FOUND LOOP
DBMS_OUTPUT.PUT_LINE(v_ename||‘---‘||to_char(v_sal) );
FETCH c_cursor INTO v_ename, v_sal;--循環最後提取遊標
END LOOP;
CLOSE c_cursor;--遊標提取結束後關閉遊標
END;

四:參數化遊標
定義遊標名的後面加(變量名 類型)。變量用來和SQL的條件語句做比較
例:
DECLARE
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
CURSOR c_cursor(P_sal emp.sal%type)
IS SELECT ename, sal FROM emp WHERE sal >= P_sal;
BEGIN
OPEN c_cursor(1000);
FETCH c_cursor INTO v_ename, v_sal;
WHILE c_cursor %FOUND LOOP
DBMS_OUTPUT.PUT_LINE(v_ename||’---‘||to_char(v_sal) );
FETCH c_cursor INTO v_ename, v_sal;
END LOOP;
CLOSE c_cursor;
END;


五:隱式遊標
顯式遊標主要是用於對查詢語句的處理,尤其是查詢結果為多條記錄;
而對於非查詢語句,則由系統自動設置遊標,
稱為隱式遊標,隱式遊標的名字為SQL,是由系統定義的。
對於隱式遊標的操作,如定義、打開、取值及關閉操作,都由系統自動完成,無需用戶進行處理。
用戶只能通過隱式遊標的相關屬性,來完成相應的操作。
1:隱式遊標屬性
(1)%FOUND
(2)%NOTFOUND
(3)%ISOPEN
(4)%ROWCOUNT
例:
DECLARE
V_deptno emp.deptno%TYPE :=&p_deptno;
BEGIN
DELETE FROM emp WHERE deptno=v_deptno;
IF SQL%NOTFOUND THEN
DELETE FROM dept WHERE deptno= 20;
END IF;
END;


六:遊標檢索循環
例:
DECLARE
v_empno emp.empno%TYPE;
v_sal emp.sal%TYPE;
CURSOR c_cursor IS SELECT empno, sal FROM emp;
BEGIN
OPEN c_cursor;
LOOP
FETCH c_cursor INTO v_empno, v_sal;
EXIT WHEN c_cursor %NOTFOUND;
IF v_sal<=1200 THEN
UPDATE emp SET sal=sal+50 WHERE empno=v_empno;
DBMS_OUTPUT.PUT_LINE(‘編碼為‘||v_empno||‘工資已更新!‘);
END IF;
DBMS_OUTPUT.PUT_LINE(‘記錄數:‘|| c_cursor %ROWCOUNT);
END LOOP;
CLOSE c_cursor;
END;

七:遊標的FOR循環
遊標FOR循環語句,自動執行遊標的OPEN、FETCH、CLOSE語句和循環語句的功能;
當進入循環,自動打開遊標,並提取第一行遊標數據。
當處理完當前所提取的數據而進入下一次循環時,自動提取下一行數據。
當提取完結果集中的所有數據後結束循環,並自動關閉遊標。

1:語法:
FOR 索引變量名 IN 遊標名 LOOP
-- 遊標數據處理代碼
END LOOP;

例:
DECLARE
CURSOR c_sal IS SELECT empno, ename, sal FROM emp ;
BEGIN
--隱含打開遊標
FOR v_sal IN c_sal LOOP
--隱含執行一個FETCH語句。 通過索引變量提取遊標數據
DBMS_OUTPUT.PUT_LINE( to_char(v_sal.empno)||‘---‘||v_sal.ename||‘---‘||to_char(v_sal.sal)) ;
--隱含監測c_sal%NOTFOUND
END LOOP;
--隱含關閉遊標
END;


例:
DECLARE
CURSOR c_cursor(dept_no NUMBER DEFAULT 10) IS --參數化遊標
SELECT dname, loc FROM dept WHERE deptno <= dept_no;
BEGIN
DBMS_OUTPUT.PUT_LINE(‘dept_no參數值為30:’);
FOR c1_rec IN c_cursor (30) LOOP--for循環從索引變量到遊標活動集
DBMS_OUTPUT.PUT_LINE(c1_rec.dname||‘---‘||c1_rec.loc);--循環體根據索引提取遊標數據
END LOOP;
DBMS_OUTPUT.PUT_LINE(CHR(10)||‘使用默認的dept_no參數值10:‘);
FOR c1_rec IN c_cursor LOOP
DBMS_OUTPUT.PUT_LINE(c1_rec.dname||‘---‘||c1_rec.loc);
END LOOP;
END;


八:遊標變量

遊標變量是動態的,而遊標是靜態的。遊標只能與指定的查詢相連,
即固定指向一個查詢的內存處理區域,而遊標變量可與不同的查詢語句相連,
可以指向不同查詢語句的內存處理區域,只要這些查詢語句的返回類型兼容即可。

PL/SQL 遊標的使用詳解