欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Oracle游标使用参考语句实例解析

程序员文章站 2022-04-01 10:38:30
游标是从表中检索出结果集,从中每次指向一条记录进行交互的机制。作用 指定结果集中特定行的位置。 基于当前的结果集位置检索一行或连续的几行。 在结果集的当前位置修改行中的数据。 对其他用户所做的...

游标是从表中检索出结果集,从中每次指向一条记录进行交互的机制。

作用

  • 指定结果集中特定行的位置。
  • 基于当前的结果集位置检索一行或连续的几行。
  • 在结果集的当前位置修改行中的数据。
  • 对其他用户所做的数据更改定义不同的敏感性级别。
  • 可以以编程的方式访问数据库。

一个简单实用:

declare 
  -- 声明游标  
  cursor mycur is 
    select * from emp; 
  empinfo emp%rowtype; 
  cou   number; 
begin 
  -- 游标操作使用循环,但是在操作之前必须先将游标打开  
  for empinfo in mycur loop 
    cou := mycur%rowcount; 
    dbms_output.put_line('行号:' || cou || '  雇员编号:' || empinfo.empno || '  雇员姓名:' || empinfo.ename); 
  end loop; 
end; 

循环取出数据的两种写法:

declare 
  -- 声明游标  
  cursor mycur is 
    select * from emp; -- list (emppo)  
  empinfo emp%rowtype; 
  cou   number; 
begin 
  -- 游标操作使用循环,但是在操作之前必须先将游标打开  
  if mycur%isopen then 
    null; 
  else 
    open mycur; 
  end if; 
  -- 使游标向下一行  
  fetch mycur 
    into empinfo; 
  -- 判断此行是否有数据被发现  
  while (mycur%found) loop 
    cou := mycur%rowcount; 
    dbms_output.put_line('行号:' || cou || '  雇员编号:' || empinfo.empno || '  雇员姓名:' || empinfo.ename); 
    -- 修改游标,继续向下  
    fetch mycur 
      into empinfo; 
  end loop; 
end; 

第二种写法:

declare 
  -- 声明游标 
  cursor mycur is 
    select * from emp; 
  empinfo emp%rowtype; 
  cou   number; 
begin 
  -- 游标操作使用循环,但是在操作之前必须先将游标打开  
  if mycur%isopen then 
    null; 
  else 
    open mycur; 
  end if; 
  loop 
    -- 使游标向下一行  
    fetch mycur 
      into empinfo; 
    exit when mycur%notfound; 
    cou := mycur%rowcount; 
    dbms_output.put_line('行号:' || cou || '  雇员编号:' || empinfo.empno || '  雇员姓名:' || empinfo.ename); 
  end loop; 
end; 

在存储过程中使用游标

create or replace procedure myproc(oi_return out integer) is 
  cursor mycur is 
    select * from emp_0915; 
  empinfo emp_0915%rowtype; 
  cou   number; 
  exc_return exception; -- 程序中间返回自定义异常 
begin 
  if mycur%isopen then 
    null; 
  else 
    open mycur; 
  end if; 
  loop 
    fetch mycur 
      into empinfo; 
    exit when mycur%notfound; 
    cou := mycur%rowcount; 
    dbms_output.put_line(cou || '开始更新...'); 
    update emp_0915 t set t.sal = t.sal + 1 where t.empno = empinfo.empno; 
    dbms_output.put_line(cou || '更新结束...'); 
  end loop; 
  commit; 
  oi_return := 1; 
exception 
  when exc_return then 
    rollback; 
    oi_return := 0; 
end; 

在oracle中测试:

declare 
  re integer; 
begin 
  myproc(re); 
  if re = 1 then 
    dbms_output.put_line(re || ':执行结束。。。'); 
  else 
    dbms_output.put_line(re || ':执行错误_______'); 
  end if; 
end; 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。