转载来自:
http://blog.csdn.net/w_l_j/article/details/7380495
- 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
- <p><strong><span style="color:red;">特别注意:</span></strong></p><p>在打开游标之前最好先判断游标是否已经是打开的。</p><p>通过ISOPEN判断,格式:</p><p>游标%ISOPEN</p><p>IF mycur%ISOPEN </p><p>THEN </p><p>null ; </p><p>ELSE </p><p>OPENmycur ; </p><p>END IF ;</p>