Oracle异常处理

转载自:http://fengshen-xia.iteye.com/blog/745204
  1. --异常处理---------------------------------------------------------//     
  2. --预定义异常     
  3.     --NO_DATA_FOUND     没有数据满足查询要求     
  4.     --ZERO_DIVIDE       算术错误,如试图用0去除一个数     
  5.     --INVALID_NUMBER    在要求数据的地方使用了非数据     
  6.     --NOT_LOGGED_ON     没有连接上Oracle     
  7.     --TOO_MANY_ROWS     SELECT INTO 返回多行记录     
  8.     --VALUE_ERROR       遇到算术的、转换的、截去的或约束错误     
  9.     --CURSOR_ALREADY_OPEN   试图打开一个已经打开的游标     
  10.     --DUP_VAL_ON_INDEX  试图插入一个已经存在的唯一约束值     
  11.     --LOGIN_DENIED      要求进入系统的请求被拒绝     
  12.     --TIMEOUT_ON_RESOURCE   等待的系统时间已经超时     
  13.     --OTHERS        其它异常     
  14.     
  15. --NO_DATA_FOUND 异常-----------------------------------------------//     
  16. --%TYPE是指定义一个变量和数据库中某个表的某个字段的数据类型一样     
  17. DECLARE     
  18.     v_name emp.ename%TYPE;     
  19. BEGIN     
  20.     SELECT ename INTO v_name FROM emp WHERE empno='1234';  --异常发生,empno 中没有1234    
  21.     DBMS_OUTPUT.PUT_LINE('Name is : ' || v_name);     
  22. EXCEPTION     
  23.     WHEN NO_DATA_FOUND THEN     
  24.         DBMS_OUTPUT.PUT_LINE('No Data Found');     
  25.     WHEN OTHERS THEN     
  26.         DBMS_OUTPUT.PUT_LINE('Unknown Error');     
  27. END;     
  28. /     
  29. --ZERO_DIVIDE 异常-------------------------------------------------//     
  30. BEGIN     
  31.     DBMS_OUTPUT.PUT_LINE(5/0);  --异常发生,不能被0除     
  32. EXCEPTION     
  33.     WHEN ZERO_DIVIDE THEN     
  34.         DBMS_OUTPUT.PUT_LINE('Can not divide zero');     
  35.     WHEN OTHERS THEN     
  36.         DBMS_OUTPUT.PUT_LINE('Unknown Error');     
  37. END;     
  38. /     
  39. --TOO_MANY_ROWS 异常-----------------------------------------------//     
  40. DECLARE     
  41.     no emp.empno%TYPE;     
  42.     name emp.ename%TYPE;     
  43.     dept emp.deptno%TYPE;     
  44. BEGIN     
  45.     SELECT empno,ename,deptno INTO no,name,dept FROM emp WHERE empno = 7369;     
  46.     DBMS_OUTPUT.PUT_LINE('员工号 :' || no);     
  47.     DBMS_OUTPUT.PUT_LINE('员工名 :' || name);     
  48.     DBMS_OUTPUT.PUT_LINE('部门号 :' || dept);     
  49. EXCEPTION     
  50.     WHEN NO_DATA_FOUND THEN     
  51.         DBMS_OUTPUT.PUT_LINE('7369雇员不存在');  --未找到数据     
  52.     WHEN TOO_MANY_ROWS THEN     
  53.         DBMS_OUTPUT.PUT_LINE('有多个学员号是7369');  --返回多行     
  54.     WHEN OTHERS THEN     
  55.         DBMS_OUTPUT.PUT_LINE('Unknown Error');     
  56. END;     
  57. /     
  58. --DUP_VAL_ON_INDEX 异常--------------------------------------------//     
  59. BEGIN     
  60.     INSERT INTO emp     
  61.     VALUES('7788','LaoZhao','Soft','7689','03-12月-81','2600','0','20');     
  62. EXCEPTION     
  63.     WHEN DUP_VAL_ON_INDEX THEN     
  64.         DBMS_OUTPUT.PUT_LINE('违反了PRIMARY KEY约束:7788雇员已经存在');     
  65.     WHEN OTHERS THEN     
  66.         DBMS_OUTPUT.PUT_LINE('Unknown Error');     
  67. END;     
  68. /     
  69. -------------------------------------------------------------------//     
  70. --如果员工7788的工资小于3000,则更新为3000,如未找到该雇员,则利用异常处理打印相应信息     
  71. DECLARE     
  72.     salary emp.sal%TYPE;     
  73. BEGIN     
  74.     SELECT sal INTO salary FROM emp WHERE empno='7788';     
  75.     IF salary < 3000 THEN     
  76.         UPDATE emp SET sal = '3000' WHERE empno = '7788';     
  77.         DBMS_OUTPUT.PUT_LINE('记录已更新');     
  78.     ELSE     
  79.         DBMS_OUTPUT.PUT_LINE('IF 条件不成立');     
  80.     END IF;     
  81. EXCEPTION     
  82.     WHEN NO_DATA_FOUND THEN     
  83.         DBMS_OUTPUT.PUT_LINE('7788雇员不存在');     
  84.     WHEN OTHERS THEN     
  85.         DBMS_OUTPUT.PUT_LINE('Unknown Error');     
  86. END;     
  87. /     
  88.     
  89. --用户自定义异常---------------------------------------------------//     
  90. --001    
  91. DECLARE     
  92.     --v_num1 NUMBER:=5;     
  93.     v_num1 NUMBER:=0;     
  94.     --v_num2 NUMBER:=0;     
  95.     v_num2 NUMBER:=5;     
  96.     MyException EXCEPTION;     
  97. BEGIN     
  98.     DBMS_OUTPUT.PUT_LINE(v_num1/v_num2);         
  99.         RAISE MyException;  --引发自定义异常     
  100.          
  101.     DBMS_OUTPUT.PUT_LINE('OK');  --此句永远不会执行,因为发生异常后程序将直接跳到EXCEPTION段    
  102. EXCEPTION     
  103.     WHEN MyException THEN     
  104.         DBMS_OUTPUT.PUT_LINE('Cannot Divide Zero');     
  105.     --WHEN ZERO_DIVIDE THEN     
  106.     --  DBMS_OUTPUT.PUT_LINE('Can not Divide Zero');     
  107.     WHEN OTHERS THEN     
  108.         DBMS_OUTPUT.PUT_LINE('Unknown Error');     
  109. END;     
  110. /     
  111. --002    
  112. DECLARE     
  113.     id score.id%TYPE;     
  114.     java score.java%TYPE;     
  115.     MyException EXCEPTION;     
  116. BEGIN     
  117.     SELECT id,java INTO id,java FROM score WHERE id = 4;     
  118.     IF java < 0 OR java > 100 THEN     
  119.         RAISE MyException;     
  120.     ELSE     
  121.         DBMS_OUTPUT.PUT_LINE('OK');     
  122.     END IF;     
  123.     
  124. EXCEPTION     
  125.     WHEN MyException THEN     
  126.         UPDATE score SET java=0 WHERE id = 4;     
  127.         DBMS_OUTPUT.PUT_LINE('分数不能大于100或小于0,现已经清0');     
  128.     WHEN OTHERS THEN     
  129.         DBMS_OUTPUT.PUT_LINE('Unknown Error');     
  130. END;     
  131. /     
  132. --003    
  133. DECLARE     
  134.     v_date emp.hiredate%TYPE;     
  135.     MyException EXCEPTION;     
  136. BEGIN     
  137.     INSERT INTO emp(empno,hiredate)     
  138.         VALUES(1111,TO_DATE('2010-12-25','yyyy-mm-dd'));     
  139.     COMMIT;     
  140.     SELECT hiredate INTO v_date FROM emp WHERE empno=1111;     
  141.     IF v_date > SYSDATE THEN     
  142.         RAISE MyException;     
  143.     END IF;     
  144.     DBMS_OUTPUT.PUT_LINE('执行完毕');     
  145. EXCEPTION     
  146.     WHEN MyException THEN     
  147.         DBMS_OUTPUT.PUT_LINE('雇用日期不能大于当前日期');     
  148.         --raise_application_error(-20002,'雇用日期不能大于当前日期');     
  149.         UPDATE emp SET hiredate = SYSDATE WHERE empno = 1111;     
  150.         DBMS_OUTPUT.PUT_LINE('日期已更新为当前日期');     
  151.     WHEN OTHERS THEN     
  152.         DBMS_OUTPUT.PUT_LINE('Unknown Error');     
  153. END;     
  154. /     
  155.     
  156. --将定义好的异常与标准的ORACLE错误联系起来-------------------------//     
  157. --001    
  158. DECLARE     
  159.     MyException EXCEPTION;     
  160.     PRAGMA EXCEPTION_INIT(MyException,-00001);  --关联语句     
  161. BEGIN     
  162.     INSERT INTO emp(empno) VALUES(1234);  --发生异常,企图插入有Check约束的重复值     
  163.     COMMIT;  --插入后提交     
  164.     DBMS_OUTPUT.PUT_LINE('插入正常');     
  165. EXCEPTION     
  166.     WHEN MyException THEN     
  167.         DBMS_OUTPUT.PUT_LINE('ORA-00001: 违反了唯一约束');     
  168.     WHEN OTHERS THEN     
  169.         DBMS_OUTPUT.PUT_LINE('Unknown Error');     
  170. END;     
  171. /     
  172. --002    
  173. CREATE TABLE a     
  174. (     
  175.     id INT NOT NULL,     
  176.     name VARCHAR2(20) NOT NULL     
  177. );     
  178. DECLARE     
  179.     MyException EXCEPTION;     
  180.     PRAGMA EXCEPTION_INIT(MyException,-1400);  --关联语句     
  181. BEGIN     
  182.     INSERT INTO a(id) VALUES(1);  --发生异常,违反了NOT NULL约束     
  183. EXCEPTION     
  184.     WHEN MyException THEN     
  185.         DBMS_OUTPUT.PUT_LINE('错误代号:-1400');     
  186.         DBMS_OUTPUT.PUT_LINE('错误描述:违反了NOT NULL约束');     
  187.         DBMS_OUTPUT.PUT_LINE('错误发生时间:' ||      
  188.                     TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss'));     
  189.         INSERT INTO errinfo      
  190.           VALUES('-1400','违反了 NOT NULL约束',TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss'));  
  191.         DBMS_OUTPUT.PUT_LINE('已经将错误记录在ErrInfo表');     
  192.     WHEN OTHERS THEN     
  193.         DBMS_OUTPUT.PUT_LINE('Unknown Error');     
  194. END;     
  195. /     
  196. --003    
  197. DECLARE     
  198.     MyException EXCEPTION;     
  199.     salary emp.sal%TYPE;     
  200. BEGIN     
  201.     SELECT sal INTO salary FROM emp WHERE empno = '7788';     
  202.     IF salary > 2000 THEN     
  203.         RAISE MyException;     
  204.     END IF;     
  205. EXCEPTION     
  206.     WHEN MyException THEN     
  207.         RAISE_APPLICATION_ERROR(-20001,'RAISE_APPLICATION_ERROR异常发生',FALSE); --TRUE   
  208.     WHEN OTHERS THEN     
  209.         DBMS_OUTPUT.PUT_LINE('Unknown Error');     
  210. END;     
  211. /     
  212. --课后练习---------------------------------------------------------//     
  213. --001    
  214. DECLARE     
  215.     gz emp.sal%TYPE;     
  216.     MyExc EXCEPTION;     
  217. BEGIN     
  218.     SELECT sal INTO gz FROM emp WHERE ename='SCOTT';     
  219.     DBMS_OUTPUT.PUT_LINE('原工资 : ' || gz);     
  220.     IF gz < 2000 THEN     
  221.         RAISE MyExc;     
  222.     ELSE     
  223.         DBMS_OUTPUT.PUT_LINE('工资无需更新');     
  224.     END IF;     
  225. EXCEPTION     
  226.     WHEN MyExc THEN     
  227.         UPDATE emp SET sal = 3000 WHERE ename='SCOTT';     
  228.         DBMS_OUTPUT.PUT_LINE('记录已经更新');     
  229.         SELECT sal INTO gz FROM emp WHERE ename='SCOTT';     
  230.         DBMS_OUTPUT.PUT_LINE('更新后工资 : ' || gz);     
  231.     WHEN OTHERS THEN     
  232.         DBMS_OUTPUT.PUT_LINE('Unknown Error');     
  233. END;     
  234. /     
  235. --002    
  236. DECLARE     
  237.     lo salgrade.losal%TYPE;     
  238.     hi salgrade.hisal%TYPE;     
  239.     MyExc EXCEPTION;     
  240. BEGIN     
  241.     INSERT INTO salgrade VALUES(6,2600,2400);     
  242.     COMMIT;     
  243.     SELECT losal,hisal INTO lo,hi FROM salgrade WHERE grade = 6;     
  244.     IF lo > hi THEN     
  245.         RAISE MyExc;     
  246.     ELSE     
  247.         DBMS_OUTPUT.PUT_LINE('记录已经插入');     
  248.     END IF;     
  249. EXCEPTION     
  250.     WHEN MyExc THEN     
  251.         --删除插入的记录并打印相应信息     
  252.         delete salgrade WHERE grade = 6;     
  253.         DBMS_OUTPUT.PUT_LINE('记录插入失败 LOSAL 必须小于 HISAL');     
  254.     WHEN OTHERS THEN     
  255.         DBMS_OUTPUT.PUT_LINE('Unknown Error');     
  256. END;     
  257. /     
  258.     
  259. --附注-------------------------------------------------------------//     
  260. --如需在PL\SQL中进行值输入,     
  261. DECLARE     
  262.   num LONG;     
  263. BEGIN     
  264.   num := '&num';     
  265.   DBMS_OUTPUT.PUT_LINE('Input value is : ' || num);     
  266. END;     
  267. /     
  268. --注意:如果要使你在DBMS_OUTPUT.PUT_LINE(...)中显示的语句得以显示,则必须显示的调用     
  269. SET SERVEROUTPUT ON;     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值