Oracle笔记 九、PL/SQL 游标的使用

简介:
--演示隐式游标,系统自动声明,自动打开,自动使用并且自动关闭
begin
     update emp set sal = 1000;
     dbms_output.put_line('影响的行数:' || sql%rowcount);
end;
 
rollback;
 
/*游标的使用方法:
第一步:声明游标
第二步:打开游标
第三步:使用游标进行循环操作
第四步:关闭游标*/
 
--普通游标,游标本身就是一个变量
declare     
     --下面的这行代码声明了一个游标
     cursor mycur is select * from emp where deptno = 20;
     emprow emp%rowtype;
begin
     open mycur; --打开游标
     loop
         fetch mycur into emprow; --把游标所指的纪录放到变量中
         exit  when (mycur%notfound); --当游标没有指向行时退出循环
         dbms_output.put_line('名字:' || emprow.ename || '薪水:' || emprow.sal);
     end loop;
     close mycur;  --关闭游标
end;
 
--简单游标,列操作
declare
       empname emp.ename%type;
       empsal emp.sal%type;
       cursor mycur is select ename,sal from emp where deptno = 30;
begin
     open mycur;
     loop
         fetch mycur into empname,empsal;
         exit when mycur%notfound;
         dbms_output.put_line('姓名:' || empname || '工资' || empsal);
     end loop;
end;
 
--简单游标,列操作
declare
  cursor c 
  is
  select * from dept;
  vDept_row_record c%rowtype;
begin
  open c;
  fetch c into vDept_row_record;
  dbms_output.put_line(vDept_row_record.dname);
  close c;
end;
 
--when循环游标
declare
  cursor c 
  is
  select * from dept;
  vDept_row_record c%rowtype;
begin
  open c;
  loop
       fetch c into vDept_row_record;
       exit when(c%notfound);
       dbms_output.put_line(vDept_row_record.dname);
  end loop;
  close c;
end;
 
--while循环游标
declare
  cursor c
  is
  select * from dept;
  vDept_row_record c%rowtype;
begin
  open c;
  fetch c into vDept_row_record;
  while (c%found) loop
    dbms_output.put_line(vDept_row_record.dname);
    fetch c into vDept_row_record;
  end loop;
  close c;
end;
 
--for循环游标
declare
  cursor c
  is
  select * from dept;
  vDept_row_record c%rowtype;
begin
  for vDept_row_record in c loop
    dbms_output.put_line(vDept_row_record.dname);
  end loop;
end;
 
--带参游标
declare
  cursor c(sSal emp.sal%type, sEmpno emp.empno%type)
  is
  select * from emp where sal >= sSal and empno > sEmpno;
begin
  for record_data in c(2500, 6666) loop
      dbms_output.put_line(record_data.ename);
  end loop;
end;
 
--update游标
declare
  cursor c(sSal emp2.sal%type)
  is
  select * from emp2 where sal >= sSal for update;
begin
  for record_data in c(2500) loop
    if (record_data.sal < 3000) then
      update emp2 set sal = sal + 3 where current of c;
      dbms_output.put_line(record_data.ename);
    elsif (record_data.sal = 5000) then
      update emp2 set sal = sal - 3 where current of c;
      dbms_output.put_line(record_data.ename);
    end if;
  end loop;
end;
 
--引用游标不能使用循环游标的语法
--引用游标不能进行删除和修改
--引用游标是一个数据类型,使用该类型必须声明变量
 
--弱类型引用游标,就是不指定游标将要提取的数据行的类型
declare
       type my_cur_type is ref cursor;
       mycur my_cur_type;--声明变量
       which varchar2(10);
       deptrow dept%rowtype;
       emprow emp%rowtype;
begin
     which := '&请选择dept还是emp';
     if (which = 'dept') then
        open mycur for select * from dept;
        loop
            fetch mycur into deptrow;
            exit when (mycur%notfound);
            dbms_output.put_line(deptrow.deptno || '  ' || deptrow.dname);
        end loop;
     elsif (which = 'emp') then
        open mycur for select * from emp;
        loop
            fetch mycur into emprow;
            exit when (mycur%notfound);
            dbms_output.put_line(emprow.empno || '  ' || emprow.ename);
        end loop;
     end if;
     close mycur;
