LOOP循環(huán)
如:
DECLARE
dept_row dept%ROWTYPE; --定義游標(biāo)結(jié)果記錄變量
CURSOR dept_cursor IS SELECT * FROM dept; --定義游標(biāo)變量
BEGIN
OPEN dept_cursor; --打開游標(biāo)
LOOP --簡單循環(huán)
FETCH dept_cursor INTO dept_row; --提取游標(biāo)數(shù)據(jù)
EXIT WHEN dept_cursor%NOTFOUND; --退出循環(huán)的控制語句
DBMS_OUTPUT.PUT_LINE('部門名稱:'||dept_row.dname);
END LOOP;
CLOSE dept_cursor; --關(guān)閉游標(biāo)
END;
WHILE循環(huán)
如:
DECLARE
dept_row dept%ROWTYPE; --定義游標(biāo)結(jié)果記錄變量
CURSOR dept_cursor IS SELECT * FROM dept; --定義游標(biāo)變量
BEGIN
OPEN dept_cursor; --打開游標(biāo)
FETCH dept_cursor INTO dept_row; --提取游標(biāo)數(shù)據(jù)
WHILE dept_cursor%FOUND LOOP
DBMS_OUTPUT.PUT_LINE('部門名稱:'||dept_row.dname);
FETCH dept_cursor INTO dept_row; --提取游標(biāo)數(shù)據(jù)
END LOOP;
CLOSE dept_cursor; --關(guān)閉游標(biāo)
END;
游標(biāo)FOR循環(huán)
游標(biāo)FOR循環(huán)可以省去很多代碼,PL/SQL隱式地做了很多工作。
如:
DECLARE
CURSOR dept_cursor IS SELECT * FROM dept; --定義游標(biāo)變量
BEGIN
FOR dept_row IN dept_cursor LOOP --在游標(biāo)FOR循環(huán)中檢索數(shù)據(jù)
DBMS_OUTPUT.PUT_LINE('部門名稱:'||dept_row.dname);
END LOOP;
END;
還能再簡單一點:
BEGIN
FOR dept_row IN (SELECT * FROM dept) LOOP --在游標(biāo)FOR循環(huán)中檢索數(shù)據(jù)
DBMS_OUTPUT.PUT_LINE('部門名稱:'||dept_row.dname);
END LOOP;
END;
修改游標(biāo)數(shù)據(jù)
很多時候,從游標(biāo)檢索出來的數(shù)據(jù)要進行一些修改,比如更新游標(biāo)數(shù)據(jù)或?qū)τ螛?biāo)數(shù)據(jù)進行刪除。Oracle提供了方便的語法來處理游標(biāo)數(shù)據(jù)修改的操作:在游標(biāo)的聲明部分添加FOR UPDATE,然后在UPDATE或DELETE語句中添加WHERE CURRENT OF。
FOR UPDATE
FOR UPDATE會對用SELECT語句提取出來的結(jié)果進行鎖定,相當(dāng)于給結(jié)果集的行加了一把互斥鎖,實行行級鎖定。這樣其他的用戶會話就不能對當(dāng)前游標(biāo)行進行修改或刪除,直到整個事務(wù)被提交為止。
如:
DECLARE
dept_row dept%ROWTYPE; --定義游標(biāo)結(jié)果記錄變量
CURSOR dept_cursor IS SELECT * FROM dept FOR UPDATE deptno,dname; --定義游標(biāo)變量
BEGIN
OPEN dept_cursor; --打開游標(biāo)
FETCH dept_cursor INTO dept_row; --提取游標(biāo)數(shù)據(jù)
WHILE dept_cursor%FOUND LOOP
DBMS_OUTPUT.PUT_LINE('部門名稱:'||dept_row.dname);
FETCH dept_cursor INTO dept_row; --提取游標(biāo)數(shù)據(jù)
END LOOP;
CLOSE dept_cursor; --關(guān)閉游標(biāo)
END;
WHERE CURRENT OF
在使用了FOR UPDATE鎖定了表中的行后,可以在UPDATE或DELETE語句中使用WHERE CURRENT OF來得到當(dāng)前游標(biāo)所檢索出來的行。
使用WHERE CURRENT OF檢索的游標(biāo)一定要有FOR UPDATE,并且游標(biāo)要被打開且至少返回一行,否則Oracle會觸發(fā)錯誤。
用法如:
DECLARE
CURSOR emp_cursor (p_deptno IN NUMBER)
IS
SELECT *
FROM emp
WHERE deptno = p_deptno
FOR UPDATE; --使用FOR UPDATE子句添加互斥鎖
BEGIN
FOR emp_row IN emp_cursor (20) --使用游標(biāo)FOR循環(huán)檢索游標(biāo)
LOOP
UPDATE emp
SET comm = comm * 1.12
WHERE CURRENT OF emp_cursor; --使用WHERE CURRENT OF更新游標(biāo)數(shù)據(jù)
END LOOP;
COMMIT; --提交更改
END;
DECLARE
CURSOR emp_cursor (p_empno IN NUMBER)
IS
SELECT *
FROM emp
WHERE empno = p_empno
FOR UPDATE; --使用FOR UPDATE子句添加互斥鎖
BEGIN
FOR emp_row IN emp_cursor (7369) --使用游標(biāo)FOR循環(huán)檢索游標(biāo)
LOOP
DELETE FROM emp
WHERE CURRENT OF emp_cursor; --使用WHERE CURRENT OF刪除游標(biāo)數(shù)據(jù)
END LOOP;
END;
|