pl/sql游标

游标的使用步骤分为:声明游标,打开游标,读取数据和关闭游标。

游标使用例子:
declare
CURSOR loop_cur is select * from sys_cust t WHERE rownum < 10 ;
row_cust sys_cust% rowtype ;
begin
open loop_cur;
loop
fetch loop_cur into row_cust;
exit when loop_cur% notfound ;
DBMS_OUTPUT.PUT_LINE(row_cust.custid);
end loop ;
close loop_cur;
end ;

每次使用fetch之后,游标计数会加一(如下可以证明):
declare
CURSOR loop_cur is select * from sys_cust t WHERE rownum < 4 ;
row_cust sys_cust% rowtype ;
begin
open loop_cur;
loop
DBMS_OUTPUT.PUT_LINE(loop_cur% rowcount );
fetch loop_cur into row_cust;
DBMS_OUTPUT.PUT_LINE(loop_cur% rowcount );
exit when loop_cur% notfound ;
DBMS_OUTPUT.PUT_LINE(loop_cur% rowcount );
DBMS_OUTPUT.PUT_LINE( '-----------------------------------------------' );
end loop ;
close loop_cur;
end ;
输出如下:

可以看出,打开游标之后,游标指向第0行,fetch每次把当前游标的下一行返回。

使用fetch ... bulk collect into语句:
使用fetch...bulk collect into 语句一次可以返回多行,效率比fetch ... into高,例子如下:
declare
CURSOR loop_cur is select * from sys_cust t WHERE rownum < 10 ;
type row_cust_type is table of sys_cust% rowtype ;
row_cust row_cust_type;
begin
open loop_cur;
loop
fetch loop_cur bulk collect into row_cust limit 3 ;
for i in 1 ..row_cust.count loop
DBMS_OUTPUT.PUT_LINE(row_cust(i).custid);
end loop ;
exit when loop_cur% notfound ;
end loop ;
close loop_cur;
end ;

测试使用fetch...bulk collect into 游标计数的变化:
declare
CURSOR loop_cur is select * from sys_cust t WHERE rownum < 11 ;
type row_cust_type is table of sys_cust% rowtype ;
row_cust row_cust_type;
begin
open loop_cur;
loop
DBMS_OUTPUT.PUT_LINE(loop_cur% rowcount );
fetch loop_cur bulk collect into row_cust limit 4 ;
DBMS_OUTPUT.PUT_LINE(loop_cur% rowcount );
exit when loop_cur% notfound ;
DBMS_OUTPUT.PUT_LINE(loop_cur% rowcount );
DBMS_OUTPUT.PUT_LINE( '----------------' );
end loop ;
close loop_cur;
end ;
结果如下:


还可以用for ... in使用游标:
declare
CURSOR loop_cur is select * from sys_cust t WHERE rownum < 10 ;
begin
for c in loop_cur loop
DBMS_OUTPUT.PUT_LINE(c.custid);
end loop ;
end ;

游标有4个属性:
%isopen:表示游标是否打开;
%found:用来检测游标是否返回数据,返回true表示游标返回了数据。
%notfound:和%found相反。
%rowcount:表示当前游标指向。

可以创建带一个或多个参数的游标(方便传入值到查询语句中):
declare
CURSOR loop_cur(n integer ) is select * from sys_cust t WHERE rownum < n;
row_cust sys_cust% rowtype ;
begin
open loop_cur( 10);
loop
fetch loop_cur into row_cust;
exit when loop_cur% notfound ;
DBMS_OUTPUT.PUT_LINE(row_cust.custid);
end loop ;
close loop_cur;
end ;
结果如下:


隐式游标:oracle执行语句的时候自动产生,不受用户控制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值