靜態遊標
顯示遊標
-- 顯示遊標的創建和使用(基本語法,步驟較多容易出錯 不推薦使用)
declare
-- 聲明變量和遊標
name varchar2(50);
dept_name varchar2(20);
cursor emp_cur is
select e.ename,d.dname from emp e,dept d where e.deptno=d.deptno;
begin
-- 打開遊標
open emp_cur;
--循環提取遊標
loop
fetch emp_cur into name,dept_name;
exit when emp_cur%notfound;
dbms_output.put_line(name||' 在 '||dept_name);
end loop;
--關閉遊標
close emp_cur;
end;
-- 實例:根據員工的入職年限爲員工加薪,每超過一年加100 最高加1000
declare
-- 聲明變量和遊標
hire_date date;--入職時間
e_id number;--員工ID
cursor emp_cur is
select empno,hiredate from emp;
begin
-- 打開遊標
open emp_cur;
--循環提取遊標
loop
fetch emp_cur into e_id,hire_date;
exit when emp_cur%notfound;
if 100*(2013-to_char(hire_date,'yyyy'))<1000 then
update emp set sal=sal+100*(2013-to_char(hire_date,'yyyy')) where empno=e_id;
else
update emp set sal=sal+1000 where empno=e_id;
end if;
end loop;
--關閉遊標
close emp_cur;
end;
此外 使用循環遊標可以簡化遊標的讀取(推薦使用)
declare
cursor emp_cur is
select e.ename,d.dname from emp e,dept d
where e.deptno=d.deptno;
begin
for emp_record in emp_cur loop --注意 這裏的emp_record 在For循環中是自動匹配遊標類型的,如果不在For循環裏面 需要先聲明!
dbms_output.put_line(
emp_record.ename||'在'|| emp_record.dname);
end loop;
end;
隱式遊標
使用時前面要加上SQL%
sql%rowcount 常用於判斷insert update delete語句是否操作成功 如果成功遊標返回1;
declare
name varchar2(50);
dept_name varchar2(20);
begin
select e.ename,d.dname into name,dept_name from emp e,dept d
where e.deptno=d.deptno and empno=7890;
dbms_output.put_line(sql%rowcount); --注意 這裏使用的隱式遊標一定要在commit之前讀取
commit;
end;
REF動態遊標
動態遊標可以與不同的語句關聯,用於處理多行的查詢結果集
打開遊標時綁定 是REF類型
通常用在查詢語句需要運行時動態確定的情況
——強類型動態遊標使用方法
declare
type refcur_t is ref cursor ——定義遊標類型(強類型)
return emp%rowtype;
refcur refcur_t; ——用遊標類型聲明遊標
v_emp emp%rowtype; ——定義變量
begin
open refcur for
select * from emp;
loop
fetch refcur into v_emp;
exit when refcur%notfound;
dbms_output.put_line(refcur%rowcount||' '||v_emp.ename); ——輸出行號和員工姓名
end loop;
close refcur;
end;
——弱類型動態遊標使用方法
declare
type refcur_t is ref cursor; ——①定義遊標類型。因爲沒有return類型,因此變量不能聲明爲表類型 只能單獨定義
refcur refcur_t; ——聲明遊標
e_name varchar2(50);
id number;
begin
open refcur for
select empno,ename from emp;——查詢時要查具體的列
fetch refcur into id,e_name;
while refcur%found loop ——循環提取遊標信息
dbms_output.put_line('#'||id||':'||e_name);
fetch refcur into id,e_name;
end loop;
close refcur;
end;
——弱類型動態遊標使用實例 根據用戶輸入得到信息
declare
type refcur_t is ref cursor;
refcur refcur_t;
e_name varchar2(50);
id number;
selection varchar2(1):=upper(substr('&tab',1,1));--獲得用戶的輸入,截取第一個字符
begin
if selection='E' then --如果用戶輸入E,那麼打開遊標關聯查詢僱員表
open refcur for
select empno,ename from emp;
dbms_output.put_line('********僱員信息********');
elsif selection='D' then --如果用戶輸入D,那麼打開遊標關聯查詢部門表
open refcur for
select deptno,dname from dept;
dbms_output.put_line('********部門信息********');
else
dbms_output.put_line('請輸入僱員信息(E)或部門信息(D)');
return;
end if;
fetch refcur into id,e_name; --循環提取遊標信息
while refcur%found loop
dbms_output.put_line('#'||id||':'||e_name);
fetch refcur into id,e_name;
end loop;
close refcur;
end;