游标笔记

[color=brown][size=medium]每一条被oracle执行的sql语句都有一个独立的游标与之关联;[/size][/color]

[color=blue][size=medium]隐式游标implicit cursors:-->用于所有的DML和PL/SQL的SELECT语句[/size][/color]

DECLARE
v_ename emp.ename%TYPE;
BEGIN
select ename into v_ename where empno=9527;
--游标属性
IF SQL%NOTFOUND THEN --SQL%NOTFOUND 表示被影响的行数是否为0
DBMS_OUTPUT.PUT_LINE('not found!');
END IF;
IF SQL%FOUND THEN --SQL%FOUND 表示被影响的行数是否大于等于1,与SQL%NOTFOUNT相对
DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT||' rows influenced!');--SQL%ROWCOUNT表示被影响的行数,是个整数值。
END IF;
IF SQL%ISOPEN THEN --SQL%ISOPEN oracle每执行一条sql语句就会自动关闭SQL游标,所以这里一直是false。
DBMS_OUTPUT.PUT_LINE('open!');
ELSE
DBMS_OUTPUT.PUT_LINE('close!');
END IF;

EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('exception: no date!');
END;

[size=medium][color=blue]显式游标explicit cursors:-->被程序显示声明和命名;
-->能够一行一行的处理多行查询的结果;
-->能够记录和跟踪当前处理的行;
-->在写的PL/SQL中允许手工控制处理游标;[/color][/size]

DECLARE
v_emprow emp%ROWTYPE;
CURSOR emp_cursor IS
select * from emp;--没有into子句
CURSOR emp_name_cursor IS
select ename from emp;
BEGIN
OPEN emp_cursor;-->打开游标
IF emp_cursor%ISOPEN THEN-->cursor_name%ISOPEN 判断游标是否打开;
DBMS_OUTPUT.PUT_LINE('cursor is open!');
END IF;
FETCH emp_cursor INTO v_emprow;-->将当前提取到的行的值存储到PL/SQL变量中;
IF emp_cursor%FOUND THEN-->cursor_name%FOUND 和 cursor_name%NOTFOUND 判断最近一次的FETCH操作是否返回了一行数据;
DBMS_OUTPUT.PUT_LINE('at first-->:'||'empno:'||v_emprow.empno||' ename:'||v_emprow.ename||' sal:'||v_emprow.sal);
END IF;
--使用基本循环来提取
LOOP
EXIT WHEN emp_cursor%NOTFOUND;
FETCH emp_cursor INTO v_emprow;
DBMS_OUTPUT.PUT_LINE('at loop-->:'||'empno:'||v_emprow.empno||' ename:'||v_emprow.ename||' sal:'||v_emprow.sal);
END LOOP;
DBMS_OUTPUT.PUT_LINE(emp_cursor%ROWCOUNT||' rows have fetch!');-->cursor_name%ROWCOUNT 值为当前取回的总行数
--使用FOR循环来便捷的处理显式游标
FOR c_ename IN emp_name_cursor LOOP--使用for循环来处理游标会在FOR循环开始和结束时自动打开和关闭游标
DBMS_OUTPUT.PUT_LINE('at for-->:'||' ename: '||c_ename.ename);
END LOOP;
CLOSE emp_cursor;-->关闭游标
END;

[size=medium][color=brown]注:
1.显示游标所定义的SQL语句必须包含select语句
2.当返回的行数不确定,使用显示游标;
3.当返回的行数确定只有一行时,使用隐式游标将更好;
4.在for循环中,可以不用定义游标,直接在IN后写(select子句);
5.定义带参数的游标之后,在open游标时,需要给游标传实参;[/color][/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值