游标的使用步骤分为:声明游标,打开游标,读取数据和关闭游标。
游标使用例子:
每次使用fetch之后,游标计数会加一(如下可以证明):
使用fetch ... bulk collect into语句:
还可以用for ... in使用游标:
游标有4个属性:
可以创建带一个或多个参数的游标(方便传入值到查询语句中):
隐式游标:oracle执行语句的时候自动产生,不受用户控制。
游标使用例子:
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执行语句的时候自动产生,不受用户控制。