Oracle:PLSQL游标

本文深入探讨了PLSQL中的游标概念,包括其定义、如何使用以及与JDBC ResultSet对象的相似之处。详细介绍了游标的属性,如%found、%notfound、%isopen和%rowcount,并通过实例演示了声明、打开、提取数据和关闭游标的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PLSQL游标

什么是游标/光标【cursor】

指向查询结果集的指针,指向哪一行,提取哪一行的数据(PLSQL的游标默认指向结果集的第一行)。

类似于JDBC中的ResultSet对象的功能,从上向下依次获取每一记录的内容。

显示游标的四个属性

游标变量 %found: 当最近一次读入记录成功时返回true

游标变量 %notfound:当最近一次读入记录失败时返回true

游标变量 %isopen:判断游标是否已经打开

游标变量 %rowcount:返回已从游标中读取的记录数

隐示游标的四个属性,固定名称SQL

SQL%FOUND:判断SQL语句是否成功执行。当有作用行时为true,否则为false

SQL%NOTFOUND:判断SQL语句是否成功执行。当有作用行时为false,否则为true

SQL%ISOPEN:游标是否打开,当执行CURD时,Oracle会隐含地打开游标,且在该语句执行完毕或隐含地关闭,在隐式游标中,该值永远为false

SQL%ROWCOUNT:操作影响的行数

注意:必须在事务结束之前读取游标属性,只能读取最近的一次DML操作的游标状态

使用游标分为4个步骤

1、声明游标:cursor 游标变量 is 查询语句

2、打开游标:open 游标变量(不能重复打开游标)

3、提取数据:fetch 游标变量 into 变量1,变量2,.

4、关闭游标:close 游标变量

--使用无参光标cursor,查询所有员工的姓名和工资【如果需要遍历多条记录时,使用光标cursor,无记录找到使用cemp%notfound】
declare
    --定义游标 
    cursor cemp is select ename,sal from emp;
    --定义变量
    vename emp.ename%type;
    vsal emp.sal%type;
begin
    --打开游标,这时游标位于第一条记录之前
    open cemp;
    --循环	
    loop
       --向下移动游标一次
       fetch cemp into vename,vsal; 
       --退出循环,当游标下移一次后,找不到记录时,则退出循环
       exit when cemp%notfound;
       --输出结果
       dbms_output.put_line(vename||'————'||vsal);
    end loop;
    --关闭游标
    close cemp;
end;
/

 

--使用带参光标cursor,查询10号部门的员工姓名和工资
declare
    cursor cemp(pdeptno emp.deptno%type) is select ename,sal from emp where deptno=pdeptno;
    pename emp.ename%type;
    psal emp.sal%type; 
begin 
    open cemp(&deptno);
    loop
        fetch cemp into pename,psal;	 
        exit when cemp%notfound;
        dbms_output.put_line(pename||'的薪水是'||psal);
    end loop;
    close cemp;
end;
/
--使用无参光标cursor,真正给员工涨工资,ANALYST涨1000,MANAGER涨800,其它涨400,要求显示编号,姓名,职位,薪水
declare
    cursor cemp is select empno,ename,job,sal from emp;
    pempno emp.empno%type;
    pename emp.ename%type;
    pjob emp.job%type;
    psal emp.sal%type;
begin
    open cemp;
    loop
        fetch cemp into pempno,pename,pjob,psal;
        --循环退出条件一定要写
        exit when cemp%notfound;
        if pjob='ANALYST' then
            update emp set sal = sal + 1000 where empno = pempno;
        elsif pjob='MANAGER' then
            update emp set sal = sal + 800 where empno = pempno;
        else 
	    update emp set sal = sal + 400 where empno = pempno;
        end if;
    end loop;
    commit;
    close cemp;
end;
/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值