oracle游标
2015-08-15 16:38
721 查看
DECLARE
-- 声明游标
CURSOR mycur IS SELECT * FROM emp;
empInfo emp%ROWTYPE;
cou NUMBER;
BEGIN
-- 游标操作使用循环,但是在操作之前必须先将游标打开
FOR empInfo IN mycur LOOP
cou := mycur%ROWCOUNT;
DBMS_OUTPUT.put_line(cou || '雇员编号:' || empInfo.empno);
DBMS_OUTPUT.put_line(cou || '雇员姓名:' || empInfo.ename);
END LOOP;
END;
ROWTYPE 类型,此类型表示可以把一行的数据都装进来。
emp%ROWTYPE;标示把emp一行的数据都装进来
DECLARE
-- 声明游标
CURSOR mycur IS
SELECT * FROM emp; -- List (EmpPo)
empInfo emp%ROWTYPE;
BEGIN
-- 游标操作使用循环,但是在操作之前必须先将游标打开
OPEN mycur;
-- 使游标向下一行
FETCH mycur INTO empInfo;
-- 判断此行是否有数据被发现 mycur%FOUND相当于resultset.hasNext() 判断是否有下一个
WHILE (mycur%FOUND) LOOP
DBMS_OUTPUT.put_line('雇员编号:' || empInfo.empno);
DBMS_OUTPUT.put_line('雇员姓名:' || empInfo.ename);
-- 修改游标,继续向下
FETCH mycur INTO empInfo;----相当于result.next()
END LOOP;
END;
===========================================
也可以使用另外一种方式循环游标:LOOP…END LOOP;
DECLARE
-- 声明游标
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;
相关文章推荐
- Oracle中OEM的启动与关闭
- 批处理打开和关闭oracle11g 服务
- oracle创建user具体指示
- ORA-04031: 无法分配 3936 字节的 共享内存
- Oracle存储过程完整结构讲解
- Oracle 11gR2单实例数据库补丁升级记录
- oracle sql分组合并
- Oracle中查询前10条记录
- c# 连接oracle 读取数据
- 检索06 - Oracle MySql SqlSever之间的区别和优缺点
- oracle用户创建及权限设置
- 浅说两种输出Oracle字符文件的方法
- Oracle触发器
- 收藏:oracle中比较两表表结构差异和数据差异的方法
- oracle学习笔记(六)
- Oracle逻辑存储结构1—概述
- Oracle优化:大量数据插入或更新
- oracle表连接——处理连接过程中另外一张表没有相关数据不显示问题
- oracle的正则表达式
- Oracle常用函数