码迷,mamicode.com
首页 > 数据库 > 详细

oracle游标的使用

时间:2018-04-26 23:24:30      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:exit   lin   ali   when   简单的   sop   数据   and   loop   

游标有两种类型:显示游标和隐式游标

 

隐式游标的属性     返回值类型    意见

SQL%ROWCOUNT     整型   代表DML语句成功执行的数据行数

SQL%FOUND    布尔型  值为TRUE代表插入、删除、更新或单行查询操作成功

SQL%NOTFOUND  布尔型  与SQL%FOUND返回值相反

SQL%ISOPEN    布尔型  DML执行过程中为真,结束后为假

-- 使用隐式游标执行更新操作
begin
  update emp set sal = 1000 where deptno = 10;
  if SQL%FOUND THEN
    dbms_output.put_line(‘update success‘);
    commit;
   else
     dbms_output.put_line(‘update false‘);
   end if;
end;

 

游标的定义和操作

--声明游标
declare
变量1 数据类型1;
变量2 数据类型2;
cursor 游标名称(参数1 数据类型1, 参数2 数据类型2,... )
IS SELECT语句;
--打开游标
OPEN 游标名称(参数1 数据类型1, 参数2 数据类型2,... )
--提取数据
FETCH 游标名称 INTO 变量1,变量2;
或者
FETCH 游标名称 INFO 记录变量;
--关闭游标
close 游标名称

  

 

--用游标获取deptno=10的名称和sal
declare
v_ename varchar2(30);
v_sal varchar2(30);
cursor emp_cursor is
select ename,sal from emp where deptno = 10;
begin
  open emp_cursor;
  FETCH emp_cursor INTO v_ename,v_sal;
  DBMS_OUTPUT.put_line(v_ename||‘ ‘||v_sal);
  close emp_cursor;
end;

OR

declare
cursor emp_cursor is
select ename,sal from emp where deptno = 10;
emp_record emp_cursor%ROWTYPE;
begin
  open emp_cursor;
  FETCH emp_cursor INTO emp_record;
  Dbms_Output.put_line(emp_record.ename||‘ ‘||emp_record.sal);
  close emp_cursor;
end;

  

 

--用游标获取deptno=10的前3条数据
declare
v_ename varchar2(30);
v_sal varchar2(30);
cursor emp_cursor is
select ename,sal from emp where deptno = 10;
begin
  open emp_cursor;
       FOR I IN 1..3 LOOP
         FETCH emp_cursor INTO v_ename,v_sal;
         DBMS_OUTPUT.put_line(v_ename||‘ ‘||v_sal);
        END LOOP;
  close emp_cursor;
end;

--用游标获取deptno=10的所有数据,隐含了记录变量的定义、游标的打开、提取和关闭过程
declare
cursor emp_cursor is
select ename,sal from emp where deptno = 10;
begin
 for emp_record IN emp_cursor LOOP
   Dbms_Output.put_line(emp_record.ename||‘ ‘||emp_record.sal||‘ ‘||emp_cursor%ROWCOUNT); 
  END LOOP;
end;

--还有一种更简单的方法
begin
  for emp in (select ename,sal from emp where deptno = 10) LOOP
    Dbms_Output.put_line(emp.ename||‘ ‘||emp.sal); 
  end loop;
end;

  

 

--用游标获取表中数据,循环的使用,需要退出条件
declare
v_ename varchar2(30);
v_sal varchar2(30);
cursor emp_cursor is
select ename,sal from emp;
begin
  open emp_cursor;
    LOOP
      FETCH emp_cursor INTO v_ename,v_sal;
      EXIT WHEN emp_cursor%NOTFOUND;  --当FETCH没有成功执行,退出循环
      DBMS_OUTPUT.put_line(‘123:‘||v_ename||‘ ‘||v_sal);
    END LOOP;
  close emp_cursor;
end;

  

 

--带参数的游标
declare
v_ename varchar2(30);
v_sal varchar2(30);
cursor emp_cursor(p_deptno varchar2,p_sal varchar2) is
select ename,sal from emp where deptno = p_deptno and sal = p_sal;
emp_record emp_cursor%ROWTYPE;
begin
  open emp_cursor(‘20‘,‘8000‘);
    LOOP
      FETCH emp_cursor INTO v_ename,v_sal;
      EXIT WHEN emp_cursor%NOTFOUND;
      DBMS_OUTPUT.put_line(v_ename||v_sal);
    END LOOP;
  close emp_cursor;
end;

OR

declare
v_name varchar2(30);
v_sal varchar2(30);
v_deptno varchar2(20);
cursor emp_cursor is
select ename,sal from emp where deptno = v_deptno and sal = v_sal;
begin
  v_deptno:=‘20‘;
  v_sal:=‘6000‘;
  open emp_cursor;
  LOOP
    FETCH emp_cursor INTO v_name,v_sal;
    EXIT WHEN emp_cursor%NOTFOUND;
    DBMS_OUTPUT.put_line(v_name||v_sal);
  END LOOP;
END;

  

--有异常处理的游标,位于可执行部分之后,由WHEN语句引导的多个分支
declare
v_ename varchar2(30);
v_sal varchar2(30);
cursor emp_cursor(p_deptno varchar2,p_sal varchar2) is
select ename,sal from emp where deptno = p_deptno and sal = p_sal;
emp_record emp_cursor%ROWTYPE;
begin
  open emp_cursor(‘20‘,‘8000‘);
    LOOP
      FETCH emp_cursor INTO v_ename,v_sal;
      EXIT WHEN emp_cursor%NOTFOUND;
      DBMS_OUTPUT.put_line(v_ename||v_sal);
    END LOOP;
  close emp_cursor;
  EXCEPTION
    WHEN INVALID_CURSOR THEN
      DBMS_OUTPUT.put_line(‘试图使用没有打开的游标‘);
end;

  

 

  

 

oracle游标的使用

标签:exit   lin   ali   when   简单的   sop   数据   and   loop   

原文地址:https://www.cnblogs.com/zhangcece/p/8954974.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!