游标是一种PL/SQL控制结构;可以对SQL语句的处理进行显示控制,便于对表的行数据逐条进行处理。游标并不是一个数据库对象,只是存留在内存中。
由于使用游标有许多种方法,这里只挑选较常用的进行介绍。对应的表都是oracle安装时自带的表。
操作步骤: • 声明游标 • 打开游标 • 取出结果,此时的结果取出的是一行数据 • 关闭游标
到底那种类型可以把一行的数据都装进来
• 此时使用ROWTYPE类型,此类型表示可以把一行的数据都装进来。
如:例如:查询雇员编号为7369的信息(肯定是一行信息)。
declare
eno emp.empno%type;
empinfo emp%rowtype;
begin
eno:=&en;
select * into empinfo from emp where empno=eno;
dbms_output.put_line('no:'||empinfo.empno);
dbms_output.put_line('name:'||empinfo.ename);
end;
/
--使用for循环操作游标(比较常用)
declare
cursor mycur1 is select * from emp ;
empinfo emp%rowtype;
cou number;
begin
for empinfo in mycur1 loop
cou:=mycur1%rowcount; -- 序号
dbms_output.put_line(cou);
dbms_output.put_line('no:'||empinfo.empno);
dbms_output.put_line('name:'||empinfo.ename);
end loop;
end;
/
--再看例子
一次性上涨全部雇员的工资。根据它所在的部门涨工资,规则:
• 10部门上涨10%
• 20部门上涨20%
• 30部门上涨30%
所有部门的上涨工资,最不能超过5000,如果超过5000,则工资就为5000。
declare
cursor mycur2 is select * from emp;
empinfo emp%rowtype;
s emp.sal%type;
begin
for empinfo in mycur2 loop
if empinfo.deptno=10 then
s:=empinfo.sal*1.1;
elsif empinfo.deptno=20 then
s:=empinfo.sal*1.2;
elsif empinfo.deptno=30 then
s:=empinfo.sal*1.3;
end if;
if s>5000 then
s:=5000;
end if;
update emp set sal=s where empno=empinfo.empno;
end loop;
end;
/
--函数就是一个有返回值的过程。
--定义一个函数:此函数可以根据雇员的编号查询出雇员的年薪
create or replace function myfun1(eno emp.empno%type) return number
as
rsal number;
begin
select (sal+nvl(comm,0))*12 into rsal from emp where empno=eno;
return rsal;
end;
/
直接写SQL语句,调用此函数:
select myfun1(7369) from dual;