Oracle笔记 九、PL/SQL 游标的使用-阿里云开发者社区

开发者社区> 嗯哼9925> 正文

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,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
前端工程师的mysql笔记
背景 最近常参与后台php项目,虽说刚毕业时自学过一阵子php和mysql,不过长时间没用也忘差不多了,于是把mysql再温习一遍,前端同学也可以一起学习下! mysql安装以及操作 安装 brew install mysql 启动 $: mysql.
830 0
Oracle学习笔记之与权限相关的视图
Oracle学习笔记之与权限相关的视图
106 0
怎么设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程
6935 0
Oracle学习笔记之后台进程
Oracle的后台进程,是在平时运维中必须要了解的知识,了解后台进程的作用,能够让你更快的从alter中定位到问题,接下来就简单介绍下常见的几个后台进程。
135 0
Oracle学习笔记_01_SQL初步
1.分类 SQL语句分为以下三种类型:        DML: Data Manipulation Language        数据操纵语言       DDL: Data Definition Language              数据定义语言       DCL: Data Control Language                  数据控制语言 2.
864 0
+关注
4716
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载