end;
 
--强类型引用游标,就是指定游标将要提取的数据行的类型 ,只能是record或%rowtype类型
--比如:return number是错的,return emp.ename%type也是错的
declare
       type mycurtype is ref cursor return emp%rowtype;
       mycur mycurtype;--声明变量
       emprow emp%rowtype;
begin
        open mycur for select * from emp;
        loop
            fetch mycur into emprow;
            exit when mycur%notfound;
            dbms_output.put_line(emprow.empno || '  ' || emprow.ename);
        end loop;
        close mycur;
end;





本文转自hoojo博客园博客,原文链接:http://www.cnblogs.com/hoojo/archive/2011/05/03/2035371.html,如需转载请自行联系原作者
目录
相关文章
|
7天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL游标属性:数据的“导航仪”与“仪表盘”
【4月更文挑战第19天】Oracle PL/SQL游标属性如同车辆的导航仪和仪表盘,提供丰富信息和控制。 `%FOUND`和`%NOTFOUND`指示数据读取状态,`%ROWCOUNT`记录处理行数,`%ISOPEN`显示游标状态。还有`%BULK_ROWCOUNT`和`%BULK_EXCEPTIONS`增强处理灵活性。通过实例展示了如何在数据处理中利用这些属性监控和控制流程,提高效率和准确性。掌握游标属性是提升数据处理能力的关键。
|
7天前
|
SQL Oracle 安全
Oracle的PL/SQL循环语句:数据的“旋转木马”与“无限之旅”
【4月更文挑战第19天】Oracle PL/SQL中的循环语句(LOOP、EXIT WHEN、FOR、WHILE)是处理数据的关键工具,用于批量操作、报表生成和复杂业务逻辑。LOOP提供无限循环,可通过EXIT WHEN设定退出条件;FOR循环适用于固定次数迭代,WHILE循环基于条件判断执行。有效使用循环能提高效率,但需注意避免无限循环和优化大数据处理性能。掌握循环语句,将使数据处理更加高效和便捷。
|
7天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL条件控制:数据的“红绿灯”与“分岔路”
【4月更文挑战第19天】在Oracle PL/SQL中,IF语句与CASE语句扮演着数据流程控制的关键角色。IF语句如红绿灯,依据条件决定程序执行路径;ELSE和ELSIF提供多分支逻辑。CASE语句则是分岔路,按表达式值选择执行路径。这些条件控制语句在数据验证、错误处理和业务逻辑中不可或缺,通过巧妙运用能实现高效程序逻辑,保障数据正确流转,支持企业业务发展。理解并熟练掌握这些语句的使用是成为合格数据管理员的重要一环。
|
SQL 数据库管理
常用Sql整理笔记
一、多行结果转换为一行,用逗号隔开。 mssql代码如下: 点击打开 -- 多行 select tid from typeinfo where pid=4 -- 一行 select STUFF((Select ','+Convert(varchar(50),tid) FROM ty...
867 0
|
15天前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
52 10
|
1月前
|
SQL 数据库 数据安全/隐私保护
Sql Server数据库Sa密码如何修改
Sql Server数据库Sa密码如何修改
|
25天前
|
SQL
启动mysq异常The server quit without updating PID file [FAILED]sql/data/***.pi根本解决方案
启动mysq异常The server quit without updating PID file [FAILED]sql/data/***.pi根本解决方案
17 0
|
15天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
88 6
|
2天前
|
SQL 数据管理 关系型数据库
如何在 Windows 上安装 SQL Server,保姆级教程来了!
在Windows上安装SQL Server的详细步骤包括:从官方下载安装程序(如Developer版),选择自定义安装,指定安装位置(非C盘),接受许可条款,选中Microsoft更新,忽略警告,取消“适用于SQL Server的Azure”选项,仅勾选必要功能(不包括Analysis Services)并更改实例目录至非C盘,选择默认实例和Windows身份验证模式,添加当前用户,最后点击安装并等待完成。安装成功后关闭窗口。后续文章将介绍SSMS的安装。
6 0

推荐镜像

更多