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 ;
PL/SQL程序之光标
最新推荐文章于 2024-08-28 13:34:29 发布