總結一下游標的使用
/********************************遊標***********
遊標特點:通過循環來處理多條數據,每次處理一條
遊標分類:靜態遊標和引用遊標(動態遊標)
靜態遊標:隱式遊標和顯示遊標
顯示遊標:普通遊標 帶參數的遊標 循環遊標
引用遊標:弱類型遊標和強類型遊標
遊標的4個屬性:
isopen 表示:遊標是否打開
rowcount 表示 遊標影響數據條數
found / notfound 表示:遊標當前數據行的數據是否有效
對於隱式遊標訪問屬性: sql%
*********************************************************/
----隱式遊標
begin
dbms_output.put_line('遊標影響數據行數:' || sql%rowcount);
update emp set sal=1000 where deptno=10;
if (sql%isopen) then
dbms_output.put_line('open');
else
dbms_output.put_line('close');
end if;
dbms_output.put_line('遊標影響數據行數:' || sql%rowcount);
end;
---顯示遊標(必須在使用前定義)
/***********************
遊標操作步驟:
1.定義遊標
2.打開遊標
3.讀取遊標保存數據到變量
4.關閉遊標
普通遊標語法:
declare
---定義遊標
cursor 遊標名稱 is 查詢語句;(確定遊標處理數據範圍[行與列])
begin
---打開遊標
open 遊標名稱;
---通過循環對遊標進行訪問
loop
fetch 遊標名稱 into 變量
end loop;
---關閉遊標
end;
**********************/
---顯示部門編號爲20所有員工的編號和姓名
declare
---定義遊標
cursor mycur is select empno,ename from emp where deptno=20;
---編號
myempno emp.empno%type;
--姓名
myename emp.ename%type;
begin
---打開遊標
open mycur;
---讀取遊標數據
loop
---在讀取遊標,在保存變量的時候,字段與定義遊標字段一致
fetch mycur into myempno,myename;
exit when mycur%notfound;
dbms_output.put_line('編號--'||myempno||' 姓名-'||myename);
end loop;
---關閉遊標
close mycur;
end;
----根據輸入部門編號,來顯示對應部門所有員工信息
----帶參數遊標
/**********************
語法:
declare
cursor 遊標名稱(遊標參數列表) is 查詢語句
begin
open 遊標名稱(遊標實際參數)
end;
*************************/
declare
---定義遊標
cursor mycur(mydeptno emp.deptno%type) is select * from emp where
deptno=mydeptno;
inputdeptno emp.deptno%type;
emprow emp%rowtype;
begin
inputdeptno := &請輸入部門編號;
---打開遊標,並 傳入參數
open mycur(inputdeptno);
loop
fetch mycur into emprow;
exit when mycur%notfound;
dbms_output.put_line('編號--'|| emprow.empno
|| ' 姓名--'||emprow.ename
|| ' 工作'||emprow.job);
end loop;
--關閉遊標
close mycur;
end;
/******************循環遊標**********************
語法:
delcare
cursor 遊標名稱 is 查詢語句;
begin
for 遊標變量 in 遊標名稱
loop
執行語句
end loop;
end;
注意:在循環遊標中,不需要有打開遊標,關閉遊標
在循環遊標中,遊標變量是不需要聲明
***************************************************/
---顯示部門編號爲20員工信息
declare
cursor mycur is select * from emp where deptno=20;
begin
for emprow in mycur
loop
dbms_output.put_line('編號--'|| emprow.empno
|| ' 姓名--'||emprow.ename
|| ' 工作'||emprow.job);
end loop;
end;
/******************************************
通過遊標修改數據(update,delete)
語法:
declare
---定義遊標
cursor 遊標名稱 is 查詢語句 for update;---在定義遊標時候,要對處理數據進行鎖定
begin
----使用遊標修改數據
update table_name set 字段 where current of 遊標名稱;
---使用遊標刪除數據
delete語句 where current of 遊標名稱;
end;
*****************************************/
-----根據輸入部門編號修改對應員工的工資爲2500
declare
---定義遊標
cursor mycur(mydeptno emp.deptno%type) is select * from emp where
deptno=mydeptno for update;
inputdeptno emp.deptno%type;
begin
inputdeptno :=&請輸入部門編號;
for emprow in mycur(inputdeptno)
loop
---對數據進行修改
dbms_output.put_line('修改員工對應編號--'||emprow.empno);
--update emp set sal=2500 where current of mycur;
delete from emp where current of mycur;
dbms_output.put_line('修改數據的條數:' || mycur%rowcount);
end loop;
end;
----使用普通遊標修改部門編號爲20的員工信息
declare
cursor mycur(mydeptno emp.deptno%type) is select * from emp where deptno=mydeptno
for update;
emprow emp%rowtype;
inputdeptno emp.deptno%type;
begin
inputdeptno :=&請輸入部門編號;
open mycur(inputdeptno);
loop
fetch mycur into emprow;
exit when mycur%notfound;
dbms_output.put_line('修改員工對應編號--'||emprow.empno);
update emp set sal=2500 where current of mycur;
end loop;
close mycur;
end;
/***********************引用遊標*******************
引用遊標:弱類型遊標和強類型遊標
弱類型遊標處理的語法:
declare
---定義遊標類型
type 遊標類型 is ref cursor;
---定義對應遊標變量
遊標變量的名稱 遊標類型;
begin
--打開遊標(引用在打開遊標的時候,確定處理數據的行與列)
open 遊標名稱 for 查詢語句;
end;
引用遊標注意:
1.在使用遊標之前,必須需要定義遊標類型。
2.在引用遊標中,不能使用循環遊標
---input
---當input=1 顯示部門編號爲10員工的姓名 工作
---當input=2顯示部門編號爲20員工的姓名 與 工資
***********************************/
declare
---定義遊標的類型
type mycurtype is ref cursor;
---定義此類型的遊標變量
mycur mycurtype;
---定義遊標變量
myename emp.ename%type;
myjob emp.job%type;
mysal emp.sal%type;
---辨識
input char(10);
begin
input := '&請輸入';
if input = '1' then
--顯示部門編號爲10員工的姓名 工作
---打開遊標
open mycur for select ename,job from emp where deptno=10;
loop
fetch mycur into myename,myjob;
exit when mycur%notfound;
dbms_output.put_line('姓名:'||myename ||' 工作:'||myjob);
end loop;
else
-- 顯示部門編號爲20員工的姓名 與 工資
open mycur for select ename,sal from emp where deptno=20;
loop
fetch mycur into myename,mysal;
exit when mycur%notfound;
dbms_output.put_line('姓名:'||myename||' 薪水: '||mysal);
end loop;
end if;
--- 關閉遊標
close mycur;
end;
/*****************************
強類型遊標語法:
declare
---定義遊標類型
type 遊標類型 is ref cursor return 類型;
---定義對應遊標變量
遊標變量的名稱 遊標類型;
begin
--打開遊標(引用在打開遊標的時候,確定處理數據的行與列)
open 遊標名稱 for 查詢語句;
end;
********************************/
--input
--input 的值1 顯示部門編號爲10 員工信息
---input的值2 顯示部門編號爲20員工信息
declare
---定義遊標類型
type mycurtype is ref cursor return emp%rowtype;
---定義遊標
mycur mycurtype;
--遊標變量
emprow emp%rowtype;
--辨識
input char(10);
begin
input := '&請輸入';
if input = '1' then
open mycur for select * from emp where deptno=10;
else
open mycur for select * from emp where deptno=20;
end if;
loop
fetch mycur into emprow;
exit when mycur%notfound;
dbms_output.put_line('編號:'||emprow.empno||' 姓名:'||emprow.ename);
end loop;
---關閉遊標
close mycur;
end;