- --[3]// Oracle PL/SQL 編程
- -------------------------------------------------------------------------------------//
- --創建錯誤信息表
- CREATE TABLE ErrInfo
- (
- ErrCode NUMBER(4) NOT NULL,
- ErrWord VARCHAR2(20) NOT NULL,
- ErrDate VARCHAR2(20) NOT NULL
- );
- --IF...ELSIF...ELSE...END IF;--------------------------------------//
- DECLARE
- var1 NUMBER:=8;
- BEGIN
- IF var1=1 THEN
- DBMS_OUTPUT.PUT_LINE('This NUMBER is ' || var1);
- ELSIF var1=2 THEN
- DBMS_OUTPUT.PUT_LINE('This NUMBER is ' || var1);
- ELSE
- DBMS_OUTPUT.PUT_LINE('Unknown the number');
- END IF;
- END;
- /
- --CASE variable WHEN expression1 THEN value1;ELSE...END CASE;------//
- --%ROWTYPE是指定義一個變量和數據庫中某個表的一條記錄數據類型一樣,它指向該表的某一條記錄
- DECLARE
- rec emp%ROWTYPE;
- BEGIN
- SELECT * INTO rec FROM emp WHERE ename='SCOTT';
- CASE rec.sal
- WHEN 3000 THEN
- DBMS_OUTPUT.PUT_LINE('More than 3000');
- WHEN 2000 THEN
- DBMS_OUTPUT.PUT_LINE('More than 2000');
- ELSE
- DBMS_OUTPUT.PUT_LINE('Less than 2000');
- END CASE ;
- END;
- /
- --LOOP...expression...EXIT WHEN expression...END LOOP--------------//
- DECLARE
- var1 NUMBER:=1;
- BEGIN
- LOOP
- DBMS_OUTPUT.PUT_LINE(var1);
- var1:=var1+1;
- EXIT WHEN var1=11; --退出條件
- END LOOP;
- END;
- /
- --WHILE...condition...LOOP...sentence...END LOOP;------------------//
- DECLARE
- var1 NUMBER:=10;
- BEGIN
- WHILE var1>=1 --退出條件
- LOOP
- DBMS_OUTPUT.PUT_LINE(var1);
- var1:=var1-1;
- END LOOP;
- END;
- /
- --FOR...variable IN 1...10 LOOP...END LOOP;------------------------//
- DECLARE
- BEGIN
- FOR i IN 1..10 LOOP --此條語句如變爲 FOR i IN REVERSE 1..10 LOOP ,輸出將爲降序
- DBMS_OUTPUT.PUT_LINE(i);
- END LOOP;
- END;
- /
- --GOTO Label...;...;<<Label>>...;----------------------------------//
- BEGIN
- GOTO a; --程序將在一開始跳到標籤a
- FOR i IN 1..10 LOOP
- DBMS_OUTPUT.PUT_LINE(i);
- IF i=5 THEN
- GOTO a;
- END IF;
- END LOOP;
- <<a>>
- DBMS_OUTPUT.PUT_LINE('This is new line');
- END;
- /
- --嵌套實現9*9乘法表------------------------------------------------//
- DECLARE
- i NUMBER:=0;
- BEGIN
- WHILE i<9
- LOOP
- i:=i+1;
- DECLARE
- j NUMBER:=0;
- BEGIN
- WHILE j<i
- LOOP
- j:=j+1;
- DBMS_OUTPUT.PUT(j || '*' || i || '=' || i*j || ' ');
- END LOOP;
- END;
- DBMS_OUTPUT.PUT_LINE('');
- END LOOP;
- END;
- /
- --異常處理---------------------------------------------------------//
- --預定義異常
- --NO_DATA_FOUND 沒有數據滿足查詢要求
- --ZERO_DIVIDE 算術錯誤,如試圖用0去除一個數
- --INVALID_NUMBER 在要求數據的地方使用了非數據
- --NOT_LOGGED_ON 沒有連接上Oracle
- --TOO_MANY_ROWS SELECT INTO 返回多行記錄
- --VALUE_ERROR 遇到算術的、轉換的、截去的或約束錯誤
- --CURSOR_ALREADY_OPEN 試圖打開一個已經打開的遊標
- --DUP_VAL_ON_INDEX 試圖插入一個已經存在的唯一約束值
- --LOGIN_DENIED 要求進入系統的請求被拒絕
- --TIMEOUT_ON_RESOURCE 等待的系統時間已經超時
- --OTHERS 其它異常
- --NO_DATA_FOUND 異常-----------------------------------------------//
- --%TYPE是指定義一個變量和數據庫中某個表的某個字段的數據類型一樣
- DECLARE
- v_name emp.ename%TYPE;
- BEGIN
- SELECT ename INTO v_name FROM emp WHERE empno='1234'; --異常發生,empno 中沒有1234
- DBMS_OUTPUT.PUT_LINE('Name is : ' || v_name);
- EXCEPTION
- WHEN NO_DATA_FOUND THEN
- DBMS_OUTPUT.PUT_LINE('No Data Found');
- WHEN OTHERS THEN
- DBMS_OUTPUT.PUT_LINE('Unknown Error');
- END;
- /
- --ZERO_DIVIDE 異常-------------------------------------------------//
- BEGIN
- DBMS_OUTPUT.PUT_LINE(5/0); --異常發生,不能被0除
- EXCEPTION
- WHEN ZERO_DIVIDE THEN
- DBMS_OUTPUT.PUT_LINE('Can not divide zero');
- WHEN OTHERS THEN
- DBMS_OUTPUT.PUT_LINE('Unknown Error');
- END;
- /
- --TOO_MANY_ROWS 異常-----------------------------------------------//
- DECLARE
- no emp.empno%TYPE;
- name emp.ename%TYPE;
- dept emp.deptno%TYPE;
- BEGIN
- SELECT empno,ename,deptno INTO no,name,dept FROM emp WHERE empno = 7369;
- DBMS_OUTPUT.PUT_LINE('員工號 :' || no);
- DBMS_OUTPUT.PUT_LINE('員工名 :' || name);
- DBMS_OUTPUT.PUT_LINE('部門號 :' || dept);
- EXCEPTION
- WHEN NO_DATA_FOUND THEN
- DBMS_OUTPUT.PUT_LINE('7369僱員不存在'); --未找到數據
- WHEN TOO_MANY_ROWS THEN
- DBMS_OUTPUT.PUT_LINE('有多個學員號是7369'); --返回多行
- WHEN OTHERS THEN
- DBMS_OUTPUT.PUT_LINE('Unknown Error');
- END;
- /
- --DUP_VAL_ON_INDEX 異常--------------------------------------------//
- BEGIN
- INSERT INTO emp
- VALUES('7788','LaoZhao','Soft','7689','03-12月-81','2600','0','20');
- EXCEPTION
- WHEN DUP_VAL_ON_INDEX THEN
- DBMS_OUTPUT.PUT_LINE('違反了PRIMARY KEY約束:7788僱員已經存在');
- WHEN OTHERS THEN
- DBMS_OUTPUT.PUT_LINE('Unknown Error');
- END;
- /
- -------------------------------------------------------------------//
- --如果員工7788的工資小於3000,則更新爲3000,如未找到該僱員,則利用異常處理打印相應信息
- DECLARE
- salary emp.sal%TYPE;
- BEGIN
- SELECT sal INTO salary FROM emp WHERE empno='7788';
- IF salary < 3000 THEN
- UPDATE emp SET sal = '3000' WHERE empno = '7788';
- DBMS_OUTPUT.PUT_LINE('記錄已更新');
- ELSE
- DBMS_OUTPUT.PUT_LINE('IF 條件不成立');
- END IF;
- EXCEPTION
- WHEN NO_DATA_FOUND THEN
- DBMS_OUTPUT.PUT_LINE('7788僱員不存在');
- WHEN OTHERS THEN
- DBMS_OUTPUT.PUT_LINE('Unknown Error');
- END;
- /
- --用戶自定義異常---------------------------------------------------//
- --001
- DECLARE
- --v_num1 NUMBER:=5;
- v_num1 NUMBER:=0;
- --v_num2 NUMBER:=0;
- v_num2 NUMBER:=5;
- MyException EXCEPTION;
- BEGIN
- DBMS_OUTPUT.PUT_LINE(v_num1/v_num2);
- RAISE MyException; --引發自定義異常
- DBMS_OUTPUT.PUT_LINE('OK'); --此句永遠不會執行,因爲發生異常後程序將直接跳到EXCEPTION段
- EXCEPTION
- WHEN MyException THEN
- DBMS_OUTPUT.PUT_LINE('Cannot Divide Zero');
- --WHEN ZERO_DIVIDE THEN
- -- DBMS_OUTPUT.PUT_LINE('Can not Divide Zero');
- WHEN OTHERS THEN
- DBMS_OUTPUT.PUT_LINE('Unknown Error');
- END;
- /
- --002
- DECLARE
- id score.id%TYPE;
- java score.java%TYPE;
- MyException EXCEPTION;
- BEGIN
- SELECT id,java INTO id,java FROM score WHERE id = 4;
- IF java < 0 OR java > 100 THEN
- RAISE MyException;
- ELSE
- DBMS_OUTPUT.PUT_LINE('OK');
- END IF;
- EXCEPTION
- WHEN MyException THEN
- UPDATE score SET java=0 WHERE id = 4;
- DBMS_OUTPUT.PUT_LINE('分數不能大於100或小於0,現已經清0');
- WHEN OTHERS THEN
- DBMS_OUTPUT.PUT_LINE('Unknown Error');
- END;
- /
- --003
- DECLARE
- v_date emp.hiredate%TYPE;
- MyException EXCEPTION;
- BEGIN
- INSERT INTO emp(empno,hiredate)
- VALUES(1111,TO_DATE('2010-12-25','yyyy-mm-dd'));
- COMMIT;
- SELECT hiredate INTO v_date FROM emp WHERE empno=1111;
- IF v_date > SYSDATE THEN
- RAISE MyException;
- END IF;
- DBMS_OUTPUT.PUT_LINE('執行完畢');
- EXCEPTION
- WHEN MyException THEN
- DBMS_OUTPUT.PUT_LINE('僱用日期不能大於當前日期');
- --raise_application_error(-20002,'僱用日期不能大於當前日期');
- UPDATE emp SET hiredate = SYSDATE WHERE empno = 1111;
- DBMS_OUTPUT.PUT_LINE('日期已更新爲當前日期');
- WHEN OTHERS THEN
- DBMS_OUTPUT.PUT_LINE('Unknown Error');
- END;
- /
- --將定義好的異常與標準的ORACLE錯誤聯繫起來-------------------------//
- --001
- DECLARE
- MyException EXCEPTION;
- PRAGMA EXCEPTION_INIT(MyException,-00001); --關聯語句
- BEGIN
- INSERT INTO emp(empno) VALUES(1234); --發生異常,企圖插入有Check約束的重複值
- COMMIT; --插入後提交
- DBMS_OUTPUT.PUT_LINE('插入正常');
- EXCEPTION
- WHEN MyException THEN
- DBMS_OUTPUT.PUT_LINE('ORA-00001: 違反了唯一約束');
- WHEN OTHERS THEN
- DBMS_OUTPUT.PUT_LINE('Unknown Error');
- END;
- /
- --002
- CREATE TABLE a
- (
- id INT NOT NULL,
- name VARCHAR2(20) NOT NULL
- );
- DECLARE
- MyException EXCEPTION;
- PRAGMA EXCEPTION_INIT(MyException,-1400); --關聯語句
- BEGIN
- INSERT INTO a(id) VALUES(1); --發生異常,違反了NOT NULL約束
- EXCEPTION
- WHEN MyException THEN
- DBMS_OUTPUT.PUT_LINE('錯誤代號:-1400');
- DBMS_OUTPUT.PUT_LINE('錯誤描述:違反了NOT NULL約束');
- DBMS_OUTPUT.PUT_LINE('錯誤發生時間:' ||
- TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss'));
- INSERT INTO errinfo
- VALUES('-1400','違反了 NOT NULL約束',TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss'));
- DBMS_OUTPUT.PUT_LINE('已經將錯誤記錄在ErrInfo表');
- WHEN OTHERS THEN
- DBMS_OUTPUT.PUT_LINE('Unknown Error');
- END;
- /
- --003
- DECLARE
- MyException EXCEPTION;
- salary emp.sal%TYPE;
- BEGIN
- SELECT sal INTO salary FROM emp WHERE empno = '7788';
- IF salary > 2000 THEN
- RAISE MyException;
- END IF;
- EXCEPTION
- WHEN MyException THEN
- RAISE_APPLICATION_ERROR(-20001,'RAISE_APPLICATION_ERROR異常發生',FALSE); --TRUE
- WHEN OTHERS THEN
- DBMS_OUTPUT.PUT_LINE('Unknown Error');
- END;
- /
- --課後練習---------------------------------------------------------//
- --001
- DECLARE
- gz emp.sal%TYPE;
- MyExc EXCEPTION;
- BEGIN
- SELECT sal INTO gz FROM emp WHERE ename='SCOTT';
- DBMS_OUTPUT.PUT_LINE('原工資 : ' || gz);
- IF gz < 2000 THEN
- RAISE MyExc;
- ELSE
- DBMS_OUTPUT.PUT_LINE('工資無需更新');
- END IF;
- EXCEPTION
- WHEN MyExc THEN
- UPDATE emp SET sal = 3000 WHERE ename='SCOTT';
- DBMS_OUTPUT.PUT_LINE('記錄已經更新');
- SELECT sal INTO gz FROM emp WHERE ename='SCOTT';
- DBMS_OUTPUT.PUT_LINE('更新後工資 : ' || gz);
- WHEN OTHERS THEN
- DBMS_OUTPUT.PUT_LINE('Unknown Error');
- END;
- /
- --002
- DECLARE
- lo salgrade.losal%TYPE;
- hi salgrade.hisal%TYPE;
- MyExc EXCEPTION;
- BEGIN
- INSERT INTO salgrade VALUES(6,2600,2400);
- COMMIT;
- SELECT losal,hisal INTO lo,hi FROM salgrade WHERE grade = 6;
- IF lo > hi THEN
- RAISE MyExc;
- ELSE
- DBMS_OUTPUT.PUT_LINE('記錄已經插入');
- END IF;
- EXCEPTION
- WHEN MyExc THEN
- --刪除插入的記錄並打印相應信息
- delete salgrade WHERE grade = 6;
- DBMS_OUTPUT.PUT_LINE('記錄插入失敗 LOSAL 必須小於 HISAL');
- WHEN OTHERS THEN
- DBMS_OUTPUT.PUT_LINE('Unknown Error');
- END;
- /
- --附註-------------------------------------------------------------//
- --如需在PL/SQL中進行值輸入,
- DECLARE
- num LONG;
- BEGIN
- num := '&num';
- DBMS_OUTPUT.PUT_LINE('Input value is : ' || num);
- END;
- /
- --注意:如果要使你在DBMS_OUTPUT.PUT_LINE(...)中顯示的語句得以顯示,則必須顯示的調用
- SET SERVEROUTPUT ON;
- ----------------------------------------------------------------------------------End//
oracle 3
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.