关闭

PL/SQL程序之光标

1530人阅读 评论(0) 收藏 举报
1、说明光标语法:
CURSOR  光标名  [ (参数名  数据类型[,参数名 数据类型]...)]  IS  SELECT   语句;
2、用于存储一个查询返回的多行数据
3、打开光标:                 open c1;    (打开光标执行查询)
4、	取一行光标的值:fetch c1 into pjob; (取一行到变量中)
5、关闭光标:          close  c1;(关闭游标释放资源)
6、注意: 上面的pjob必须与emp表中的job列类型一致:    定义:pjob emp.job%type;

例一:按职工的职称长工资,总裁1000元,经理800元,其他人员长400元
Java程序
SQL> update emp set sal = (
case job when 'PRESIDENT' then sal+1000
when 'MANGER' then sal+800
else sal+400
end);

PL/SQL程序
declare
--定义光标   查询empno以及job岗位
cursor c1 is select empno,job from emp;
--声明一个变量   此变量与emp表中的job字段类型一致
emp_job emp.job%type;
--声明一个变量   此变量与emp表中的empno字段类型一致
emp_empno emp.empno%type;
--开始
begin
 --打开光标
 open c1;
 --循环开始
 loop 
   --取出光标
   fetch c1 into emp_empno,emp_job;
   exit when c1%notfound;--判断光标是否存在  如果存在  则往下执行  否则  不执行
   
   if emp_job='PRESIDENT' then update emp set sal =sal+1000 where empno=emp_empno;
   elsif emp_job='MANAGER' then update emp set sal =sal+800 where empno=emp_empno;
   else  update emp set sal =sal+1000 where empno=emp_empno;
   end if;
   end loop;--退出循环
   close c1;--关闭光标
   end;--结束标识

例二:找出7369的职位
declare
 emp_job emp.job%type;
begin
 select job into emp_job from emp where empno=7369;-----into方法,把查询出来的job  名放到emp_job中
 dbms_output.put_line(emp_job);
end;

找出emp中的所有职位
 declare
--定义光标   查询job岗位
cursor c1 is select job from emp;
--声明一个变量   此变量与emp表中的job字段类型一致
emp_job emp.job%type;
--开始
begin
 --打开光标
 open c1;
 --循环开始
 loop 
   --取出光标
   fetch c1 into emp_job;
   exit when c1%notfound;--判断光标是否存在  如果存在  则往下执行  否则  不执行
   dbms_output.put_line(emp_job);
   end loop;--退出循环
   close c1;--关闭光标
   end;--结束标识

例三:查找出所有的ename
declare
cursor c1 is select * from emp;
emp_row emp%rowtype;
begin
open c1;
loop
fetch c1 into emp_row;
exit when c1%notfound;
dbms_output.put_line(emp_row.ename);
end loop;
close c1;
end;
例四:查询部门号为10的员工信息
declare
cursor c1 (emp_deptno number) is select * from emp where deptno=emp_deptno;
emp_row emp%rowtype;
begin
open c1(10);
dbms_output.put_line('部门号为10的员工信息');
loop
     fetch c1 into emp_row;
     exit when c1%notfound;
     dbms_output.put_line('员工编号'||emp_row.empno||'员工姓名'|| emp_row.ename||'员工工资'|| emp_row.sal||'员工部门编 
号'||emp_row.deptno);
end loop;
close c1;
end;
结果:
部门号为10的员工信息
员工编号7782员工姓名CLARK员工工资2450员工部门编号10
员工编号7839员工姓名KING员工工资5000员工部门编号10
员工编号7934员工姓名MILLER员工工资1300员工部门编号10
带参数的光标
例五:带有参数光标的练习
SQL> declare
  2  cursor c1(emp_deptno number) is select * from emp where deptno=emp_deptno;
  3  emp_row emp%rowtype;
  4  begin
  5  open c1(10);
  6  loop
  7  fetch c1 into emp_row;
  8  exit when c1%notfound ;
  9  dbms_output.put_line('员工的名称'|| emp_row.ename || emp_row.job);
 10  end loop;
 11  close c1;
 12  end;
 13  /
 结果:
员工的名称CLARKMANAGER
员工的名称KINGPRESIDENT
员工的名称MILLERCLERK

特别注意:

在打开游标之前最好先判断游标是否已经是打开的。

通过ISOPEN判断,格式:

游标%ISOPEN

IF mycur%ISOPEN  

THEN

null ;

ELSE

OPENmycur ;

END IF ;


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:396322次
    • 积分:5880
    • 等级:
    • 排名:第4301名
    • 原创:210篇
    • 转载:15篇
    • 译文:0篇
    • 评论:38条
    文章分类
    最新评论