----------------------隱式遊標 %isopen , %notfound , %found
定義遊標
declare
begin
........
end;
定義:隱式遊標則由則由系統自動定義,非顯示定義遊標的DML語句即被賦予隱式遊標屬性。其過程由oracle控制,完全自動化。隱式遊標的名稱是SQL,不能對SQL遊標顯式地執行
OPEN,FETCH,CLOSE語句。
屬性:類似於顯示遊標,隱式遊標同樣具有四種屬性,只不過隱式遊標以SQL%開頭,而顯示遊標以Cursor_name%開頭。通過SQL%總是隻能訪問前一個DML操作或單行SELECT操作的遊標屬性,用於判斷DML執行的狀態和結果,進而控制程序的流程。
屬性一:SQL%ISOPEN
遊標是否打開。當執行select into ,insert update,delete時,Oracle會隱含地打開遊標,且在該語句執行完畢或隱含地關閉
遊標,因爲是隱式遊標,故SQL%isopen----總是false
屬性二:SQL%FOUND
判斷SQL語句是否成功執行。當有作用行時則成功執行爲true,否則爲false。
屬性三:SQL%NOTFOUND
判斷SQL語句是否成功執行。當有作用行時否其值爲false,否則其值爲true。
屬性四:SQL%ROWCOUNT
在執行任何DML語句之前,SQL%ROWCOUNT的值都是NULL,對於SELECT INTO語句,如果執行成功,SQL%ROWCOUNT的值爲,如果沒有
成功,SQL%ROWCOUNT的值爲,同時產生一個異常NO_DATA_FOUND。
declare
begin
if sql%isopen then
dbms_output.put_line('遊標已打開');
else
dbms_output.put_line('遊標未打開');--輸入此條,因爲是隱式的,所以總是未打開
end if;
end;
declare
begin
update emp set sal=1000;
dbms_output.put_line('你已經處理了'||sql%rowcount||'條數據');
end;
-----------notfound的用法
declare
begin
update emp set sal=1000;
if sql%notfound then
dbms_output.put_line('遊標未找到');
else
dbms_output.put_line('遊標已找到');--輸出此條
end if;
end;
-----------found的用法
declare
begin
update emp set sal=1000;
if sql%found then
dbms_output.put_line('遊標找到');--輸出此條
else
dbms_output.put_line('遊標未找到');
end if;
end;
--------注:
當進行update,delete,insert操作的時候就要用到隱式遊標
declare
begin
update emp set sal=1000;--修改
if sql%found then
dbms_output.put_line('修改成功');
end if;
end;
declare
begin
update emp set sal=1000 where empno=7369;
if sql%found then
dbms_output.put_line('遊標已打開');
else
dbms_output.put_line('遊標未打開');
end if;
end;
select* from emp;
------------------------------------普通遊標(帶參數和不帶參數)
循環遊標用loop....end loop
--1。顯示所有員工信息(不帶參數)
declare
cursor mycur is select * from emp;
myemp emp%rowtype;
begin
open mycur;
loop
fetch mycur into myemp;
exit when mycur%notfound;
dbms_output.put_line('員工編號:'||myemp.empno||' 員工姓名:'||myemp.ename||'員工工資:'||myemp.sal);
end loop;
close mycur;
end;
--2。輸入部門編號,顯示該部門員工的詳細信息(帶參數)
declare
cursor mycur(myno emp.deptno%type) is select * from emp where deptno=myno;
myemp emp%rowtype;
mydeptno emp.deptno%type;--所要接的參數
begin
mydeptno:=&請輸入員工編號;
open mycur(mydeptno);
loop
fetch mycur into myemp;
exit when mycur%notfound;
dbms_output.put_line('員工編號:'||myemp.empno||' 員工姓名:'||myemp.ename||'員工工資:'||myemp.sal||'部門編號:'||myemp.deptno);
end loop;
close mycur;
end;
----------------------------------循環遊標
--1。顯示所有員工信息
declare
cursor mycur is select * from emp;
begin
for i in mycur
loop
dbms_output.put_line('員工編號:'||i.empno||' 員工姓名:'||i.ename||'員工工資:'||i.sal);
end loop;
end;
--------------------------------------用遊標批量更新數據
declare
cursor mycur is select sal from emp for update;
mysal emp.sal%type;
begin
open mycur;
loop
fetch mycur into mysal;
exit when mycur%notfound;
mysal:=mysal*2;
update emp set sal=mysal where current of mycur;
end loop;
close mycur;
end;
select * from emp;
-----------------------------------引用遊標
declare
mychar char(10);
type mycur is ref cursor;
mpp mycur;
myemp emp%rowtype;
begin
mychar:=&請輸入一個字符;
if mychar='a'then
open mpp for select * from emp where deptno=10;
loop
fetch mpp into myemp;
exit when mpp%notfound;
dbms_output.put_line('員工編號:'||myemp.empno||'員工姓名:'||myemp.ename||'部門編號:'||myemp.deptno);
end loop;
elsif mychar='b' then
open mpp for select * from emp where deptno=20;
loop
fetch mpp into myemp;
exit when mpp%notfound;
dbms_output.put_line('員工編號:'||myemp.empno||'員工姓名:'||myemp.ename||'部門編號:'||myemp.deptno);
end loop;
else
open mpp for select * from emp where deptno=30;
loop
fetch mpp into myemp;
exit when mpp%notfound;
dbms_output.put_line('員工編號:'||myemp.empno||'員工姓名:'||myemp.ename||'部門編號:'||myemp.deptno);
end loop;
end if;
end;
最後,歡迎訪問風格清新簡潔的輕博客網站[指尖一刻]