目录
在emp表中对某部门的员工薪水增加100元,并显示本次更新操作共涉及了多少员工
声明一个游标,用于取得部门10的员工的姓名和薪水信息 用记录接收游标中的数据
显示游标 暂存查询取出的多行数据,然后一行一行地进行处理
使用步骤 :
①声明游标: cursor 游标名 is select 语句;
②打开游标:声明的游标必须打开后才能使用 open 游标名称;--相当于执行查询语句
③使用游标:一般在循环语句中使用fetch语句提取游标中的记录来进行操作
④关闭游标:游标使用完毕后,一定要关闭 close 游标名称;
declare
--定义游标
cursor mycursor is select * from emp;
my_emp emp%rowtype;
begin
--打开游标
open mycursor;
--读取游标
fetch mycursor into my_emp;
dbms_output.put_line(my_emp.ename||' '||my_emp.sal);
--关闭游标
close mycursor;
end;
在emp表中对某部门的员工薪水增加100元,并显示本次更新操作共涉及了多少员工
普通方法:
declare
dno number(4):=&d;
s number(4);
begin
update emp set sal=sal+100 where deptno=dno;
select count(*) into s from emp where deptno=dno;
dbms_output.put_line(s);
end;
隐式游标:由系统自动创建并管理
declare
dno number(4):=&d;
begin
update emp set sal=sal+100 where deptno=dno;
dbms_output.put_line(sql%rowcount);
end;
声明一个游标,用于取得部门10的员工的姓名和薪水信息 用记录接收游标中的数据
declare
v_name emp.ename%type;
v_sal emp.sal%type;
cursor my_cursor is select ename,sal from emp where deptno=10;
begin
open my_cursor;
loop
fetch my_cursor into v_name,v_sal;
exit when my_cursor%notfound;
dbms_output.put_line(v_name||' '||v_sal);
end loop;
close my_cursor;
end;
declare
type my_record is record (
v_name emp.ename%type,
v_sal emp.sal%type
);
cursor my_cursor is select ename,sal from emp where deptno=10;
my my_record;
begin
open my_cursor;
loop
fetch my_cursor into my.v_name,my.v_sal;
exit when my_cursor%notfound;
dbms_output.put_line(my.v_name||' '||my.v_sal);
end loop;
close my_cursor;
end;
参数游标:需要对某一字段进行多值查询
通过键盘录入,查询部门编号为10员工信息
declare
cursor my_cursor(d_no emp.deptno%type) is select ename,sal from emp where deptno=d_no;
v_name emp.ename%type;
v_sal emp.sal%type;
begin
open my_cursor(&a);
loop
fetch my_cursor into v_name,v_sal;
exit when my_cursor%notfound;
dbms_output.put_line(v_name||' '||v_sal);
end loop;
close my_cursor;
end;
查询某部门的员工姓名和薪水
declare
cursor my_cursor(d_no emp.deptno%type) is select ename,sal from emp where deptno=d_no;
v_name emp.ename%type;
v_sal emp.sal%type;
begin
open my_cursor(20);
loop
fetch my_cursor into v_name,v_sal;
exit when my_cursor%notfound;
dbms_output.put_line(v_name||' '||v_sal);
end loop;
close my_cursor;
end;
强型游标:
声明一个强型游标的变量
1. 有一个记录类型
2. 声明游标返回上面定义的记录类型
3. 声明一个强型游标变量
显示员工表中的姓名和工资记录
declare
--1. 有一个记录类型
type my_record is record(v_name emp.ename%type,v_sal emp.sal%type);
--2. 声明游标返回上面定义的记录类型
type my_coursor is ref cursor return my_record;
--3. 声明一个强型游标变量
my my_coursor;
my1 my%rowtype;
begin
open my for select ename,sal from emp;
loop
fetch my into my1;
exit when my%notfound;
dbms_output.put_line(my1.v_name||' '||my1.v_sal);
end loop;
close my;
end;
根据输入的字符确定显示哪一张表中的数据
declare
type my_coursor is ref cursor;
my my_coursor;
emprec emp%rowtype;
deptrec dept%rowtype;
v_input char(1):='&input';
begin
if upper(v_input)='E' then
open my for select * from emp;
loop
fetch my into emprec;
exit when my%notfound;
dbms_output.put_line(emprec.ename||' '||emprec.sal);
end loop;
elsif
upper(v_input)='D' then
open my for select * from dept;
loop
fetch my into deptrec;
exit when my%notfound;
dbms_output.put_line(deptrec.dname||' '||deptrec.loc);
end loop;
else
dbms_output.put_line(' 输入错误 ');
end if;
close my;
end;