oracle 3

  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//  
發佈了51 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章