今天学了异常处理

有预定义异常 与 用户自定义异常 还有 raise_application_error()函数raise_application_error() 只能把异常抛出而不能处理异常。

预定义异常包括

– NO_DATA_FOUND --没有找到数据

– TOO_MANY_ROWS --找到多行数据

– INVALID_CURSOR --失效的游标

– ZERO_DIVIDE --除数为零

– DUP_VAL_ON_INDEX –唯一索引中插入了重复值

预定义异常的示例:

declarev_id emp.empno%type; --声明变量

begin

select empno into v_id from emp where deptno =40;

exception--异常处理

when no_data_found then --no_data_found 是使用 select 某字段,然后 into 的时候,该字段没有出。

rollback;

dbms_output.put_line('没有40号部门记录');when too_many_rows then --too_many_rows 是使用 select 某字段,然后 into 的时候,该字段有多个值。

rollback;

dbms_output.put_line('返回多条记录');when others then --其它的异常出现

rollback;

dbms_output.put_line('出现其他错误.');end;

用户自定义异常就是用户定义一个异常情况,遇到这种情况再对这种情况进行处理

因为用户定义的异常不一定是Oracle返回的系统错误,系统不会自动触发,需要在声明部分定义。用户定义的异常处理部分基本上和预定义异常相同。

declaresalary_levelvarchar2(1);

invalid_salary_level exception;--声明异常

beginsalary_level := 'D';if salary_level not in ('A','B','C') thenraise invalid_salary_level;--触发异常

end if;

exception--异常处理

when invalid_salary_level thendbms_output.put_line('invalid salary level');end;

raise_application_error() 函数只是将异常抛出,不进行异常处理,并且终止程序。而用户自定义异常以及预定义异常不回终止程序,但会终止该 PL/SQL 代码块,所以一个存储过程中可以有多个 PL/SQL 代码块。

关于异常的语法及定义:

什么是异常:

PL/SQL用异常和异常处理器来实现错误处理

Oracle中出现错误的情形通常分为编译时错误(compile-time error)和运行时错误(run-time error)。

异常在PL/SQL执行过程中很可能出现

对异常如果不进行处理,异常可能会中断程序的运行

捕获异常的规则:

在异常部分WHEN 子句没有数量限制

当异常抛出后,控制无条件转到异常处理部分

EXCEPTION 关键词开始异常处理部分 WHEN OTHERS 为最后的一条子句

在异常块中,只有一个句柄会处理异常

关于异常捕获的函数:

SQLCODE 返回错误代码

SQLERRM 返回与错误代码关联的消息

保存任何非预期的异常的错误编码和错误消息

declarev_error_codeNUMBER;

v_error_messageVARCHAR2(255);BEGINEXCEPTIONWHEN OTHERS THEN

ROLLBACK;

v_error_code :=SQLCODE;

v_error_message :=SQLERRM;INSERT INTO err_logs VALUES(v_error_code, v_error_message);END;

异常的传播

PL/SQL中错误处理的步骤:

步骤1:如果当前块中有该异常的处理器,则执行该异常处理语句块,然后控制权传递到外层语句块 步骤2:如果没有当前异常的处理器,把该异常传播给外层块。然后在外层执行步骤1:如果此语句在最外层语句块,则该异常将被传播给调用环境

没有处理的异常将沿检测异常调用程序传播到外面,当异常被处理并解决或到达程序最外层传播停止。异常是自里向外逐级传递的。

小题:

1.根据员工号,获得员工到目前为止参加工作年限(保留到整数),员工号不存在时提示“此员工号不存在”。

create or replace functionget_workyear

(v_idin emp.empno%type)return varchar2

ISv_workyearinteger;BEGIN

select to_char(sysdate,'yyyy')-to_char(hiredate,'yyyy') --两个数字字符串相减的值存到整数型变量中

intov_workyearfromempwhere emp.empno =v_id;returnv_workyear;

EXCEPTIONwhen no_data_found thendbms_output.put_line('此员工号不存在');return -1;END get_workyear;

2.

①建表myemp。该表内容与emp一致;

②建存储过程。存储过程要的参数,和表里的字段一一对应。比如,表里有empno,存储过程就要有一个参数对应这字段i_empno,类型肯定和empno一样,如果你知道类型是number(4),就直接写成(i_empno in number(4),...)以此类推.

③功能实现,根据empno判断,如果myemp表里已经有这个empno,你就根据你传入的信息把empno的信息更新了,如果没有,就把你这些传入的字段,插入到表里,

eg:我只用两个字段来说明:empno、sal

入参1:123,1000,经过��断,myemp表里没有123这个empno,那么执行完存储过程,这个信息要插入到表里;

