Oracle游标使用
隐式游标和显式游标:
1.查询返回单行记录时→隐式游标;
2.查询返回多行记录并逐行进行处理时→显式游标;
游标的状态是通过属性来表示
%Found :Fetch语句(获取记录)执行情况True or False。
%NotFound : 最后一条记录是否提取出True or False。
%ISOpen : 游标是否打开True or False。
%RowCount :游标当前提取的行数 。
--Fetch游标
--使用的时候必须要明确的打开和关闭
写法一:使用游标变量写法
declare
--游标声明
cursor c_job
is
select empno,ename,job,sal
from emp
where job='MANAGER';
--定义一个游标变量
c_row c_job%rowtype;
begin
open c_job;
loop
--提取一行数据到c_row
fetch c_job into c_row;
--判读是否提取到值,没取到值就退出
--取到值c_job%notfound 是false
--取不到值c_job%notfound 是true
exit when c_job%notfound;
dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
end loop;
--关闭游标
close c_job;
end;
写法二:使用变量写法
declare
v_empno varchar2;
v_ename varchar2;
v_job varchar2;
v_sal varchar2;
--游标声明
cursor c_job
is
select empno,ename,job,sal
from emp
where job='MANAGER';
begin
open c_job;
loop
--提取一行数据到c_row
fetch c_job into v_empno,v_ename,v_job,v_sal;
--判读是否提取到值,没取到值就退出
--取到值c_job%notfound 是false
--取不到值c_job%notfound 是true
exit when c_job%notfound;
dbms_output.put_line(v_empno||'-'||v_ename||'-'||v_job||'-'||v_sal);
end loop;
--关闭游标
close c_job;
end;
--For 循环游标
--(1)定义游标
--(2)定义游标变量
--(3)使用for循环来使用这个游标
写法一:使用游标变量写法
declare
--类型定义
cursor c_job
is
select empno,ename,job,sal
from emp
where job='MANAGER';
--定义一个游标变量v_cinfo c_emp%ROWTYPE ,该类型为游标c_emp中的一行数据类型
c_row c_job%rowtype;
begin
for c_row in c_job loop
dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
end loop;
end;
写法二:使用变量写法
declare
v_empno varchar2;
v_ename varchar2;
v_job varchar2;
v_sal varchar2;
--类型定义
cursor c_job
is
select empno,ename,job,sal
from emp
where job='MANAGER';
begin
for c_row in c_job loop
v_empno :=c_row.empno; v_ename :=c_row.ename; v_job :=c_row.job;v_sal :=c_row.sal;
dbms_output.put_line(v_empno ||'-'||v_ename ||'-'||v_job||'-'||v_sal);
end loop;
end;
--while循环来显示所有部门的的地理位置(用%found属性)
declare
--游标声明
cursor csr_TestWhile
is
--select语句
select LOC
from Depth;
--指定行指针
row_loc csr_TestWhile%rowtype;
begin
--打开游标
open csr_TestWhile;
--给第一行喂数据
fetch csr_TestWhile into row_loc;
--测试是否有数据,并执行循环
while csr_TestWhile%found loop
dbms_output.put_line('部门地点:'||row_loc.LOC);
--给下一行喂数据
fetch csr_TestWhile into row_loc;
end loop;
close csr_TestWhile;
end;
select * from emp
总结
用for循环来实现游标方便些,毕竟省去了开启和关闭游标等步骤
浙公网安备 33010602011771号