Oracle Day 08 游标与例外的总结
1.游标的使用(cursor)
基本格式:
定义游标: cursor 游标名 is select语句(查询要操作的数据);
自定义参数:参数名1 对应表中的字段1;
参数名2 对应表中的字段2;
打开游标: open 游标名;
loop(循环)
fetch ... into ...; 抓取一行到自定义变量里面
exit when ...%notfound; 退出循环的条件
具体操作...
end loop; 关闭循环
关闭游标: close 游标名;
例:
declare
cursor cemp is select job,sal from emp; ###定义了一个名称是cemp的游标,游标中的数据是select job,sal from emp;中查询出的数据
cjob emp.job%type; ###定义变量cjob,对应emp表中的job字段
csal emp.sal%type; ###定义变量csal,对应emp表中的sal字段
begin
open cemp; ###打开游标
loop ###循环
fetch cemp into cjob,csal; ###抓取游标中的一行数据赋值给变量cjob,csal
exit when cemp%notfound; ###退出条件:cemp%notfound表示游标没有抓取到数据了
dbms_output.put_line('您的工作为' || cjob || '您的工资为' || csal); ###具体操作:打印工作、工资
end loop; ###结束循环
close cemp; ###关闭游标
end;
/
-- 游标的四个属性
1). %isopen 判断游标是否打开
2). %rowcount 影响的行
3). %found 还有下一条数据
4). %notfound 没有下一条数据
例: --根据emp表员工的职位涨工资,总裁涨1000,经理涨800,其他涨400。
declare
cursor cemp is select empno,job from emp;
pempno emp.empno%type;
pjob emp.job%type;
begin
open cemp;
loop
fetch cemp into pempno,pjob;
exit when cemp%notfound;
if pjob ='PRESIDENT' then update emp set sal = sal + 1000 where empno = pempno;
elsif pjob='MANAGER' then update emp set sal = sal + 800 where empno = pempno;
else
update emp set sal = sal + 400 where empno = pempno;
end if;
end loop;
close cemp;
end;
/
注意:elsif 的书写。
-- 带参数的游标
例: -- 要查询emp表任意部门的员工信息。(10号部门)
declare
cursor cemp(pdeptno number) is select empno,ename from emp where deptno = pdeptno;
pempno emp.empno%type;
pname emp.ename%type;
begin
open cemp(10);
loop
fetch cemp into pempno,pname;
exit when cemp%notfound;
dbms_output.put_line(pempno || ' ' || pname );
end loop;
close cemp;
end;
/
2.例外(exception)
例:
1 declare
2 pnum number := 0;
3 begin
4 pnum := 1/pnum; -- 会抛出一个叫zero_divide的异常
5* end;
6 /
declare
*
第 1 行出现错误:
ORA-01476: 除数为 0
ORA-06512: 在 line 4
自定义一个例外(异常)
1 declare
2 pnum number := 0;
3 begin
4 pnum := 1/pnum; -- 会跑出一个叫zero_divide的异常
5 exception
6 when zero_divide then dbms_output.put_line('不能被0除');
7* end;
SQL> /
不能被0除
例: -- 查询50号部门的所有员工的姓名,如果没有查到数据抛出列外。
1 declare
2 cursor cemp is select ename from emp where deptno = 50;
3 pname emp.ename%type;
4 -- 自己定义异常
5 not_emp_data exception;
6 begin
7 open cemp;
8 fetch cemp into pname;
9 if cemp%notfound then
10 dbms_output.put_line('');
11 raise not_emp_data;
12 else
13 loop
14 exit when cemp%notfound;
15 dbms_output.put_line(pname);
16 end loop;
17 end if;
18 close cemp;
19 exception
20 when not_emp_data then dbms_output.put_line('没有找到50号部门的数据');
21* end;
SQL> /
11
没有找到50号部门的数据
Oracle Day 08 游标与例外的总结的更多相关文章
- (转)oracle 存储过程 带游标作为OUT参数输出
(转)oracle 存储过程 带游标作为OUT参数输出 存储过程返回OUT参数的游标 例子. 包中带过程 要自己定义一个type [cur_name] is ref cursor游标,返回的时候就直接 ...
- oracle 中的游标
oracle 中的游标 通俗易懂的sql代码直接上! --简单的游标使用滴呀 --使用FOR OBJ IN OBJS LOOP ......END LOOP; DECLARE CURSOR C_JOB ...
- Oracle中使用游标转换数据表中指定字段内容格式(拼音转数字)
应用场景:将数据表TB_USER中字段NNDP的内容中为[sannanyinv]转换为[3男1女] 主要脚本:一个游标脚本+分割字符串函数+拼音转数字脚本 操作步骤如下: 1.创建类型 create ...
- Oracle中使用游标获取指定数据表的所有字段名对应的字符串
操作步骤:打开PLSQL Developer后,直接执行下面的语句就可以出来 --Oracle中使用游标获取指定数据表的所有字段名对应的字符串 declare mytablename VARCHAR( ...
- oracle超出打开游标的最大数的原因和解决方案
oracle超出打开游标的最大数的原因和解决方案 分类: Oracle相关2012-06-05 10:36 6362人阅读 评论(0) 收藏 举报 oracle数据库sqljavasessionsys ...
- Java调用oracle存储过程通过游标返回临时表数据
注:本文来源于 < Java调用oracle存储过程通过游标返回临时表数据 > Java调用oracle存储过程通过游标返回临时表数据 项目开发过程中,不可避免的会用到存储过程返回结 ...
- oracle存储过程和游标的使用
oracle存储过程和游标的使用 (2011-04-19 14:52:47) 转载▼ 游标: 用来查询数据库,获取记录集合(结果集)的指针,我们所说的游标通常是指显式游标,因此从现在起没有特别指明的情 ...
- Oracle中的游标(转)
Oracle中的游标有两种:显式游标.隐式游标.显示游标是用cursor...is命令定义的游标,它可以对查询语句(select)返回的多条记录进行处理,而隐式游标是在执行插入 (insert).删除 ...
- Oracle存储过程、游标、函数
SQL99是什么 (1)是操作所有关系型数据库的规则 (2)是第四代语言 (3)是一种结构化查询语言 (4)只需发出合法合理的命令,就有对应的结果显示 SQL的特点 (1)交互性强,非过程化 (2)数 ...
随机推荐
- tornado + supervisor + nginx + linux 亲身体验
先说说思路 一.安装这些东西,tornado, supervisor( sudo pip install supervisor 在linux 系统上), 安装 nginx (sudo apt-ge ...
- C#中WindowsForm常见控件的运用
C#中WindowsForm常见控件的运用 -- 1.button(曹操,贡天子以令不臣): 属性;text:我们经常可以看见将按钮命名为“登入”,在其属性面板里面编辑text即可:如下图: ...
- 终于说再见了!Google Reader
终于说再见了!Google Reader 投递人 itwriter 发布于 2013-07-02 13:28 评论(5) 有760人阅读 原文链接 [收藏] « » 今天 15:00 左右,Go ...
- snmpwalk高延时问题分析
问题出现 有两台物理机,一台是192.168.1.15,另一台是192.168.1.43.二者的netsnmp版本相同. 使用snmpwalk去访问两台机器,获取tcp重传数(tcpRetransSe ...
- 读书笔记:《HTML5开发手册》Web表单
这是补充HTML5基础知识的第五篇内容,其他为: 一.HTML5-- 新的结构元素 二.HTML5-- figure.time.details.mark 三.HTML5-- details活学活用 四 ...
- 开发人员如何上google查资源,如果浏览国外资源方法
启动浏览器后15秒左右,浏览器的右上角就会出现图标 启用防火墙功能(右上角墙形图标),这时候程序就会去寻找网上代理,从而达到访问GOOGLE的效果,提示如果不访问google网站,可再点击一下关闭防火 ...
- 背水一战 Windows 10 (39) - 控件(布局类): VariableSizedWrapGrid, Border, Viewbox, SplitView
[源码下载] 背水一战 Windows 10 (39) - 控件(布局类): VariableSizedWrapGrid, Border, Viewbox, SplitView 作者:webabcd ...
- CMD杀进程 例如:杀8080端口的进程
首先:端口被占用的报错形式如下 说明8080端口被占用 解决方案一:查找pid,根据pid去任务管理器的进程中结束占用8080端口号的进程 1.首先按快捷键windows+R,在运行框里输入cmd,如 ...
- glib实践篇:接口定义与实现
前言: 在上一篇讲解了基于glib实现抽象和继承后,当然这篇就得讲讲接口类型啦! 在JAVA中接口更多的弥补了其单继承所带来的缺陷,使其能够扩展很多功能,同时又不破坏它的结构.其实接口就是一种协议,在 ...
- linux 查看磁盘占用情况
查看"/usr/local/"路径下,所有文件大小总和.只列出总和,不显示该路径下各子文件的大小. du -sh /usr/local/ 结果显示如下图: 如果要详细显示出各子文件 ...