游標(biāo)是一種 PL/SQL 控制結(jié)構(gòu);可以對 SQL 語句的處理進(jìn)行顯示控制,便于對表的行數(shù)據(jù)逐條進(jìn)行處理。
游標(biāo)并不是一個數(shù)據(jù)庫對象,只是存留在內(nèi)存中
操作步驟:
??聲明游標(biāo)
??打開游標(biāo)
??取出結(jié)果,此時的結(jié)果取出的是一行數(shù)據(jù)
??關(guān)閉游標(biāo)到底那種類型可以把一行的數(shù)據(jù)都裝進(jìn)來
??此時使用 ROWTYPE 類型,此類型表示可以把一行的數(shù)據(jù)都裝進(jìn)來。
?游標(biāo)的屬性
?oracle游標(biāo)有4個屬性: %ISOPEN , %FOUND , %NOTFOUND,%ROWCOUNT
--%ISOPEN 判斷游標(biāo)是否被打開,如果打開%ISOPEN 等于true,否則等于false
--%FOUND %NOTFOUND 判斷游標(biāo)所在的行是否有效,如果有效,則%FOUNDD等于true,否則等于false
-- %ROWCOUNT 返回當(dāng)前位置為止游標(biāo)讀取的記錄行數(shù)。
例子
查詢雇員編號為 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 循環(huán)操作游標(biāo)(比較常用)
DECLARE
? -- 聲明游標(biāo)?
? CURSOR mycur IS? ? SELECT * FROM emp where empno = -1;
? empInfo emp%ROWTYPE;
? cou???? NUMBER;
BEGIN
? -- 游標(biāo)操作使用循環(huán),但是在操作之前必須先將游標(biāo)打開
? 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;
編寫第一個游標(biāo),輸出全部的信息
DECLARE
? -- 聲明游標(biāo)
? CURSOR mycur IS
??? SELECT * FROMemp;
? -- List (EmpPo)
? empInfo emp%ROWTYPE;
BEGIN
? -- 游標(biāo)操作使用循環(huán),但是在操作之前必須先將游標(biāo)打開
? OPEN mycur;
? -- 使游標(biāo)向下一行
? FETCH mycur INTO empInfo;
? -- 判斷此行是否有數(shù)據(jù)被發(fā)現(xiàn)??
? WHILE (mycur%FOUND) LOOP
??? DBMS_OUTPUT.put_line('雇員編號:'|| empInfo.empno);
??? DBMS_OUTPUT.put_line('雇員姓名:'|| empInfo.ename);
??? -- 修改游標(biāo),繼續(xù)向下??????????????
??? FETCH mycur? ? ?INTO empInfo;
? END LOOP;
END;
也可以使用另外一種方式循環(huán)游標(biāo):LOOP…END LOOP
DECLARE
? -- 聲明游標(biāo)
? CURSOR mycur IS
??? SELECT * FROMemp;
? empInfo emp%ROWTYPE;
BEGIN
? -- 游標(biāo)操作使用循環(huán),但是在操作之前必須先將游標(biāo)打開?
? OPEN mycur;
? LOOP
??? -- 使游標(biāo)向下一行
??? FETCH mycur? ? ?INTOempInfo;
??? EXIT WHEN mycur%NOTFOUND;
??? DBMS_OUTPUT.put_line('雇員編號:'|| empInfo.empno);
??? DBMS_OUTPUT.put_line('雇員姓名:'|| empInfo.ename);
? END LOOP;
END;
注意 1:
?在打開游標(biāo)之前最好先判斷游標(biāo)是否已經(jīng)是打開的。?
通過 ISOPEN 判斷,
格式:游標(biāo)%ISOPEN
?IFmycur%ISOPEN THEN?? null ;
?ELSE??OPEN mycur ;
?ENDIF ;
注意 2:?
可以使用 ROWCOUNT 對游標(biāo)所操作的行數(shù)進(jìn)行記錄。
DECLARE
? -- 聲明游標(biāo)
? CURSOR mycur IS
??? SELECT * FROMemp;
? empInfo emp%ROWTYPE;
? cou???? NUMBER;
BEGIN
? -- 游標(biāo)操作使用循環(huán),但是在操作之前必須先將游標(biāo)打開
? IF mycur%ISOPEN THEN
??? null;
? ELSE
??? OPENmycur;
? END IF;
? LOOP
??? -- 使游標(biāo)向下一行?
??? 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;