总结一下游标的使用
/********************************游标***********
游标特点:通过循环来处理多条数据,每次处理一条
游标分类:静态游标和引用游标(动态游标)
静态游标:隐式游标和显示游标
显示游标:普通游标 带参数的游标 循环游标
引用游标:弱类型游标和强类型游标
游标的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;
本文出自 “此刻打盹,你将做梦;..” 博客,转载请与作者联系!