更新時間:2021-03-16 17:22:04 來源:動力節點 瀏覽1254次
在PL/SQL中,針對多行多列的數據類型,可以使用游標變量。當在PL/SQL中執行SELECT, INSERT, UPDATE, DELETE語句時,Oracle服務器會為這些語句分配相應的上下文區域(Context Area),Oracle使用該上下文區域解析和處理相應的SQL語句。PL/SQL游標就是指向該上下文區域的指針,通過該指針,開發者可以獲取語句的執行狀態,還可以對查詢語句返回的多條記錄進行逐條的訪問和處理。
1、PL/SQL游標的基本操作
游標包括兩種游標:隱含游標和顯式游標。隱含游標用于處理SELECT INTO和DML語句,而顯式游標則專門用于處理SELECT語句返回的多行數據。
游標的基本操作有:聲明游標、打開游標、提取游標和關閉游標。
下面的代碼塊展示了這四個基本操作:
DECLARE
????CURSOR c_emp IS SELECT * FROM EMP; --聲明游標
????emp_record emp%ROWTYPE;BEGIN
????OPEN c_emp; --打開游標 ???LOOP
????????FETCH c_emp INTO emp_record; --提取游標
????????DBMS_OUTPUT.PUT_LINE('雇員名稱:'||emp_record.ename);
????EXIT WHEN c_emp%NOTFOUND;
????END LOOP;
????CLOSE c_emp; --關閉游標END;/
2、PL/SQL游標屬性
游標作為一個臨時表,可以通過游標的屬性來獲取游標狀態。游標有4個常用的屬性:
1)%ISOPEN:用于判斷游標是否已經打開
2)%FOUND:用于判斷游標是否找到記錄
3)%NOTFOUND:與%FOUND相反.
4)%ROWCOUNT:返回到當前為止已經提取到的實際行數.
3、參數化游標
參數化游標是指帶有參數的游標,在定義了參數游標之后,當使用不同的參數值多次打開游標時,可以生成不同的結果集。參數化游標的聲明語法如下:
CURSOR cursor_name(parameter) IS SELECE ...
Example:參數化游標的使用
DECLARE
????CURSOR emp_cursor(dno NUMBER) IS
????SELECT ename FROM emp WHERE deptno=dno;
????v_ename emp.ename%TYPE;BEGIN
????OPEN emp_cursor(10);
????LOOP
????????FETCH emp_cursor INTO v_ename;
????????EXIT WHEN emp_cursor%NOTFOUND;
????????DBMS_OUTPUT.PUT_LINE(v_ename);
????END LOOP;
????CLOSE emp_cursor;END;/
4、隱式游標就是指非PL/SQL程序中定義的,而且是在PL/SQL中使用UPDATE、DELETE或SELECT INTO語句時,Oracle系統自動分配的游標。隱式游標名稱固定為SQL。隱式游標無須聲明和打開,使用完后也不用關閉,所有這一切都由系統自動維護。
Example:SELECT INTO的隱式游標
DECLARE
????v_emp emp%ROWTYPE;BEGIN
????SELECT * INTO v_emp FROM emp WHERE empno=7788;
????IF SQL%FOUND THEN
????????DBMS_OUTPUT.PUT_LINE('7788的雇員名稱:'||v_emp.ename);
????END IF;END;/
Example:UPDATE的隱式游標
BEGIN
????UPDATE emp SET ename='SCOTT' WHERE empno=7788;
????IF SQL%FOUND THEN
????????DBMS_OUTPUT.PUT_LINE('更新成功!');
????END IF;END;/
5、使用PL/SQL游標更新或刪除數據
通過使用顯式游標,不僅可以一行一行地處理SELECT語句的結果,而且也可以更新或刪除當前游標行的數據。在使用游標更新或刪除數據時有兩點需要注意的地方:
聲明游標是必須帶有FOR UPDATE子句,如:
CURSOR cursor_name IS SELECT ... FOR UPDATE
在提取了游標數據之后,為了更新或刪除當前游標行數據,必須在UPDATE或DELETE語句中引用WHERE CURRENT OF子句。如:
UPDATE table_name SET column=... WHERE CURRENT OF cursor_name;DELETE table_name WHERE CURRENT OF cursor_name;
Example:使用游標更新數據
DECLARE
????CURSOR emp_cursor IS SELECT ename,sal FROM emp FOR UPDATE;
????v_ename emp.ename%TYPE;
????v_sal emp.sal%TYPE;BEGIN
????OPEN emp_cursor;
????LOOP
????????FETCH emp_cursor INTO v_ename,v_sal;
????????EXIT WHEN emp_cursor%NOTFOUND;
????????IF v_sal<2000 THEN
????????????UPDATE emp SET sal=sal+100 WHERE CURRENT OF emp_cursor;
????????END IF;
????END LOOP;
????CLOSE emp_cursor;END;/
6、PL/SQL游標FOR循環
當使用游標FOR循環時,Oracle會隱含地打開游標、提取游標數據并關閉游標。
Example:使用游標FOR循環
DECLARE
????CURSOR emp_cursor IS SELECT * FROM emp;
????v_emp emp%ROWTYPE;BEGIN
????FOR v_emp IN emp_cursor LOOP
????????DBMS_OUTPUT.PUT_LINE('第'||emp_cursor%ROWCOUNT||'個雇員'||v_emp.ename);
????END LOOP;END;/
Example: 在游標FOR循環中直接使用子查詢
DECLARE
????v_emp emp%ROWTYPE;BEGIN
????FOR v_emp IN (SELECT * FROM EMP) LOOP
????????DBMS_OUTPUT.PUT_LINE('編號'||v_emp.empno||'的雇員名稱:'||v_emp.ename);
????END LOOP;END;/
7、PL/SQL游標變量
上面提到的顯式游標和隱式游標都與固定的查詢語句相關聯,所以稱之為靜態游標。游標變量與靜態游標不同,它是一種動態游標,在運行期間可以與不同的查詢語句相關聯。
要聲明游標變量,首先得創建一個游標數據類型,創建游標數據類型的語法如下:
TYPE cursor_data_type_name IS REF CURSOR [RETURN return_type];
Example:操作游標變量
DECLARE
????TYPE emp_cursor_type IS REF CURSOR RETURN emp%ROWTYPE;
????emp_cursor emp_cursor_type;
????emp_record emp%ROWTYPE;BEGIN
????IF NOT emp_cursor%ISOPEN THEN
????????OPEN emp_cursor FOR SELECT * FROM emp WHERE deptno=10;
????END IF;
????LOOP
????????FETCH emp_cursor INTO emp_record;
????????EXIT WHEN emp_cursor%NOTFOUND;
????????DBMS_OUTPUT.PUT_LINE('雇員名:'||emp_record.ename);
????END LOOP;END;/
本文非常全面的介紹了PL/SQL游標的各種操作,幫助我們有效的掌握PL/SQL游標的相關知識。在本站的PL/SQL教程中還涉及到了其他的PL/SQL的專業知識,幫助我們開拓新的知識體系,展開對新知識和新事物的探究和學習。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習