PL/SQL程序之光标

来源:互联网 发布:金属中性笔 知乎 编辑:程序博客网 时间:2024/06/06 04:07
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+1000when 'MANGER' then sal+800else sal+400end);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;--结束标识例三:查找出所有的enamedeclarecursor c1 is select * from emp;emp_row emp%rowtype;beginopen c1;loopfetch c1 into emp_row;exit when c1%notfound;dbms_output.put_line(emp_row.ename);end loop;close c1;end;例四:查询部门号为10的员工信息declarecursor c1 (emp_deptno number) is select * from emp where deptno=emp_deptno;emp_row emp%rowtype;beginopen 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 ;


原创粉丝点击