在上一文中,介紹了PLSQL中的隱式遊標的用法,本文主要介紹另外一種遊標的使用——顯式遊標。
一、顯式遊標聲明和屬性
1.1 顯式遊標的聲明
cursor 遊標名稱 is SQL語句
如果聲明一個管理emp表查詢結果集的遊標cur_emp:cursor cur_emp is select * from emp;
定義好顯示遊標之後,我們在使用遊標時要先進行Open:
open 遊標名稱
打開之後如果想要取出遊標所指的數據行,使用fetch...into...
fetch 遊標名 into 對象名
1.2 顯式遊標的屬性
序號 | 屬性 | 描述 |
1 | %found | 遊標被打開後,如果沒有執行過fetch,返回null;如果在最近的一次fetch中返回一行,則返回True,否則返回False |
2 | %isopen | 遊標是打開狀態返回True,否則爲False |
3 | %notfound | 遊標被打開後,如果沒有執行過fetch,返回null;如果在最近的一次fetch中返回一行,則返回False,否則返回True |
4 | %rowcount | 其值爲該遊標在執行fetch語句所返回的行數。遊標打開時,其初始化爲0;遊標每fetch一行數據,其將會在原來的基礎之上加1. |
1.3 利用遊標顯示查詢結果
假設有下表emp,我們想要打印中emp表中所有的人員的信息。如果在之前,可能需要將查詢結果bulk collect into一個索引表中或者數組中,而同樣可以使用遊標來完成這個功能:declare
cursor cur_emp is select * from emp;
var_emp emp%rowtype;
begin
if cur_emp%isopen then --先判斷遊標是否已經打開
null;
else
open cur_emp; --遊標已經打開
end if;
fetch cur_emp into var_emp; --先要fetch遊標一行數據給var_emp,以保證cur_emp%found爲true
while cur_emp%found loop --採用while循環獲取遊標中的數據
dbms_output.put_line('姓名:'||var_emp.ename||',薪資:'||var_emp.sal); --打印獲取的數據
fetch cur_emp into var_emp; --再次獲取
end loop;
close cur_emp;
end;
/
結果如下:declare
cursor cur_emp is select * from emp;
begin
for var_emp in cur_emp loop
dbms_output.put_line('姓名:'||var_emp.ename||',薪資:'||var_emp.sal); --打印獲取的數據
end loop;
end;
/
1.4 利用遊標更新數據
處理利用遊標可以實現管理select語句的結果集之外,我們還可以利用遊標來更新數據庫裏面的數據,如下面的代碼,更新每個sal小於2000的僱員的sal爲2000:declare
cursor cur_emp is select * from emp where sal<2000;
begin
for var_emp in cur_emp loop
update emp set sal=2000 where emp.sal=var_emp.sal;
end loop;
end;
/
上述是利用遊標查詢查詢出來的數據,直接在表中進行更新,我們也可以通過遊標的For update of和where current of子句間接的更新表declare
cursor cur_emp is select * from emp where sal<2000 for update of sal;
begin
for var_emp in cur_emp loop
update emp set sal=2000 where current of cur_emp;
end loop;
end;
/
for update of子句在定義遊標時使用,用來表明需要更新哪些字段,而where current of 後面直接加遊標名,表明遊標現在所在行,通過對上述兩個子句的調用,我們也可以達到上述修改表格數據的目的。二、帶參遊標的使用
declare
cursor cur_emp(v_dept emp.deptno%type) is select * from emp where deptno=v_dept;
begin
for var_emp in cur_emp(&v_dept) loop
dbms_output.put_line('姓名:'||var_emp.ename||',薪資:'||var_emp.sal); --打印獲取的數據
end loop;
end;
/