Oracle异常处理
在PL/SQL语句书写时,需要处理的异常
-- 不做异常处理时
DECLARE
v_name emp.ename%TYPE;
v_sal emp.sal%TYPE;
BEGIN
SELECT ename,sal
INTO v_name,v_sal
FROM emp
WHERE empno = &no;
IF v_sal <3000 THEN
DBMS_OUTPUT.PUT_LINE(v_name||'的工资是:'||v_sal);
END IF;
END;
在不做异常处理的时候,在输入员工编号的值的时候,如果在数据库中没有,就会报错

select * from emp;
--7369(empno) <3000(sal)
--7839 (empno) >3000

--Oracle的异常处理
DECLARE
v_name emp.ename%TYPE;
v_sal emp.sal%TYPE;
BEGIN
SELECT ename,sal
INTO v_name,v_sal
FROM emp
WHERE empno = &no;
IF v_sal <3000 THEN
DBMS_OUTPUT.PUT_LINE(v_name||'的工资是:'||v_sal);
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('员工号输入错误!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('其他错误!');
END;

--预定义异常处理
DECLARE
v_name emp.ename%TYPE;
v_sal emp.sal%TYPE:=&salary;
BEGIN
SELECT ename INTO v_name FROM emp WHERE sal = v_sal;
DBMS_OUTPUT.put_line(v_name||'的工资是:'||v_sal);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.put_line('没有该工资的员工');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.put_line('多个员工具有该工资');
WHEN OTHERS THEN
DBMS_OUTPUT.put_line('其他异常');
END;

SELECT * FROM EMP;
--800(sal), 一个员工
--1250 多个员工
--8000 0个员工

--获取异常的错误代码和错误信息
BEGIN
DELETE FROM DEPT WHERE deptno = &deptno;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.put_line(SQLCODE||'####'||SQLERRM);
END;

--非预定义异常的处理
DECLARE
--1:定义非预定义异常的标识符
e_fk EXCEPTION;
--2:将定义好的异常与Oracle错误建立关联
-- -2292错误代码
PRAGMA EXCEPTION_INIT(e_fk,-2292);
BEGIN
DELETE FROM DEPT WHERE deptno = &deptno;
EXCEPTION
--3:捕获并处理异常
WHEN e_fk THEN
DBMS_OUTPUT.PUT_LINE('此部门下有员工,不能删除此部门!');
WHEN OTHERS THEN
DBMS_OUTPUT.put_line(SQLCODE||'####'||SQLERRM);
END;

--自定义异常
DECLARE
v_empno emp.empno%TYPE:=&empno;
--1:定义异常
e_no_result EXCEPTION;
BEGIN
UPDATE emp SET sal = sal + 100 WHERE empno = v_empno;
IF SQL%NOTFOUND THEN
--2:指定触发异常的时机
RAISE e_no_result;
ELSE
COMMIT;
END IF;
EXCEPTION
--3:捕捉并处理异常
WHEN e_no_result THEN
DBMS_OUTPUT.put_line('数据更新失败!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('其他错误');
END;

--异常处理函数SQLCODE和SQLERRM的使用
DECLARE
v_empno emp.empno%TYPE:= &empno;
v_ename emp.ename%TYPE:= '&ename';
v_deptno emp.deptno%TYPE:= &deptno;
BEGIN
INSERT INTO emp(empno,ename,deptno)VALUES(v_empno,v_ename,v_deptno);
IF SQL%FOUND THEN
DBMS_OUTPUT.put_line('数据插入成功!');
COMMIT;
END IF;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.put_line('错误号:'||SQLCODE);
DBMS_OUTPUT.put_line('错误信息:'||SQLERRM);
END;

Oracle数据库---异常处理的更多相关文章

  1. Oracle数据库之PL/SQL异常处理

    Oracle数据库之PL/SQL异常处理 异常指的是在程序运行过程中发生的异常事件,通常是由硬件问题或者程序设计问题所导致的. PL/SQL程序设计过程中,即使是写得最好的程序也可能会遇到错误或未预料 ...

  2. Oracle 数据库语句大全

    Oracle数据库语句大全 ORACLE支持五种类型的完整性约束 NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值. CH ...

  3. Oracle数据库基础知识

    oracle数据库plsql developer   目录(?)[-] 一     SQL基础知识 创建删除数据库 创建删除修改表 添加修改删除列 oracle cascade用法 添加删除约束主键外 ...

  4. Oracle数据库开发

    Oracle数据库开发之PL/SQL基础实战视频课程 1 PL/SQL 简介 2 入门实例(一) 3 入门实例(二) 4 PL/SQL 变量和常量 5 PL/SQL数据类型(一) 6 PL/SQL数据 ...

  5. CentOS以及Oracle数据库发展历史及各版本新功能介绍, 便于构造环境时有个对应关系

    CentOS版本历史 版本 CentOS版本号有两个部分,一个主要版本和一个次要版本,主要和次要版本号分别对应于RHEL的主要版本与更新包,CentOS采取从RHEL的源代码包来构建.例如CentOS ...

  6. Oracle 存储过程异常处理

    Oracle 存储过程异常处理 1.异常的优点    如果没有异常,在程序中,应当检查每个命令的成功还是失败,如  BEGIN  SELECT ...  -- check for ’no data f ...

  7. Oracle数据库语句大全

    转自:http://blog.sina.com.cn/s/blog_b5d14e2a0101c56z.html ORACLE支持五种类型的完整性约束 NOT NULL (非空)--防止NULL值进入指 ...

  8. Oracle数据库之PL/SQL过程与函数

    Oracle数据库之PL/SQL过程与函数 PL/SQL块分为匿名块与命名块,命名块又包含子程序.包和触发器. 过程和函数统称为PL/SQL子程序,我们可以将商业逻辑.企业规则写成过程或函数保存到数据 ...

  9. Oracle数据库之PL/SQL程序设计简介

    PL/SQL程序设计简介 一.什么是PL/SQL? PL/SQL是 Procedure Language & Structured Query Language 的缩写. ORACLE的SQL ...

随机推荐

  1. XF 按钮控件

    <?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http:/ ...

  2. C/C++使用openssl进行摘要和加密解密(md5, sha256, des, rsa)

    openssl里面有很多用于摘要哈希.加密解密的算法,方便集成于工程项目,被广泛应用于网络报文中的安全传输和认证.下面以md5,sha256,des,rsa几个典型的api简单使用作为例子. 算法介绍 ...

  3. AY写给国人的教程- VS2017 Live Unit Testing[2/2]-C#人爱学不学-aaronyang技术分享

    原文:AY写给国人的教程- VS2017 Live Unit Testing[2/2]-C#人爱学不学-aaronyang技术分享 谢谢大家观看-AY的 VS2017推广系列 Live Unit Te ...

  4. delphi判断线程状态函数(使用GetExitCodeThread API函数去判断线程的句柄)

    //判断线程是否释放//返回值:0-已释放:1-正在运行:2-已终止但未释放://3-未建立或不存在 function CheckThreadFreed(aThread: TThread): Byte ...

  5. XE Delphi 判断字符为中文的方法

    在uses中添加System.AnsiStrings /// Param ch--字符串/// Param cno--字符位置 function IsZHChar(const ch: AnsiStri ...

  6. wpf事件绑定,比如一个控件的左键按下事件

    <i:Interaction.Triggers> <i:EventTrigger EventName="MouseLeftButtonDown"> < ...

  7. C#最基本的数据库增删改查

    namespace access { public partial class Form1 : Form { //定义数据库的连接路径 string txtConn ="Provider=M ...

  8. Application.StartupPath和System.Environment.CurrentDirectory的区别

    System.Environment.CurrentDirectory的含义是获取或设置当前工作路径,而Application.StartupPath是获取程序启动路径,表面上看二者没什么区别,但实际 ...

  9. Android零基础入门第63节:过时但仍值得学习的选项卡TabHost

    原文:Android零基础入门第63节:过时但仍值得学习的选项卡TabHost 由于前几天参加一个学习培训活动,几乎每天都要从早晨7点到晚上一两点,没有什么时间来分享,实在抱歉中间断更了几天.从今天开 ...

  10. 将后台窗口激活到前台的方法(使用AttachThreadInput和SetForegroundWindow两个API)

    下面这种方法是我见到的最理想的,还有一些其他的方法,像通过SetWindowsPos这个API设置窗口的Z-oder到最顶层,再设置回去.还有通过把当前窗口设置到底层,然后激活目标窗口等等方法. HW ...