Oracle游标【光标】

Oracle游标【光标】

游标: 就是用来保存多行数据的变量。
--第一步:声明游标和行变量;
cursor 游标名(参数…) is select语句;
变量名 类型;

--第二步:打开游标;
open 游标名;

--第三步:获取游标中的每一行数据;
fetch 游标 into 行变量; 
--每调用一次fetch,就相当于把指针向下移动一行,然后再把该行记录赋给一个行变量。

--第四步:关闭游标;
close 游标名;
--定义游标
cursor 游标名称 is 查询语句

open 游标;
    loop
        --获取游标中的值
        fetch 游标 into 变量;
        --退出条件
        exit when 游标%notfound;
    end loop;
close 游标;
--获取emp表中,的员工名称和 工资
declare 
    --定义游标
    cursor emplist is select * from emp;
    --定义行类型接收值
    pemp emp%rowtype;
begin
    --迭代
    open emplist;
         loop
             fetch emplist into pemp;
             exit when emplist%notfound;--退出条件
             --打印输出信息
             dbms_output.put_line('员工名称:'||pemp.ename||',工资:'||pemp.sal);
         end loop;
    close emplist;
end;
--找出10号部门的员工,给他们每人加薪:100
declare
    --定义游标
    cursor emplist is select empno,ename from emp where deptno=10;
    --引用类型
    pempno emp.empno%type;
    pename emp.ename%type;
begin
    open emplist;
         loop
             fetch emplist into pempno,pename;
             exit when emplist%notfound;
             dbms_output.put_line(pempno||'=========加薪100========='||pename);
             --更新工资
             update emp set sal = sal+100 where empno = pempno;
             commit;
         end loop;
    close emplist;
end;

游标的属性

%notfound:如果fetch失败,那么该属性就返回true;否则就返回false;

%found:如果fetch成功,那么该属性就返回true;否则就返回false;

%rowcount:返回已经fetch了的记录数据;

%isOpen:如果游标已经打开,那么该属性就返回true;否则就返回false;

--游标必须要先打开,然后才可以使用。

游标的for循环

使用游标for循环可以不需要人手打开游标、fetch、关闭游标,这些操作都是有for循环自动完成。
--游标for循环的好处:简化游标的操作。
for 行变量 in 游标
loop
    循环体…
end loop;
--获取emp表中,的员工名称和 工资
declare 
    --定义游标
    cursor emplist is select * from emp;
begin
  for pemp in emplist 
  loop
         --打印输出信息
         dbms_output.put_line('员工名称:'||pemp.ename||',工资:'||pemp.sal);
     end loop;
end;

带参数游标

带参数的游标,可以在打开游标的时候把参数传入。
--如果使用的游标for循环,那么就需要在for语句的游标名后面传入参数。
--获取emp表中,20号部门的员工名称和 工资
declare 
    --定义游标
    cursor emplist(cur_deptno emp.deptno%type) 
    is 
    select * 
    from emp 
    where deptno=cur_deptno;

    --定义行类型接收值
    pemp emp%rowtype;
begin
    --迭代
    open emplist(20);
         loop
             fetch emplist into pemp;
             exit when emplist%notfound;--退出条件
             --打印输出信息
             dbms_output.put_line('员工名称:'||pemp.ename||',工资:'||pemp.sal);
         end loop;
    close emplist;
end;
--获取emp表中,20号部门的员工名称和 工资
declare 
    --定义游标
    cursor emplist(cur_deptno emp.deptno%type) 
    is 
    select * 
    from emp 
    where deptno=cur_deptno;

begin
  for pemp in emplist(20) 
  loop
         --打印输出信息
         dbms_output.put_line('员工名称:'||pemp.ename||',工资:'||pemp.sal);
     end loop;
end;

隐式游标

--隐式游标又称为SQL游标。
--隐式游标不需要用户自己创建。
--当用户执行"DML"语句的时候,由Oracle数据库自动创建。
隐式游标的作用:
获取DML操作的结果信息。

隐式游标的属性:
%notfound:如果执行DML操作失败,那么就返回true;否则就返回false;
%found:如果执行DML成功,那么就返回true;否则就返回false;没有也会失败
%rowcount:返回DML操作受影响的记录数;
--隐式游标(删除10号部门的所有员工)
begin
  delete from emp where deptno=10;

  if sql%found then
    dbms_output.put_line('删除成功,一共删除了'||sql%rowcount||'条记录');
    else
      dbms_output.put_line('删除失败');
  end if;
end;
--获取emp表中,20号部门的员工名称和 工资
declare 

    cur_deptno number(10):=&dept;

    --定义游标
    cursor emplist
    is 
    select * 
    from emp 
    where deptno=cur_deptno;

    --定义行类型接收值
    pemp emp%rowtype;
begin
    --迭代
    open emplist;
         loop
             fetch emplist into pemp;
             exit when emplist%notfound;--退出条件
             --打印输出信息
             dbms_output.put_line('员工名称:'||pemp.ename||',工资:'||pemp.sal);
         end loop;
    close emplist;
end;
--获取emp表中,20号部门的员工名称和 工资
declare 

    cur_deptno number(10):=&dept;

    --定义游标
    cursor emplist(cur_deptno emp.deptno%type) 
    is 
    select * 
    from emp 
    where deptno=cur_deptno;

    --定义行类型接收值
    pemp emp%rowtype;
begin
    --迭代
    open emplist(cur_deptno);
         loop
             fetch emplist into pemp;
             exit when emplist%notfound;--退出条件
             --打印输出信息
             dbms_output.put_line('员工名称:'||pemp.ename||',工资:'||pemp.sal);
         end loop;
    close emplist;
end;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值