pl/sql游标

来源:互联网 发布:怎么备案域名 编辑:程序博客网 时间:2024/05/12 23:44
游标的使用步骤分为:声明游标,打开游标,读取数据和关闭游标。

游标使用例子:
declare
CURSORloop_curisselect*fromsys_cust tWHERErownum<10;
row_cust sys_cust%rowtype;
begin
openloop_cur;
loop
fetchloop_curintorow_cust;
exitwhenloop_cur%notfound;
DBMS_OUTPUT.PUT_LINE(row_cust.custid);
endloop;
closeloop_cur;
end;

每次使用fetch之后,游标计数会加一(如下可以证明):
declare
CURSORloop_curisselect*fromsys_cust tWHERErownum<4;
row_cust sys_cust%rowtype;
begin
openloop_cur;
loop
DBMS_OUTPUT.PUT_LINE(loop_cur%rowcount);
fetchloop_curintorow_cust;
DBMS_OUTPUT.PUT_LINE(loop_cur%rowcount);
exitwhenloop_cur%notfound;
DBMS_OUTPUT.PUT_LINE(loop_cur%rowcount);
DBMS_OUTPUT.PUT_LINE('-----------------------------------------------');
endloop;
closeloop_cur;
end;
输出如下:

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

使用fetch ... bulk collect into语句:
使用fetch...bulk collect into 语句一次可以返回多行,效率比fetch ... into高,例子如下:
declare
CURSORloop_curisselect*fromsys_cust tWHERErownum<10;
typerow_cust_typeistableofsys_cust%rowtype;
row_cust row_cust_type;
begin
openloop_cur;
loop
fetchloop_curbulkcollectintorow_custlimit3;
foriin1..row_cust.countloop
DBMS_OUTPUT.PUT_LINE(row_cust(i).custid);
endloop;
exitwhenloop_cur%notfound;
endloop;
closeloop_cur;
end;

测试使用fetch...bulk collect into 游标计数的变化:
declare
CURSORloop_curisselect*fromsys_cust tWHERErownum<11;
typerow_cust_typeistableofsys_cust%rowtype;
row_cust row_cust_type;
begin
openloop_cur;
loop
DBMS_OUTPUT.PUT_LINE(loop_cur%rowcount);
fetchloop_curbulkcollectintorow_custlimit4;
DBMS_OUTPUT.PUT_LINE(loop_cur%rowcount);
exitwhenloop_cur%notfound;
DBMS_OUTPUT.PUT_LINE(loop_cur%rowcount);
DBMS_OUTPUT.PUT_LINE('----------------');
endloop;
closeloop_cur;
end;
结果如下:


还可以用for ... in使用游标:
declare
CURSORloop_curisselect*fromsys_cust tWHERErownum<10;
begin
forcinloop_curloop
DBMS_OUTPUT.PUT_LINE(c.custid);
endloop;
end;

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

可以创建带一个或多个参数的游标(方便传入值到查询语句中):
declare
CURSORloop_cur(ninteger)isselect*fromsys_cust tWHERErownum<n;
row_cust sys_cust%rowtype;
begin
openloop_cur(10);
loop
fetchloop_curintorow_cust;
exitwhenloop_cur%notfound;
DBMS_OUTPUT.PUT_LINE(row_cust.custid);
endloop;
closeloop_cur;
end;
结果如下:


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

0 0
原创粉丝点击