入参2:7369,2000,经判断,表里已经有这个编号,但sal为800,那么执行完存储过程,7369的sal更新为2000;

create or replace procedurestore_info

(v_empnoin myemp.empno%type,

v_enamein myemp.ename%type,

v_jobin myemp.job%type,

v_mgrin myemp.mgr%type,

v_hiredatein myemp.hiredate%type,

v_salin myemp.sal%type,

v_commin myemp.comm%type,

v_deptnoin myemp.deptno%type

)ISv_id myemp.empno%type:=0;BEGIN

select count(*) intov_idfrommyempwhere myemp.empno =v_empno;if (v_id=0) then

insert intomyemp(empno, ename, job, mgr, hiredate, sal, comm, deptno)values(v_empno,v_ename,v_job,v_mgr,v_hiredate,v_sal,v_comm,v_deptno);else

updatemyempset myemp.ename=nvl(v_ename,myemp.ename) , myemp.job=nvl(v_job,myemp.job),

myemp.mgr=nvl(v_mgr,myemp.mgr) , myemp.hiredate=nvl(v_hiredate,myemp.hiredate),

myemp.sal=nvl(v_sal,myemp.sal) , myemp.comm=nvl(v_comm,myemp.comm),

myemp.deptno=nvl(v_deptno,myemp.deptno)where myemp.empno =v_empno ;end if;ENDstore_info;beginstore_info(7369,null,null,null,null,2000,null,null);end;

结果

【注意】:

为什么要把这一题关于存储过程的题放到这里?

因为我起初用异常处理部分来写这一题......,这是不规范的。

本题中用到 count() 函数,count() 是用来计算满足条件的行数的,count(*) 计算所有的行,包括空值。

用异常处理来写本题的代码:

create tablemyemp(empno, ename, job, mgr, hiredate, sal, comm, deptno)as

selectempno, ename, job, mgr, hiredate, sal, comm, deptnofromemp;create or replace procedurestore_info

(v_empnoin myemp.empno%type,

v_enamein myemp.ename%type,

v_jobin myemp.job%type,

v_mgrin myemp.mgr%type,

v_hiredatein myemp.hiredate%type,

v_salin myemp.sal%type,

v_commin myemp.comm%type,

v_deptnoin myemp.deptno%type

)ISv_id myemp.empno%type;BEGIN

select myemp.empno intov_idfrommyempwhere myemp.empno =v_empno;updatemyempset myemp.ename=v_ename, myemp.job=v_job,myemp.mgr=v_mgr,

myemp.hiredate=v_hiredate, myemp.sal=v_sal,

myemp.comm=v_comm,myemp.deptno=v_deptnowhere myemp.empno =v_id;

EXCEPTIONwhen no_data_found then

insert intomyemp(empno, ename, job, mgr, hiredate, sal, comm, deptno)values(v_empno,v_ename,v_job,v_mgr,v_hiredate,v_sal,v_comm,v_deptno);END store_info;

3.

编写PL/SQL块,使用SELECT语句将管理者编号为空的员工的姓名及工作编号显示出来,如果符合条件的员工多于一人,则返回字符串“最高管理者人员过多!”字符串,如果找到没有符合条件的记录,则返回字符串“没有最高管理者,请指定”

代码:

declareo_ename emp.ename%type;

o_empno emp.empno%type;

v_id emp.empno%type;begin

select emp.empno intov_idfromempwhere emp.mgr is null;select emp.ename into o_ename from emp where emp.empno =v_id;select emp.empno into o_empno from emp where emp.empno =v_id;

dbms_output.put_line('员工姓名:'||o_ename||','|| '员工编号:'||o_empno);

exceptionwhen no_data_found thendbms_output.put_line('没有最高管理者,请指定');when too_many_rows thendbms_output.put_line('最高管理者人员过多');end;

4.获得每个部门的平均工资,如果平均工资大于2000,视为用户定义的异常,提示“该部门的平均工资过高”。

declare

cursorcempis

select dept.dname,avg(sal)fromemp,deptwhere emp.deptno =dept.deptnogroup byemp.deptno ,dept.dname;

v_dname dept.dname%type ;

v_asal emp.sal%type ;

too_high_sal exception;begin

opencemp;

loop--打开循环

fetch cemp intov_dname,v_asal;exit when cemp%notfound;begin --这里写了一个 PL/SQL 代码块,里面可以做异常处理

if v_asal > 2000 thenraise too_high_sal;end if;

exception--异常处理,会终止此代码块。进入下一次循环

when too_high_sal thendbms_output.put_line(v_dname||'该部门工资过高');end;endloop;close cemp;--注意end loop 与 close cemp 的先后顺序。必须是先结束循环,再关闭游标。

end;

附一张图:

