13、oracle数据库下的游标

ORACLE下的游标操作

游标是sql的一个内存工作区,由系统或者用户以变量的形式定义。游标的作用是用于临时存储从数据库中提取的数据块。游标有静态游标、动态游标之分,静态游标又可分为隐式游标和显式游标。静态游标是在编译时期就决定了结果集的,不能传递参数,而动态游标是可以通过在运行期间传递参数来获取数据结果集的。

游标的属性如下:

隐式游标的属性

SQL%ROWCOUNT(整型)

代表dml语句成功执行的数据行数

SQL%FOUND(布尔值)

判断增删改查操作是否操作成功

SQL%NOTFOUND(布尔值)

判断增删改查操作是否操作成功

SQL%ISOPEN(布尔值)

DML语句在执行过程中为真,结束后为假

 

1.隐式游标

隐式游标是数据库系统自动打开和关闭的,不需要控制,一次只能获取一条数据,例如使用select(查询记录数),update,insert,delete等语句时。隐式游标一般用于根据操作语句对应的游标属性来了解操作的状态和结果,从而达到流程的控制。

接下来介绍一下隐式游标的使用

-- 判断update是否执行成功,成功则提交事务

BEGIN
    UPDATE person SET name='zhangsan'; where id=1
    IF SQL%FOUND THEN
       COMMIT;
       dbms_output.put_line('success');
    ELSE
       dbms_output.put_line('failed');
    END IF
END;
-- 判断影响的行数
DECLARE
    rowCount INT;

BEGIN
    UPDATE person SET name='aaa';
    rowRount:=SQL%ROWCOUNT;

    dbms_output.put_line('rowRount='|| rowRount);
END;

2.显示游标

从数据库中提取多行数据时要放到显式游标中存储。使用显示游标大致分为五步,使用CURSOR定义显示游标如下:

1、定义游标

Cursor cursor_name IS

2、打开游标

OPEN cursor_name

3、操作游标

FETCH cursor_name INTO somVar

4、判断游标是否获取到行值

cursor_name%NOTFOUND;

5、关闭游标

CLOSE cursor_name

看一个具体的实例

将一个表中的数据放到两个数据表中
DECLARE
    t_id int;
    t_name varchar2;
    t_sex char(1);
--定义游标
CURSOR teacher_cur IS SELECT tid,name,sex FROM teacher WHERE tid<=26;
BEGIN
    --打开游标
    OPEN teacher_cur;
    LOOP
    --提取游标
        FETCH teacher_cur INTO t_id, t_name,t_sex;
        --一定要退出循环
        EXIT WHEN NOT teacher_cur%FOUND;
        IF teacher_sex='M' THEN
             一插入数据到表
             COMMIT;
        ELSE
    -- 插入数据到表二
    COMMIT;
END IF;
END LOOP;
IF teacher_cur%ISOPEN THEN
--关闭游标
CLOSE teacher_cur;
END IF
END;

3.动态游标

ref cursor(动态游标)是可以通过在运行期间传递参数来获取数据结果集的,动态游标使用REF CURSOR进行定义。

DECLARE

    --指定动态游标类型
    TYPE cursor_type IS REF CURSOR;
    myCursor cursor_type;--游标类型
    v_sql VARCHAR2(200);
    v_person person%ROWTYPE;
BEGIN
    --定义动态的sql语句
    v_sql:='select * from person where pname LIKE ‘‘%m%’’';
    --打开游标
    OPEN myCursor FOR v_sql;
    LOOP
         --提取游标
         FETCH myCursor INTO v_person;
         --停止循环
         EXIT WHEN myCursor%NOTFOUND;
         dbms_output.put_line (v_person.id);
     END LOOP;
     EXCEPTION
         WHEN OTHERS THEN
         CLOSE myCursor;
     IF myCursor%ISOPEN THEN
         CLOSE myCursor;
END IF;
END;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值