Oracle游标

 --游标的属性
SQL> set serveroutput on
SQL> declare --声明
  2  var_ename varchar2(50);--声明变量,用来存储员工姓名
  3  var_job varchar2(50);
  4  cursor cur_emp  定义游标,检索指定属性的记录
  5  is select ename,job from emp
  6  where empno = 7499;
  7  begin  
  8   open cur_emp; 打开游标
  9  fetch cur_emp into var_ename,var_job; --读取游标,并存储员工姓名和职务
 10  if cur_emp%found then  --如果数据存在则显示
 11  dbms_output.put_line('编号7499的员工名称为: '||var_ename||',职务是:'||var_job);
 12  else    --否则,执行下面
 13  dbms_output.put_line('无数据记录');
 14  end if;--结束条件语句
 15  end;--结束游标过程
 16  /
-- 输出的结果为:
编号7499的员工名称为: ALLEN,职务是:SALESMAN

 --显示游标
SQL> set serveroutput on
SQL> declare  /*声明游标,检索员工信息*/
  2   cursor cur_emp(var_job in varchar2:='SALESMAN')
  3   is select empno,ename,sal
  4   from emp
  5  where job = var_job;
  6  type record_emp is record   --声明一个record类型的记录
  7  (
  8  var_empno emp.empno%type,
  9  var_ename emp.ename%type,
 10  var_sal emp.sal%type
 11  );
 12   emp_row record_emp;
 13  begin
 14  open cur_emp('MANAGER');
 15  fetch cur_emp into emp_row;   --先让指针指向结果集中的第一行,并将值保存到emp_row中
 16  while cur_emp%found loop
 17   dbms_output.put_line(emp_row.var_ename||'的编号是'||emp_row.var_empno||',工资是'||emp_row.var_sal);
 18  fetch cur_emp into emp_row;   --先让指针指向结果集中的下一行,并将值保存到emp_row中
 19  end loop;
 20  close cur_emp;   关闭游标
 21  end;
 22  /

结果如下:

JONES的编号是7566,工资是2975
BLAKE的编号是7698,工资是2850
CLARK的编号是7782,工资是2450

SQL> --隐式游标
SQL> set serveroutput on
SQL> begin
  2  update emp
  3  set sal=sal*(1+02)
  4  where job = 'SALESMAN';
  5  if sql%notfound then     //若update语句没有影响的任一行数据
  6  dbms_output.put_line('没有雇员需要上调工资');
  7  else                     //若update语句至少影响到一行数据
  8  dbms_output.put_line('有'||sql%rowcount||'个雇员工资上调20%');
  9  end if;
 10  end;
 11  /
 结果:
有4个雇员工资上调20%

在for语句中遍历隐式游标中的数据时,通常在关键字"in"的后面提供由SELECT语句检索的结果集,在检索结果集的过程中,Oracle系统会自动提供一个隐式游标sql.

使用隐式游标和for语句检索出职务是销售员的雇员信息并输出,代码如下:

SQL> set serveroutput on
SQL> begin
  2  for emp_record in (select empno,ename,sal from emp where job ='SALESMAN')
  3  loop
  4  dbms_output.put_line('雇员编号'||emp_record.empno);
  5  dbms_output.put_line(';雇员名称'||emp_record.ename);
  6  dbms_output.put_line(';雇员工资:'||emp_record.sal);
  7  end loop;
  8  end;
  9  /
 
雇员编号7499
雇员名称ALLEN
;雇员工资:4800
雇员编号7521
雇员名称WARD
;雇员工资:3750
雇员编号7654
雇员名称MARTIN
;雇员工资:3750
雇员编号7844
雇员名称TURNER
;雇员工资:4500

使用显式游标和for语句检索出部门编号是30的雇员信息并输出,代码如下

SQL> set serveroutput on
SQL> declare
  2  cursor cur_emp is
  3  select * from emp
  4  where deptno =30;
  5  begin
  6  for emp_record in cur_emp
  7  loop
  8  dbms_output.put_line('雇员编号:'||emp_record.empno);
  9  dbms_output.put_line('雇员名称:'||emp_record.ename);
 10  dbms_output.put_line('雇员职务:'||emp_record.job);
 11  end loop;
 12  end;
 13  /
 
雇员编号:7499
雇员名称:ALLEN
雇员职务:SALESMAN
雇员编号:7521
雇员名称:WARD
雇员职务:SALESMAN
雇员编号:7654
雇员名称:MARTIN
雇员职务:SALESMAN
雇员编号:7698
雇员名称:BLAKE
雇员职务:MANAGER
雇员编号:7844
雇员名称:TURNER
雇员职务:SALESMAN
雇员编号:7900
雇员名称:JAMES
雇员职务:CLERK

posted @ 2017-09-11 15:49  进击的大黄瓜  阅读(166)  评论(0编辑  收藏  举报