游標是一種 PL/SQL 控制結(jié)構(gòu);可以對 SQL 語句的處理進行顯示控制庭呜,便于對表的行數(shù)據(jù)逐條進行處理滑进。
游標并不是一個數(shù)據(jù)庫對象,只是存留在內(nèi)存中
操作步驟:
??聲明游標
??打開游標
??取出結(jié)果募谎,此時的結(jié)果取出的是一行數(shù)據(jù)
??關閉游標到底那種類型可以把一行的數(shù)據(jù)都裝進來
??此時使用 ROWTYPE 類型扶关,此類型表示可以把一行的數(shù)據(jù)都裝進來。
?游標的屬性
?oracle游標有4個屬性: %ISOPEN 数冬, %FOUND 节槐, %NOTFOUND,%ROWCOUNT
--%ISOPEN 判斷游標是否被打開拐纱,如果打開%ISOPEN 等于true,否則等于false
--%FOUND %NOTFOUND 判斷游標所在的行是否有效铜异,如果有效,則%FOUNDD等于true秸架,否則等于false
-- %ROWCOUNT 返回當前位置為止游標讀取的記錄行數(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)操作游標(比較常用)
DECLARE
? -- 聲明游標?
? CURSOR mycur IS? ? SELECT * FROM emp where empno = -1;
? empInfo emp%ROWTYPE;
? cou???? NUMBER;
BEGIN
? -- 游標操作使用循環(huán)东抹,但是在操作之前必須先將游標打開
? 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
? -- 游標操作使用循環(huán)沃测,但是在操作之前必須先將游標打開
? OPEN mycur;
? -- 使游標向下一行
? 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);
??? -- 修改游標,繼續(xù)向下??????????????
??? FETCH mycur? ? ?INTO empInfo;
? END LOOP;
END;
也可以使用另外一種方式循環(huán)游標:LOOP…END LOOP
DECLARE
? -- 聲明游標
? CURSOR mycur IS
??? SELECT * FROMemp;
? empInfo emp%ROWTYPE;
BEGIN
? -- 游標操作使用循環(huán)缆镣,但是在操作之前必須先將游標打開?
? 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:
?在打開游標之前最好先判斷游標是否已經(jīng)是打開的芽突。?
通過 ISOPEN 判斷,
格式:游標%ISOPEN
?IFmycur%ISOPEN THEN?? null ;
?ELSE??OPEN mycur ;
?ENDIF ;
注意 2:?
可以使用 ROWCOUNT 對游標所操作的行數(shù)進行記錄董瞻。
DECLARE
? -- 聲明游標
? CURSOR mycur IS
??? SELECT * FROMemp;
? empInfo emp%ROWTYPE;
? cou???? NUMBER;
BEGIN
? -- 游標操作使用循環(huán)寞蚌,但是在操作之前必須先將游標打開
? 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;