一、什麼是遊標
簡單來理解,在PLSQL中,無論我們查詢數據庫還是向數據庫插入、修改和刪除的DML操作,凡是對數據庫產生了影響,執行的sql語句都會返回一個由受影響的數據行組成的結果集,而遊標就是管理這個結果集的對象。
Oracle中游標分爲兩種——隱式遊標和顯式遊標,每個sql語句返回的結果集都會默認受‘SQL’這個隱式遊標的管理;而顯式遊標是我們自定義的遊標,用來管理特定的SQL語句返回的結果集。
二、通過隱式遊標獲取查詢到的行數
假設有下面的emp表:
如下面的代碼,我們在PLSQL的執行塊中選中sal大於等於3000的僱員,並打印出共有多少人,就可以通過隱式遊標SQL的ROWCOUNT屬性來實現。
declare
type emp_varray is varray(20)of emp%rowtype;
v_emps emp_varray;
begin
select * bulk collect intov_emps from emp where sal>=3000;
dbms_output.put_line('sal不小於3000的人數是:'||SQL%rowcount);
end;
/
結果如下:
%ROWOUNT是隱形遊標的一個屬性,除此之外,它還具有以下屬性:
序號 |
屬性 |
描述 |
1 |
%FOUND |
當執行sql語句返回的結果集不爲空時該值爲True |
2 |
%ISOPEN |
判斷遊標是否打開,隱形遊標中改值恆爲False,表示已經打開。 |
3 |
%NOTFOUND |
和%Found的判斷標準正好相反。 |
4 |
%ROWCOUNT |
返回的數據集的行數。 |
三、DML語句中使用隱形遊標
3.1 Insert語句中使用隱形遊標
declare
typeemp_varray is varray(20) of emp%rowtype;
v_emps emp_varray;
begin
insert into empvalues(8888,'hyman','clerk',7698,sysdate,3000,200,20);
ifSQL%found then
dbms_output.put_line('插入的人數是:'||SQL%rowcount);
endif;
end;
/
3.2 update 語句中使用隱形遊標
declare
typeemp_varray is varray(20) of emp%rowtype;
v_emps emp_varray;
begin
update emp set sal=10000 where empno=8888;
ifSQL%found then
dbms_output.put_line('修改的人數是:'||SQL%rowcount);
endif;
end;
/
3.3 delete 語句中使用隱形遊標
declare
typeemp_varray is varray(20) of emp%rowtype;
v_emps emp_varray;
begin
delete from emp where empno=8888;
ifSQL%found then
dbms_output.put_line('刪除的人數是:'||SQL%rowcount);
endif;
end;
/