linux oracle异常处理,Oracle SQL 异常处理相关推荐

  1. linux python连接oracle数据库_Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法...

    本文档主要描述了Linux下python数据库驱动的安装和配置,用来实现在Linux平台下通过python访问MySQL.Oracle.SQL Server数据库. 其中包括以下几个软件的安装及配置: ...

  2. PL/SQL developer 导入Excel数据到linux安装的Oracle中文乱码问题

    解决oracle中文显示乱码有三层地方需要调整或者修改 第一层:操作系统层 locale -a 查看操作系统是否安装了中文字符集 2.设置用户的中文字符集 查看到linux安装了中文字符集,那么ora ...

  3. PL/SQL异常处理(原创)

    Exception概述 Exception是一种PL/SQL标识符,当运行的PL/SQL块出现错误或警告,则会触发异常处理.为了提高程序的健壮性,可以在PL/SQL块中引入异常处理部分,进行捕捉异常, ...

  4. 【oracle】oracle经典sql,exception,database link纠错

    [oracle]oracle经典sql,exception,database link纠错 1111-01 oracle经典sql,exception,database link纠错 1.给表tabl ...

  5. oracle 12c sql图形化,Oracle 12c PL/SQL程序设计终极指南

    Oracle 12c PL/SQL程序设计终极指南 作者:孙风栋;王澜;郭晓惠 出版日期:2015年06月 文件大小:11.73M 支持设备: ¥60.00在线试读 适用客户端: 言商书局 iPad/ ...

  6. PL/SQL异常处理

    As we all known,程序的错误一般分为两类:编译错误和运行时错误.其中运行时错误被称为异常.PL/SQL语句块中处理异常的部分即为异常处理部分.在异常处理部分,可以指定当特定异常发生时所采 ...

  7. Oracle -- DBA常用SQL

    Oracle DBA常用SQL 监控SQL 1.监控事例的等待: select event,sum(decode(wait_time,0,0,1)) prev, sum(decode(wait_tim ...

  8. oracle基础之sql基础知识

    1. sql(Structured Query Language)是关系型数据库的基本操作语言. 包括数据库查询(Data Query),数据操纵(Data Manipulation),数据定义(Da ...

  9. Oracle之PL/SQL编程从入门到精通-文心-专题视频课程

    Oracle之PL/SQL编程从入门到精通-23941人已学习 课程介绍         本课程基于Oracle数据库,讲解PL/SQLl编程方面的技能,通过本课程的学习,学员能在短的时间内掌握Ora ...

  10. xp系统安装oracle乱码,linux中安装Oracle汉字乱码完整解决方案

    一. 安装JDK 在/tmp下建立一个临时的文件夹 # cd /tmp # mkdir javacn # cd javacn 从网上搜索下载j2sdk-1_4_2_02-linux-i586.bin并 ...

最新文章

  1. Dynamics 365 for CRM: Sitemap站点图的可视化编辑功能
  2. 使用swipemenulistview实现列表的左右滑动
  3. 中国市场新财富与新人群趋势
  4. cmd xcopy 拷贝文件夹_在纯dos下用xcopy命令怎么复制文件夹
  5. c++ 实现ping
  6. CCleaner系统优化
  7. MSP430G2553电子时钟实验
  8. 省A类竞赛二等奖--村先游项目VUE前端重构
  9. github 思维导图开元软件_最强大脑!这 7 款开源思维导图工具真的很神奇
  10. 9个免费可商用的字体推荐
  11. 点进来看看,这篇文章告诉你什么软件可以识别PDF中的文字!
  12. 旧项目归档:旅游年卡-旅游直通车-微信二级分销推广会员-汽车租赁-金币提现-司机乘务管理-景点线路乘车预约
  13. centos 7.6 安装mariadb
  14. go 学习笔记之学习函数式编程前不要忘了函数基础
  15. 多多参谋参谋|拼多多店群什么产品容易成为爆款呢|魔店分享
  16. As I Please--PartⅠ
  17. [动态规划] 区间DP
  18. Matlab实现图书管理系统
  19. 雪亮工程、平安城市以及天网工程这三者有什么区别?
  20. 如何有效清理C盘?清除Windows更新后残留文件?磁盘清理?

热门文章

  1. Java字节码深入解析
  2. python 中locals() 和 globals()的区别
  3. LeetCode Encode and Decode TinyURL
  4. THD 变量存入threads中
  5. 将一个数的字节顺序逆置
  6. java二维码小试牛刀
  7. checkboxlist详细用法、checkboxlist用法、checkboxlist
  8. 《财产》评最受尊重公司:苹果第一谷歌第二
  9. GitHub上传文件的过滤规则 -- windows下
  10. Linux工作笔记022---查看Centos 内核版本号