PLSQLx2-結構化語句課件資料_第1頁
PLSQLx2-結構化語句課件資料_第2頁
PLSQLx2-結構化語句課件資料_第3頁
PLSQLx2-結構化語句課件資料_第4頁
PLSQLx2-結構化語句課件資料_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、 PL/SQL語言篇-結構化程序設計PL/SQL結構化語句5.4.1 條件結構1.IF邏輯結構 (1) IF-THEN-ENDIF結構 (2) IF-THEN-ELSE-ENDIF結構 (3) IF-THEN-ELSIF結構 (4) CASE結構 5.4 PL/SQL基本程序結構和語句1.IF邏輯結構(3)IF-THEN-ELSIF-THEN-ELSE語法格式: IF 條件 1 THEN Run_expression1 ELSIF條件 2 THEN Run_expression2 ELSERun_expression3 END IF1 要求:向學生表中添加 記錄,值為007 Jame 計算機

2、45,并說明是否成功DECLARE v_xm varchar2(8):=Jame; v_zym varchar2(10):=計算機; v_zxf number(2):=45; /*定義變量類型*/ BEGIN INSERT INTO XS(XH,XM,ZYM,ZXF) VALUES(007,v_xm,v_zym,v_zxf); IF SQL%FOUND THEN DBMS_OUTPUT.PUT_LINE(操作成功);ELSE DBMS_OUTPUT.PUT_LINE(沒有插入該人); END IF;END; 分支結構 2 要求:針對scott.emp表,計算7788號雇員的應交稅金情況,薪金=

3、3000,應繳稅金為薪金的0.08,薪金在1500和3000之間,應繳薪金的0.06,其它應繳0.04.declare v_sal scott.emp.sal%type; v_tax scott.emp.sal%type;begin select sal into v_sal from scott.emp where empno=7788; if v_sal=3000 then v_tax:=v_sal*0.08; elsif v_sal=1500 then v_tax:=v_sal*0.06; else v_tax:=v_sal*0.04; end if; DBMS_OUTPUT.PUT_L

4、INE(應繳稅金:|v_tax); end; 分支結構3 要求:涉及表為scott.emp,輸入一個員工號,修改該員工的工資,如果該員工為10號部門(deptno),則要求工資增加100;若為20號部門,要求工資增加150;若為30號部門,工資增加200;否則增加300。 分析:首先搭好程序塊的框架(declare begin exception end;)輸入一個員工號-使用臨時變量找出根據(jù)那個變量值的不同來做分支結構:部門號v_deptnoSelect into語句求此變量,部門號v_deptno分支結構求工資增加量Update 語句修改工資多分支結構DECLARE v_deptno sc

5、ott.emp.deptno%type; v_zj NUMBER(4); v_empno scott.emp.empno%type;BEGIN v_empno:=7788; SELECT deptno INTO v_deptno FROM scott.emp WHERE empno=v_empno; IF v_deptno=10 THEN v_zj:=100; ELSIF v_deptno=20 THEN v_zj:=150; ELSIF v_deptno=30 THEN v_zj:=200; ELSE v_zj:=300; END IF; UPDATE scott.emp SET sal=s

6、al+v_zj WHERE empno=7788;END;多分支結構declare v_deptno scott.emp.deptno%type; v_zl scott.emp.sal%type;begin select deptno into v_deptno from scott.emp where empno=&a; if v_deptno=10 then v_zl:=100; elsif v_deptno=20 then v_zl:=150; elsif v_deptno=30 then v_zl:=200; else v_zl:=300; end if; UPDATE scott.e

7、mp SET sal=sal+v_zl WHERE empno=&a; end; 帶臨時變量的多分支結構臨時變量&a 和&a多分支結構1.CASE語句1語法格式:CASE 變量名WHEN 數(shù)值 THEN 處理語句 1 WHEN 數(shù)值 THEN 處理語句2ELSE 處理語句n+1 END CASE;多分支結構DECLARE v_deptno emp.deptno%type; v_increment NUMBER(4); v_empno emp.empno%type;BEGIN v_empno:=&x; SELECT deptno INTO v_deptno FROM emp WHERE empn

8、o=v_empno; CASE v_deptno WHEN 10 THEN v_increment:=100; WHEN 20 THEN v_increment:=150; WHEN 30 THEN v_increment:=200; ELSE v_increment:=300;END CASE;UPDATE emp SET sal=sal+v_increment WHERE empno=v_empno; END; 等值比較的CASE語句準備工作:select * from scott.emp;查看7788的sal完善程序Update語句之后追加如下語句:if SQL%FOUND then d

9、bms_output.put_line(更改成功); select sal into v_sal from scott.emp where empno=7788; dbms_output.put_line(v_sal);end if;等值比較的CASE語句5.4 PL/SQL基本程序結構例: 關于成績等級制和百分制的相互轉換。-簡單case表達式declare grade varchar2(4):=良好;begin case grade when 優(yōu)秀 then dbms_output.put_line(大于等于90); when 良好 then dbms_output.put_line(大于

10、等于80,小于90); when 及格 then dbms_output.put_line(大于等于60,小于80); else dbms_output.put_line(不及格); end case;end; 1.CASE語句2語法格式:CASE WHEN 關系表達式 1 THEN 處理語句 1 WHEN 關系表達式 2 THEN 處理語句2ELSE 處理語句n+1 END CASE;多分支結構5.4 PL/SQL基本程序結構和語句例: 關于成績等級制和百分制的相互轉換。-搜索case表達式declare score int:=91;begin case when score=90 then

