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;

最新文章

  1. Cheatsheet: 2016 03.01 ~ 03.31
  2. HTTP 错误 500.21 - Internal Server Error
  3. JavaScript强化教程 - 六步实现贪食蛇
  4. 使用Process类重定向输出与错误时遇到的问题 (转)
  5. [整理]C#反射(Reflection)详解
  6. nginx找不到php文件
  7. python 中time.sleep没有作用
  8. centos install shutter (How to enable Nux Dextop repository on CentOS or RHEL)
  9. GIt/Github常用命令
  10. python自学笔记(九)python练习题
  11. 2016沈阳网络赛 odd-even number
  12. Windows环境下最新OpenCV和Contribute代码的联合编译
  13. Vue 事件
  14. js短路表达式
  15. The method queryForMap(String, Object...) from the type JdbcTemplate refers to the missing type DataAccessException
  16. unittest测试框架详谈及实操(二)
  17. 在 Docker 容器中运行应用程序
  18. Hibernte
  19. java中‘\&#39;和&#39;/&#39;的区别
  20. gitlab+jenkins+tomcat war包部署(此文有新版本)

热门文章

  1. C# HttpWebResponse下载限速
  2. CSS,让100%的宽度,自动减10,让100%的高度,自动减10,可以加减乘除
  3. win32Helper
  4. 了解 XML 数字签名
  5. Database time zone version is 18. It is older than current release time zone version 26
  6. 阿里Android开发手册正式版一览
  7. Delphi用Socket API实现路由追踪
  8. B/s发展情况真的可以用日新月异来形容
  9. delphi xe5 中TMemo控件的应用——for android
  10. C#调用记事本并填写内容