目錄
16.1. 什麼是遊標
遊標是一種 PL/SQL 控制結構;可以對 SQL 語句的處理進行顯示控制,便於對錶的行數據逐條進行處理。
遊標並不是一個數據庫對象,只是存留在內存中
操作步驟:
•聲明遊標
•打開遊標
•取出結果,此時的結果取出的是一行數據
•關閉遊標到底那種類型可以把一行的數據都裝進來
•此時使用 ROWTYPE 類型,此類型表示可以把一行的數據都裝進來。
16.2. 遊標的屬性
oracle遊標有4個屬性: %ISOPEN , %FOUND , %NOTFOUND,%ROWCOUNT
--%ISOPEN 判斷遊標是否被打開,如果打開%ISOPEN 等於true,否則等於false
--%FOUND %NOTFOUND 判斷遊標所在的行是否有效,如果有效,則%FOUNDD等於true,否則等於false
-- %ROWCOUNT 返回當前位置爲止遊標讀取的記錄行數。
例子
查詢僱員編號爲 7369 的信息(肯定是一行信息)。
DECLARE
eno emp.empno%TYPE ;
empInfo emp%ROWTYPE ;
BEGIN
eno := &en ;
SELECT * INTO empInfo FROM emp WHERE empno=eno ;
DBMS_OUTPUT.put_line('僱員編號:'||empInfo.empno) ;
DBMS_OUTPUT.put_line('僱員姓名:'||empInfo.ename) ;
END ;
使用 for 循環操作遊標(比較常用)
DECLARE
-- 聲明遊標
CURSOR mycur IS SELECT * FROM emp where empno = -1;
empInfo emp%ROWTYPE;
cou NUMBER;
BEGIN
-- 遊標操作使用循環,但是在操作之前必須先將遊標打開
FOR empInfo IN mycur LOOP
cou := mycur%ROWCOUNT;
DBMS_OUTPUT.put_line(cou ||'僱員編號:'|| empInfo.empno);
DBMS_OUTPUT.put_line(cou ||'僱員姓名:'|| empInfo.ename);
END LOOP;
END;
編寫第一個遊標,輸出全部的信息
DECLARE
-- 聲明遊標
CURSOR mycur IS
SELECT * FROMemp;
-- List (EmpPo)
empInfo emp%ROWTYPE;
BEGIN
-- 遊標操作使用循環,但是在操作之前必須先將遊標打開
OPEN mycur;
-- 使遊標向下一行
FETCH mycur INTO empInfo;
-- 判斷此行是否有數據被發現
WHILE (mycur%FOUND) LOOP
DBMS_OUTPUT.put_line('僱員編號:'|| empInfo.empno);
DBMS_OUTPUT.put_line('僱員姓名:'|| empInfo.ename);
-- 修改遊標,繼續向下
FETCH mycur INTO empInfo;
END LOOP;
END;
也可以使用另外一種方式循環遊標:LOOP…END LOOP
DECLARE
-- 聲明遊標
CURSOR mycur IS
SELECT * FROMemp;
empInfo emp%ROWTYPE;
BEGIN
-- 遊標操作使用循環,但是在操作之前必須先將遊標打開
OPEN mycur;
LOOP
-- 使遊標向下一行
FETCH mycur INTOempInfo;
EXIT WHEN mycur%NOTFOUND;
DBMS_OUTPUT.put_line('僱員編號:'|| empInfo.empno);
DBMS_OUTPUT.put_line('僱員姓名:'|| empInfo.ename);
END LOOP;
END;
注意 1:
在打開遊標之前最好先判斷遊標是否已經是打開的。
通過 ISOPEN 判斷,
格式:遊標%ISOPEN
IFmycur%ISOPEN THEN null ;
ELSE OPEN mycur ;
ENDIF ;
注意 2:
可以使用 ROWCOUNT 對遊標所操作的行數進行記錄。
DECLARE
-- 聲明遊標
CURSOR mycur IS
SELECT * FROMemp;
empInfo emp%ROWTYPE;
cou NUMBER;
BEGIN
-- 遊標操作使用循環,但是在操作之前必須先將遊標打開
IF mycur%ISOPEN THEN
null;
ELSE
OPENmycur;
END IF;
LOOP
-- 使遊標向下一行
FETCH mycur INTO empInfo;
EXIT WHEN mycur%NOTFOUND;
cou := mycur%ROWCOUNT;
DBMS_OUTPUT.put_line(cou ||'僱員編號:'|| empInfo.empno);
DBMS_OUTPUT.put_line(cou ||'僱員姓名:'|| empInfo.ename);
END LOOP;
END;