游标(重点)
1.定义游标(declear)->打开游标-》使用游标-》关闭游标
declare
cursor c is select * from emp; --结果集可以是任意查询语句的结果
--定义一个可以接收使用C中值的变量
v_emp c%rowtype;
begin
--打开游标
open c;
--使用
fetch c into v_emp;
v_emp.sal:=v_emp.sal+200;
dbms_output.put_line('工资是:'||v_emp.sal||'是:'||v_emp.ename);
--关闭
close c;
end;
2.遍历游标
使用游标遍历输出显示10部门所有员工的姓名
declare
cursor c is select ename from emp where deptno=10;
v_ename c%rowtype;
begin
open c;
loop
fetch c into v_ename;
exit when(c%notfound); --没取到记录时退出
dbms_output.put_line('员工姓名是:'||v_ename.ename); --注意以上3句的顺序
--先取再判断,若取到就显示,若没取到就推出
end loop;
close c;
end;
改写为while遍历
declare
cursor c is select ename from emp where deptno=10;
v_ename c%rowtype;
begin
open c;
fetch c into v_ename; --先取一条
while(c%found) loop --判断是否取到
dbms_output.put_line('员工姓名是:'||v_ename.ename); --先显示再取
fetch c into v_ename;
end loop;
close c;
end;
使用for loop遍历游标
declare
cursor c is select ename from emp where deptno=10;
--v_ename c%rowtype;
begin
--open c;
for v_ename in c loop --自己声明一个接收c值的变量
--自己open c fetch c into ename
--自动判断是否取到
--结束,自动close c
dbms_output.put_line('员工姓名是:'||v_ename.ename);
--fetch c into v_ename;
end loop;
--close c;
end;
推荐使用for:
declare
cursor c is select ename from emp where deptno=10;
begin
for v_ename in c loop
dbms_output.put_line('员工姓名是:'||v_ename.ename);
end loop;
end;
根据用户输入的部门编号输出符合条件的员工姓名极其工资
declare
cursor c is select ename,sal from emp where deptno=&部门编号,;
begin
for v_emp in c loop
dbms_output.put_line('员工姓名是:'||v_emp.ename||'工资为:'||v_emp.sal);
end loop;
end;
根据用户输入的部门编号及其工作输出符合条件的员工姓名极其工资
declare
cursor c is select ename,sal from emp where deptno=&部门编号 and job=upper('&工作');
--工作是字符串型,所以要加''
begin
for v_emp in c loop
dbms_output.put_line('员工姓名是:'||v_emp.ename||'工资为:'||v_emp.sal);
end loop;
end;