CURSOR mycur IS SELECT * FROM emp ;
empInfo emp%ROWTYPE ;
BEGIN
-- 游标操作使用循环,但是在操作之前必须先将游标打开
OPEN mycur ;
LOOP
-- 使游标向下一行
FETCH mycur INTO empInfo ;
EXIT WHEN mycur%NOTFOUND ;
DBMS_OUTPUT.put_line('雇员编号:'||empInfo.empno) ;
DBMS_OUTPUT.put_line('雇员姓名:'||empInfo.ename) ;
END LOOP ;
END ;
/
注意 1:
在打开游标之前最好先判断游标是否已经是打开的。
通过 ISOPEN 判断,格式:游标%ISOPEN
IF mycur%ISOPEN THEN
null ;
ELSE
OPEN mycur ;
END IF ;
注意 2:
可以使用 ROWCOUNT 对游标所操作的行数进行记录。
DECLARE
-- 声明游标
CURSOR mycur IS SELECT * FROM emp ;
empInfo emp%ROWTYPE ;
cou NUMBER ;
BEGIN
-- 游标操作使用循环,但是在操作之前必须先将游标打开
IF mycur%ISOPEN THEN
null ;
ELSE
OPEN mycur ;
END IF ;
LOOP
-- 使游标向下一行
FETCH mycur INTO empInfo ;
EXIT WHEN mycur%NOTFOUND ;
cou := mycur%ROWCOUNT ;
DBMS_OUTPUT.put_line(cou||'雇员编号:'||empInfo.empno) ;
DBMS_OUTPUT.put_line(cou||'雇员姓名:'||empInfo.ename) ;
END LOOP ;
END ;
一次性上涨全部雇员的工资。根据它所在的部门涨工资,规则:
• 10 部门上涨 10%
• 20 部门上涨 20%
• 30 部门上涨 30%
所有部门的上涨工资,最不能超过 5000,如果超过 5000,则工资就为 5000。
declare
cursor mycur is select * from emp;
empInfo emp%rowtype;
s emp.sal%type;
begin
for empInfo in mycur 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;