plsql-游标1

游标的操作
定义 declare
打开 open
抓取 fetch,每次只能抓取一行,使用循环可以处理表的每一行。
关闭 close
DECLARE
CURSOR  c1  is  select ename,sal from emp order by sal desc;
v1 c1%rowtype;
BEGIN
open c1;
fetch c1 into v1;
dbms_output.put_line(v1.ename||v1.sal);
close c1;
END;
/

上述语句可以读取一行。

游标的属性,前缀为游标的名称
%isopen,测试该游标是否打开,返回真或假
%rowcount,游标已经操作了多少行, 返回数值
%found,游标是否找到记录,返回真或假
%notfound,游标是否找到记录,返回真或假

游标属性
DECLARE
CURSOR c1 is select ename,sal from emp order by sal desc;
v1 c1%rowtype;
n1 number(2);
BEGIN
if not c1%isopen then
open c1;
end if;
fetch c1 into v1;
n1:=c1%rowcount;
dbms_output.put_line(v1.ename||' '||v1.sal||' '||n1);
close c1;
END;
/

循环控制
DECLARE
CURSOR c1 is select ename,sal from emp order by sal desc;
v1 c1%rowtype;
n1 number(2);
BEGIN
open c1;
loop fetch c1 into v1;
exit when c1%notfound;

dbms_output.put_line(v1.ename||' '||v1.sal);
n1:=c1%rowcount;

 end loop;

close c1;
dbms_output.put_line(n1);
END;
/

 

For 循环
DECLARE
CURSOR c1 is select ename,sal from emp order by sal desc;
n1 number(2);
BEGIN
for v1 in c1 loop
dbms_output.put_line(v1.ename||' '||v1.sal);
n1:=c1%rowcount; --n1 存储游标已经操作了多少行
end loop;
dbms_output.put_line(n1);
END;
/
V1 的数据类型为 c1%rowtype,c1 自动 open,自动 fetch,自动 close,for 循环和游标的结合
可以很方便的处理游标内的每一行。

 

带变量的游标,每次打开游标的时候需要给定变量。根据变量的不同,游标的内容将不同。
一般用于多层循环中内层循环的游标控制。
DECLARE
CURSOR c1(n1 number) is select ename,sal from emp where empno=n1; --定义游标
v1 c1%rowtype; --v1 为符合变量,用来存储 c1 的一整行。
BEGIN
open c1(7900); --以变量方式打开带有变量的游标
fetch c1 into v1; --抓取一行到符合变量 v1 中
dbms_output.put_line(v1.ename||' '||v1.sal); --操作复合变量 v1
close c1; --关闭游标
END;
/

 

准备实验环境,建立一个表,其中一个列是空的,我们要将空列的值赋予相对应的部门名称。
conn scott/tiger
drop table t1 purge;
create table t1 as select ename,deptno from emp;
alter table t1 add(dname varchar2(18));

select * from t1;
For update 游标,所更改的行既是当前游标所指定的行。
DECLARE
CURSOR c1 is select * from t1 for update; --声明游标
v1 dept.dname%type; --定义 v1 变量与 dname 列的数据类型相同
BEGIN
for n1 in c1 loop --处理 c1 游标的每一行
select dname into v1 from dept where deptno=n1.deptno; --引用复合变量 n1 的值
update t1 set dname=v1 WHERE CURRENT OF C1; --更新游标指定的行
end loop;
END;
/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值