oracle储存过程--游标

*游标*

什么是游标

用于临时存储一个查询返回结果的多行数据(结果集:类似于java的jdbc连接返回的resultset集合),通过遍历游标,可以逐行访问处理该结果集的数据。

*游标的使用方式:声明--->打开--->读取--->关闭*

*语法*

*游标声明:*

Cursor 游标名[(参数列表)] is 查询语句;

游标的打开:open 游标名

游标的取值:

Fetch 游标名 into 变量列表

游标的关闭:

Close 游标名;

*游标的属性*

*其中,%notfound是在游标中找不到元素的时候返回true,通过那个用来判断退出循环*

*不带有参数的游标*

*小案例:*--使用游标查询emp表中所有员工的姓名和工资,并将其依次打印出来。****

**-- Created on 2020/12/12 by zyq**
declare
 **--声明游标**
 cursor c_emp is
  select ename, sal from emp;
 **--声明变量接收游标中的数据**
 v_ename emp.ename%type;
 v_sal  emp.sal%type;
 
begin
 **--打开游标**
 open c_emp;
 **--遍历游标**
 loop
  **--获取游标中的数据**
  fetch c_emp
   into v_ename, v_sal;
  **--退出循环条件**
  exit when c_emp%notfound;
  dbms_output.put_line(v_ename || '_' || v_sal);
 end loop;
 
 **--关闭游标**
 close c_emp;

end;

*执行结果:*

SMITH_800

ALLEN_1600

WARD_1250

JONES_2975

MARTIN_1250

BLAKE_2850

CLARK_2450

SCOTT_3000

KING_5000

TURNER_1500

ADAMS_1100

JAMES_950

FORD_3000

MILLER_1300

*带有参数的游标*

*小案例:*--使用游标查询emp表中所有员工的姓名和工资,部门编号*为运行时手动输入。*****

**-- Created on 2020/12/12 by zyq**

declare

 **--声明游标  带有参数**

 cursor c_emp(v_deptno emp.deptno%type) is

  select ename, sal from emp where deptno = v_deptno;

 **--声明变量接收游标中的数据**

 v_ename emp.ename%type;

 v_sal  emp.sal%type;

begin

 **--打开游标  传入参数**

 open c_emp(10);

 **--遍历游标**

 loop

  **--获取游标中的数据**

  fetch c_emp

   into v_ename, v_sal;

  **--退出循环条件**

  exit when c_emp%notfound;

  dbms_output.put_line(v_ename || '_' || v_sal);

 end loop;

 **--关闭游标 不需要传参数了**

 close c_emp;

end;

执行结果:

CLARK_2450

KING_5000

MILLER_1300

*注意: %notfound 属性默认值为false ,所以在循环中要注意判断条件的位置,如果先判断在fetch会导致最后一条记录的值被打印两次(多循环一次默认);*

posted @ 2021-01-10 17:56  ~码铃薯~  阅读(717)  评论(0编辑  收藏  举报