11、 dbms_output.put_line(優(yōu)秀); when score=80 then dbms_output.put_line(良好); when score=60 then dbms_output.put_line(及格); else dbms_output.put_line(不及格); end case;end; 分支語句case 用法3單獨的case句可以用到select 語句中select xh,xm,zxf, (case when (zxf=50) then 高 when (zxf=40) then 中 else end) as 獲得學分情況 from xs;注意:此種情況下,

12、整個case 語句沒有標點符號SQL select Months_Between(sysdate,to_date(20151001,yyyymmdd) from dual; MONTHS_BETWEEN(SYSDATE,TO_DATE- 1.04413045101553 SQL select trunc(sysdate-to_date(20151001,yyyymmdd) 天數(shù) from dual; 天數(shù)- 32分支語句case 用法318檢驗圖書是否過期:select empno,ename,(case when (trunc(sysdate-hiredate)=30) then 過期 el

13、se end) shifouguoqi from scott.emp;分支語句case 用法3FOR循環(huán) LOOP-EXIT-END LOOP循環(huán)WHILE循環(huán)結構化之循環(huán)結構循環(huán)結構1.LOOP-EXIT-WHEN-END循環(huán)LOOPRun_expression EXIT WHEN Boolean_expression END LOOP;5.4.2循環(huán)結構【例5.10】求10的階乘。DECLARE s NUMBER:=1;n NUMBER:=2;BEGINLOOP s:=s*n; n:=n+1; exit when n10;END LOOP;dbms_output.put_line(to_c

14、har(s);END;5.4.2循環(huán)結構2.WHILE-LOOP-END循環(huán)語法格式: WHILE Boolean_expressionLOOPRun_expression END LOOP;5.4.2循環(huán)結構【例5.11】用WHILE-LOOP-END循環(huán)結構求10的階乘。DECLARE s NUMBER:=1;n NUMBER:=2;BEGIN while n=90 then 優(yōu) when cj=80 then 良 else end) as 級別 from xs_kc1 異常概述Oracle錯誤處理機制語句執(zhí)行過程中,因為各種原因使得語句不能正常執(zhí)行而造成更大錯誤或整個系統(tǒng)的崩潰-好的程序

15、應該對可能發(fā)生的異常情況進行處理,異常處理代碼在Exception塊中實現(xiàn)。當異常產(chǎn)生時拋出相應的異常,并被異常處理器捕獲,程序控制權傳遞給異常處理器,由異常處理器來處理運行時錯誤。異常的捕獲與處理異常處理器的基本形式為EXCEPTION WHEN 異常1 OR 異常2 THEN 語句1; WHEN 異常3 THEN 語句2; WHEN OTHERS THEN 語句n;END;注意:一個異常處理器可以捕獲多個異常,只需要在WHEN子句中用OR連接即可;當數(shù)據(jù)庫或PL/SQL在運行時發(fā)生錯誤時,一個異常被PL/SQL自動拋出。一個異常只能被一個異常處理器捕獲,并進行處理。 異常的捕獲與處理1 異

16、常的類型預定義的Oracle異常用戶定義的異常異常概述異常處理部分 【例】下面是一個異常處理的例子:SET SERVEROUTPUT ON;DECLARE x NUMBER;BEGIN x:= aa123;EXCEPTION WHEN VALUE_ERROR THEN DBMS_OUTPUT.PUT_LINE(數(shù)據(jù)類型錯誤);END;預定義的異常 p213異常情況名錯誤代碼描述CURSOR_ALREADY_OPEN ORA-06511 嘗試打開已經(jīng)打開的游標 INVALID_CURSORORA-01001不合法的游標操作(如要打開已經(jīng)關閉的游標) NO_DATA_FOUNDORA-01403沒

17、有發(fā)現(xiàn)數(shù)據(jù) TOO_MANY_ROWSORA-01422一個SELECT INTO語句匹配多個數(shù)據(jù)行INVALID_NUMBERORA-01722轉換成數(shù)字失敗 (X) VALUE_ERRORORA-06502截斷、算法或轉換錯誤,通常出現(xiàn)在賦值錯誤 ZERO_DIVIDEORA-01476除數(shù)為0 ROWTYPE_MISMATCHORA-06504主機游標變量與PL/SQL游標變量類型不匹配異常與數(shù)據(jù)庫有關的一段異常:查找“李明”同學的學號 DECLARE v_result xs.xm%TYPE; BEGIN SELECT xh INTO v_result FROM xs WHERE xm=

18、李明; DBMS_OUTPUT.PUT_LINE(The student number is |v_result); EXCEPTION WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE(There has TOO_MANY_ROWS error); WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE(There has NO_DATA_FOUND error); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(錯誤情況不明); END;查詢名為SMITH的員工工資,如果該員工不存在,則輸

19、出“There is not such an employee!”;如果存在多個同名的員工,則輸出There has too_many_rows error!” declare v_sal scott.emp.sal%type;begin select sal into v_sal from scott.emp where ename=SMITH; DBMS_OUTPUT.PUT_LINE(v_sal); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE(沒有返回數(shù)據(jù)); WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE(返回多行匹配數(shù)據(jù)); end;異常的捕獲與處理注意:使用others異??梢越柚鷥蓚€函數(shù)來說明捕捉到的異常的類型-SQLCODE和SQLERRM異常DECLARE v_result number; BEGIN SELECT xm INTO v_result FROM xs WHERE xh=010010; DBMS_OUTPUT.PUT_LINE(The student name is|v_result); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論