oracle判断显式游标到了最后一行,oracle 显式游标

1.语法

CURSOR cursor_name

[(parameter_name datatype,...)]

IS select_statement; --游标关联的SELECT语句,该语句不能使用SELECT...INTO...语句

使用步骤

1.声明游标

DECLARE CURSOR cursor_name

IS SELECT_STATEMENT

2.打开游标

OPEN cursor_name

3.读取数据:读取数据需要利用FETCH语句完成,但是FETCH只能取出当前行的记录,正常情况下FETCH要和循环语句一起使用,这样指针会不断前进,直到某个条件不符合要求而退出.使用FETCH时,游标属性%ROWCOUNT会不断累加.

FETCH cursor_name INTO record_name

4.关闭游标

CLOSE cursor_name

5.例

DECLARE

CURSOR pdct_cur

IS SELECT * FROM productinfo;

cur_prodrcd productinfo%ROWTYPE;

BEGIN

OPEN pdct_cur;

FETCH pdct_cur INTO cur_prodrcd;

DBMS_OUTPUT.PUT_LINE(cur_prodrcd.productid || '-' || cur_prodrcd.productname);

CLOSE pdct_cur;

END;

显示游标的属性

1.%ISOPEN:判断游标是否打开,打开则返回true

2.%FOUND:检测行数据是否有效,有效则返回true

3.%NOTFOUND:

4.%ROWCOUNT:累计到当前为止使用FETCH提取数据的行数

游标的使用技巧

1.游标中使用LOOP

DECLARE

CURSOR pdct_loop_cur

IS SELECT productid,productname,productprice

FROM productinfo

WHERE productprice>2500;

cur_productid productinfo.productid%TYPE;

cur_productname productinfo.productname%TYPE;

cur_productprice productinfo.productprice%TYPE;

BEGIN

OPEN pdct_loop_cur;

LOOP

FETCH pdct_loop_cur INTO cur_productid,cur_productname,cur_productprice;

EXIT WHEN pdct_loop_cur%NOTFOUND;

DBMS_OUTPUT.PUT_LINE('产品ID' || cur_productid);

END LOOP;

CLOSE pdct_loop_cur;

END;

2.使用BULK COLLECT和FOR语句:通常使用FETCH...INTO...语句提取数据,这种方式是单条提取数据,在数据量很大的情况下执行的效率不是很理想。而FETCH...BULK COLLECT INTO语句可以批量提取数据。

DECLARE

CURSOR pdct_collect_cur

IS SELECT * FROM productinfo;

TYPE pdct_tab IS TABLE OF productinfo%ROWTYPE;

pdct_rd pdct_tab;

BEGIN

OPEN pdct_collect_cur;

LOOP

FETCH pdct_collect_cur BULK COLLECT INTO pdct_rd LIMIT 2;

FOR i IN 1..pdct_rd.COUNT LOOP

DBMS_OUTPUT.PUT_LINE('产品ID' || pdct_rd(i).productid);

EXIT WHEN pdct_collect_cur%NOTFOUND;

END LOOP;

END LOOP;

CLOSE pdct_collect_cur;

END;

3.CURSOR FOR LOOP:不需要特别的声明变量,它可以提取出行对象类型的数据

DECLARE

CURSOR cfl IS

SELECT productname,productprice FROM productinfo;

BEGIN

FOR curcfl IN cfl --curcfl不需要声明,它可以提取出行对象的类型的数据,是一个%ROWTYPE类型

LOOP

DMS_OUTPUT.PUT_LINE('名称: ' || curcfl.productname);

END LOOP;

END;

带参的游标

DECLARE

cur_productid productinfo.productid%TYPE := '0240';

cur_productprice productinfo.productprice%TYPE := 1200;

cur_prodrcd productinfo%ROWTYPE;

CURSOR pdct_parameter_cur (id varchar,price NUMBER)

IS SELECT * FROM productinfo

WHERE productid like id||'%'

AND productprice>price;

BEGIN

OPEN pdct_parameter_cur;

LOOP

FETCH pdct_parameter_cur INTO cur_prodrcd;

EXIT WHEN pdct_parameter_cur%NOTFOUND;

DBMS_OUTPUT.PUT_LINE('产品ID' || cur_prodrcd.productid);

END LOOP;

CLOSE pdct_parameter_cur;

END;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值