oracle 3

来源:互联网 发布:乐视2用不了移动数据 编辑:程序博客网 时间:2024/06/06 04:49
  1. --[3]// Oracle PL/SQL 编程   
  2. -------------------------------------------------------------------------------------//   
  3. --创建错误信息表   
  4. CREATE TABLE ErrInfo   
  5. (   
  6.     ErrCode NUMBER(4) NOT NULL,   
  7.     ErrWord VARCHAR2(20) NOT NULL,   
  8.     ErrDate VARCHAR2(20) NOT NULL   
  9. );   
  10.   
  11. --IF...ELSIF...ELSE...END IF;--------------------------------------//   
  12. DECLARE   
  13.     var1 NUMBER:=8;   
  14. BEGIN   
  15.     IF var1=1 THEN   
  16.         DBMS_OUTPUT.PUT_LINE('This NUMBER is ' || var1);   
  17.     ELSIF var1=2 THEN   
  18.         DBMS_OUTPUT.PUT_LINE('This NUMBER is ' || var1);   
  19.     ELSE   
  20.         DBMS_OUTPUT.PUT_LINE('Unknown the number');   
  21.     END IF;   
  22. END;   
  23. /   
  24. --CASE variable WHEN expression1 THEN value1;ELSE...END CASE;------//   
  25. --%ROWTYPE是指定义一个变量和数据库中某个表的一条记录数据类型一样,它指向该表的某一条记录   
  26. DECLARE    
  27.     rec emp%ROWTYPE;   
  28. BEGIN   
  29.     SELECT  * INTO rec FROM emp WHERE ename='SCOTT';   
  30.     CASE  rec.sal   
  31.     WHEN 3000 THEN   
  32.         DBMS_OUTPUT.PUT_LINE('More than 3000');   
  33.     WHEN  2000 THEN   
  34.         DBMS_OUTPUT.PUT_LINE('More than 2000');   
  35.     ELSE   
  36.         DBMS_OUTPUT.PUT_LINE('Less than 2000');   
  37.     END CASE ;   
  38. END;   
  39. /   
  40. --LOOP...expression...EXIT WHEN expression...END LOOP--------------//   
  41. DECLARE   
  42.     var1 NUMBER:=1;   
  43. BEGIN   
  44.     LOOP   
  45.         DBMS_OUTPUT.PUT_LINE(var1);   
  46.         var1:=var1+1;   
  47.         EXIT WHEN var1=11;  --退出条件   
  48.     END LOOP;   
  49. END;   
  50. /   
  51. --WHILE...condition...LOOP...sentence...END LOOP;------------------//   
  52. DECLARE   
  53.     var1 NUMBER:=10;   
  54. BEGIN   
  55.     WHILE var1>=1  --退出条件   
  56.     LOOP   
  57.         DBMS_OUTPUT.PUT_LINE(var1);   
  58.         var1:=var1-1;   
  59.     END LOOP;   
  60. END;   
  61. /   
  62. --FOR...variable IN 1...10 LOOP...END LOOP;------------------------//   
  63. DECLARE   
  64.   
  65. BEGIN   
  66.     FOR i IN 1..10 LOOP  --此条语句如变为 FOR i IN REVERSE 1..10 LOOP ,输出将为降序   
  67.         DBMS_OUTPUT.PUT_LINE(i);   
  68.     END LOOP;   
  69. END;   
  70. /   
  71.   
  72. --GOTO Label...;...;<<Label>>...;----------------------------------//   
  73. BEGIN   
  74.     GOTO a;  --程序将在一开始跳到标签a   
  75.     FOR i IN 1..10 LOOP   
  76.         DBMS_OUTPUT.PUT_LINE(i);   
  77.         IF i=5 THEN   
  78.             GOTO a;   
  79.         END IF;   
  80.     END LOOP;   
  81.     <<a>>   
  82.     DBMS_OUTPUT.PUT_LINE('This is new line');   
  83. END;   
  84. /   
  85. --嵌套实现9*9乘法表------------------------------------------------//   
  86. DECLARE   
  87.     i NUMBER:=0;   
  88. BEGIN   
  89.     WHILE i<9  
  90.     LOOP   
  91.         i:=i+1;   
  92.         DECLARE   
  93.             j NUMBER:=0;   
  94.         BEGIN   
  95.             WHILE j<i   
  96.             LOOP   
  97.                 j:=j+1;   
  98.                 DBMS_OUTPUT.PUT(j || '*' || i || '=' || i*j || ' ');   
  99.             END LOOP;   
  100.         END;   
  101.     DBMS_OUTPUT.PUT_LINE('');   
  102.     END LOOP;   
  103. END;   
  104. /   
  105.   
  106. --异常处理---------------------------------------------------------//   
  107. --预定义异常   
  108.     --NO_DATA_FOUND     没有数据满足查询要求   
  109.     --ZERO_DIVIDE       算术错误,如试图用0去除一个数   
  110.     --INVALID_NUMBER    在要求数据的地方使用了非数据   
  111.     --NOT_LOGGED_ON     没有连接上Oracle   
  112.     --TOO_MANY_ROWS     SELECT INTO 返回多行记录   
  113.     --VALUE_ERROR       遇到算术的、转换的、截去的或约束错误   
  114.     --CURSOR_ALREADY_OPEN   试图打开一个已经打开的游标   
  115.     --DUP_VAL_ON_INDEX  试图插入一个已经存在的唯一约束值   
  116.     --LOGIN_DENIED      要求进入系统的请求被拒绝   
  117.     --TIMEOUT_ON_RESOURCE   等待的系统时间已经超时   
  118.     --OTHERS        其它异常   
  119.   
  120. --NO_DATA_FOUND 异常-----------------------------------------------//   
  121. --%TYPE是指定义一个变量和数据库中某个表的某个字段的数据类型一样   
  122. DECLARE   
  123.     v_name emp.ename%TYPE;   
  124. BEGIN   
  125.     SELECT ename INTO v_name FROM emp WHERE empno='1234';  --异常发生,empno 中没有1234  
  126.     DBMS_OUTPUT.PUT_LINE('Name is : ' || v_name);   
  127. EXCEPTION   
  128.     WHEN NO_DATA_FOUND THEN   
  129.         DBMS_OUTPUT.PUT_LINE('No Data Found');   
  130.     WHEN OTHERS THEN   
  131.         DBMS_OUTPUT.PUT_LINE('Unknown Error');   
  132. END;   
  133. /   
  134. --ZERO_DIVIDE 异常-------------------------------------------------//   
  135. BEGIN   
  136.     DBMS_OUTPUT.PUT_LINE(5/0);  --异常发生,不能被0除   
  137. EXCEPTION   
  138.     WHEN ZERO_DIVIDE THEN   
  139.         DBMS_OUTPUT.PUT_LINE('Can not divide zero');   
  140.     WHEN OTHERS THEN   
  141.         DBMS_OUTPUT.PUT_LINE('Unknown Error');   
  142. END;   
  143. /   
  144. --TOO_MANY_ROWS 异常-----------------------------------------------//   
  145. DECLARE   
  146.     no emp.empno%TYPE;   
  147.     name emp.ename%TYPE;   
  148.     dept emp.deptno%TYPE;   
  149. BEGIN   
  150.     SELECT empno,ename,deptno INTO no,name,dept FROM emp WHERE empno = 7369;   
  151.     DBMS_OUTPUT.PUT_LINE('员工号 :' || no);   
  152.     DBMS_OUTPUT.PUT_LINE('员工名 :' || name);   
  153.     DBMS_OUTPUT.PUT_LINE('部门号 :' || dept);   
  154. EXCEPTION   
  155.     WHEN NO_DATA_FOUND THEN   
  156.         DBMS_OUTPUT.PUT_LINE('7369雇员不存在');  --未找到数据   
  157.     WHEN TOO_MANY_ROWS THEN   
  158.         DBMS_OUTPUT.PUT_LINE('有多个学员号是7369');  --返回多行   
  159.     WHEN OTHERS THEN   
  160.         DBMS_OUTPUT.PUT_LINE('Unknown Error');   
  161. END;   
  162. /   
  163. --DUP_VAL_ON_INDEX 异常--------------------------------------------//   
  164. BEGIN   
  165.     INSERT INTO emp   
  166.     VALUES('7788','LaoZhao','Soft','7689','03-12月-81','2600','0','20');   
  167. EXCEPTION   
  168.     WHEN DUP_VAL_ON_INDEX THEN   
  169.         DBMS_OUTPUT.PUT_LINE('违反了PRIMARY KEY约束:7788雇员已经存在');   
  170.     WHEN OTHERS THEN   
  171.         DBMS_OUTPUT.PUT_LINE('Unknown Error');   
  172. END;   
  173. /   
  174. -------------------------------------------------------------------//   
  175. --如果员工7788的工资小于3000,则更新为3000,如未找到该雇员,则利用异常处理打印相应信息   
  176. DECLARE   
  177.     salary emp.sal%TYPE;   
  178. BEGIN   
  179.     SELECT sal INTO salary FROM emp WHERE empno='7788';   
  180.     IF salary < 3000 THEN   
  181.         UPDATE emp SET sal = '3000' WHERE empno = '7788';   
  182.         DBMS_OUTPUT.PUT_LINE('记录已更新');   
  183.     ELSE   
  184.         DBMS_OUTPUT.PUT_LINE('IF 条件不成立');   
  185.     END IF;   
  186. EXCEPTION   
  187.     WHEN NO_DATA_FOUND THEN   
  188.         DBMS_OUTPUT.PUT_LINE('7788雇员不存在');   
  189.     WHEN OTHERS THEN   
  190.         DBMS_OUTPUT.PUT_LINE('Unknown Error');   
  191. END;   
  192. /   
  193.   
  194. --用户自定义异常---------------------------------------------------//   
  195. --001  
  196. DECLARE   
  197.     --v_num1 NUMBER:=5;   
  198.     v_num1 NUMBER:=0;   
  199.     --v_num2 NUMBER:=0;   
  200.     v_num2 NUMBER:=5;   
  201.     MyException EXCEPTION;   
  202. BEGIN   
  203.     DBMS_OUTPUT.PUT_LINE(v_num1/v_num2);       
  204.         RAISE MyException;  --引发自定义异常   
  205.        
  206.     DBMS_OUTPUT.PUT_LINE('OK');  --此句永远不会执行,因为发生异常后程序将直接跳到EXCEPTION段   
  207. EXCEPTION   
  208.     WHEN MyException THEN   
  209.         DBMS_OUTPUT.PUT_LINE('Cannot Divide Zero');   
  210.     --WHEN ZERO_DIVIDE THEN   
  211.     --  DBMS_OUTPUT.PUT_LINE('Can not Divide Zero');   
  212.     WHEN OTHERS THEN   
  213.         DBMS_OUTPUT.PUT_LINE('Unknown Error');   
  214. END;   
  215. /   
  216. --002  
  217. DECLARE   
  218.     id score.id%TYPE;   
  219.     java score.java%TYPE;   
  220.     MyException EXCEPTION;   
  221. BEGIN   
  222.     SELECT id,java INTO id,java FROM score WHERE id = 4;   
  223.     IF java < 0 OR java > 100 THEN   
  224.         RAISE MyException;   
  225.     ELSE   
  226.         DBMS_OUTPUT.PUT_LINE('OK');   
  227.     END IF;   
  228.   
  229. EXCEPTION   
  230.     WHEN MyException THEN   
  231.         UPDATE score SET java=0 WHERE id = 4;   
  232.         DBMS_OUTPUT.PUT_LINE('分数不能大于100或小于0,现已经清0');   
  233.     WHEN OTHERS THEN   
  234.         DBMS_OUTPUT.PUT_LINE('Unknown Error');   
  235. END;   
  236. /   
  237. --003  
  238. DECLARE   
  239.     v_date emp.hiredate%TYPE;   
  240.     MyException EXCEPTION;   
  241. BEGIN   
  242.     INSERT INTO emp(empno,hiredate)   
  243.         VALUES(1111,TO_DATE('2010-12-25','yyyy-mm-dd'));   
  244.     COMMIT;   
  245.     SELECT hiredate INTO v_date FROM emp WHERE empno=1111;   
  246.     IF v_date > SYSDATE THEN   
  247.         RAISE MyException;   
  248.     END IF;   
  249.     DBMS_OUTPUT.PUT_LINE('执行完毕');   
  250. EXCEPTION   
  251.     WHEN MyException THEN   
  252.         DBMS_OUTPUT.PUT_LINE('雇用日期不能大于当前日期');   
  253.         --raise_application_error(-20002,'雇用日期不能大于当前日期');   
  254.         UPDATE emp SET hiredate = SYSDATE WHERE empno = 1111;   
  255.         DBMS_OUTPUT.PUT_LINE('日期已更新为当前日期');   
  256.     WHEN OTHERS THEN   
  257.         DBMS_OUTPUT.PUT_LINE('Unknown Error');   
  258. END;   
  259. /   
  260.   
  261. --将定义好的异常与标准的ORACLE错误联系起来-------------------------//   
  262. --001  
  263. DECLARE   
  264.     MyException EXCEPTION;   
  265.     PRAGMA EXCEPTION_INIT(MyException,-00001);  --关联语句   
  266. BEGIN   
  267.     INSERT INTO emp(empno) VALUES(1234);  --发生异常,企图插入有Check约束的重复值   
  268.     COMMIT;  --插入后提交   
  269.     DBMS_OUTPUT.PUT_LINE('插入正常');   
  270. EXCEPTION   
  271.     WHEN MyException THEN   
  272.         DBMS_OUTPUT.PUT_LINE('ORA-00001: 违反了唯一约束');   
  273.     WHEN OTHERS THEN   
  274.         DBMS_OUTPUT.PUT_LINE('Unknown Error');   
  275. END;   
  276. /   
  277. --002  
  278. CREATE TABLE a   
  279. (   
  280.     id INT NOT NULL,   
  281.     name VARCHAR2(20) NOT NULL   
  282. );   
  283. DECLARE   
  284.     MyException EXCEPTION;   
  285.     PRAGMA EXCEPTION_INIT(MyException,-1400);  --关联语句   
  286. BEGIN   
  287.     INSERT INTO a(id) VALUES(1);  --发生异常,违反了NOT NULL约束   
  288. EXCEPTION   
  289.     WHEN MyException THEN   
  290.         DBMS_OUTPUT.PUT_LINE('错误代号:-1400');   
  291.         DBMS_OUTPUT.PUT_LINE('错误描述:违反了NOT NULL约束');   
  292.         DBMS_OUTPUT.PUT_LINE('错误发生时间:' ||    
  293.                     TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss'));   
  294.         INSERT INTO errinfo    
  295.           VALUES('-1400','违反了 NOT NULL约束',TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss'));   
  296.         DBMS_OUTPUT.PUT_LINE('已经将错误记录在ErrInfo表');   
  297.     WHEN OTHERS THEN   
  298.         DBMS_OUTPUT.PUT_LINE('Unknown Error');   
  299. END;   
  300. /   
  301. --003  
  302. DECLARE   
  303.     MyException EXCEPTION;   
  304.     salary emp.sal%TYPE;   
  305. BEGIN   
  306.     SELECT sal INTO salary FROM emp WHERE empno = '7788';   
  307.     IF salary > 2000 THEN   
  308.         RAISE MyException;   
  309.     END IF;   
  310. EXCEPTION   
  311.     WHEN MyException THEN   
  312.         RAISE_APPLICATION_ERROR(-20001,'RAISE_APPLICATION_ERROR异常发生',FALSE); --TRUE   
  313.     WHEN OTHERS THEN   
  314.         DBMS_OUTPUT.PUT_LINE('Unknown Error');   
  315. END;   
  316. /   
  317. --课后练习---------------------------------------------------------//   
  318. --001  
  319. DECLARE   
  320.     gz emp.sal%TYPE;   
  321.     MyExc EXCEPTION;   
  322. BEGIN   
  323.     SELECT sal INTO gz FROM emp WHERE ename='SCOTT';   
  324.     DBMS_OUTPUT.PUT_LINE('原工资 : ' || gz);   
  325.     IF gz < 2000 THEN   
  326.         RAISE MyExc;   
  327.     ELSE   
  328.         DBMS_OUTPUT.PUT_LINE('工资无需更新');   
  329.     END IF;   
  330. EXCEPTION   
  331.     WHEN MyExc THEN   
  332.         UPDATE emp SET sal = 3000 WHERE ename='SCOTT';   
  333.         DBMS_OUTPUT.PUT_LINE('记录已经更新');   
  334.         SELECT sal INTO gz FROM emp WHERE ename='SCOTT';   
  335.         DBMS_OUTPUT.PUT_LINE('更新后工资 : ' || gz);   
  336.     WHEN OTHERS THEN   
  337.         DBMS_OUTPUT.PUT_LINE('Unknown Error');   
  338. END;   
  339. /   
  340. --002  
  341. DECLARE   
  342.     lo salgrade.losal%TYPE;   
  343.     hi salgrade.hisal%TYPE;   
  344.     MyExc EXCEPTION;   
  345. BEGIN   
  346.     INSERT INTO salgrade VALUES(6,2600,2400);   
  347.     COMMIT;   
  348.     SELECT losal,hisal INTO lo,hi FROM salgrade WHERE grade = 6;   
  349.     IF lo > hi THEN   
  350.         RAISE MyExc;   
  351.     ELSE   
  352.         DBMS_OUTPUT.PUT_LINE('记录已经插入');   
  353.     END IF;   
  354. EXCEPTION   
  355.     WHEN MyExc THEN   
  356.         --删除插入的记录并打印相应信息   
  357.         delete salgrade WHERE grade = 6;   
  358.         DBMS_OUTPUT.PUT_LINE('记录插入失败 LOSAL 必须小于 HISAL');   
  359.     WHEN OTHERS THEN   
  360.         DBMS_OUTPUT.PUT_LINE('Unknown Error');   
  361. END;   
  362. /   
  363.   
  364. --附注-------------------------------------------------------------//   
  365. --如需在PL/SQL中进行值输入,   
  366. DECLARE   
  367.   num LONG;   
  368. BEGIN   
  369.   num := '&num';   
  370.   DBMS_OUTPUT.PUT_LINE('Input value is : ' || num);   
  371. END;   
  372. /   
  373. --注意:如果要使你在DBMS_OUTPUT.PUT_LINE(...)中显示的语句得以显示,则必须显示的调用   
  374. SET SERVEROUTPUT ON;   
  375. ----------------------------------------------------------------------------------End//  
原创粉丝点击