版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、PL/SQL編程,第一節(jié)PL/SQL塊的組成 第二節(jié)事務(wù)控制命令 第三節(jié)PL/SQL流程控制 第四節(jié)游標(biāo)的使用 第五節(jié)PL/SQL的異常處理 第六節(jié)PL/SQL示例 第七節(jié)PL/SQL編程對象,第一節(jié)程序塊結(jié)構(gòu)語言PL/SQL的組成,PL/SQL塊的組成 PL/SQL語言以塊為單位,塊中可以嵌套子塊。 一個基本的PL/SQL塊由3部分組成:定義部分(DECLARE),可執(zhí)行部分(BEGIN),異常處理部分(EXCEPTION)。,定義部分,執(zhí)行部分,異常處理部分,PL/SQL塊,主要內(nèi)容 PL/SQL塊的定義部分 與C語言類似,PL/SQL中使用的變量、常量、游標(biāo)和異常處理的名字都必須先定義后
2、使用。并且必須定義在以DECLARE關(guān)鍵字開頭的定義部分。 PL/SQL塊的可執(zhí)行部分 該部分是PL/SQL塊的主體,包含該塊的可執(zhí)行語句。該部分定義了塊的功能,是必須的。 由關(guān)鍵字BEGIN開始,EXCEPTION或END結(jié)束。 PL/SQL塊的異常處理部分 該部分包含該塊的異常處理程序(錯誤處理程序)。當(dāng)該塊程序體中的某個語句出現(xiàn)異常(檢測到一個錯誤)時,他將程序控制轉(zhuǎn)到異常部分的相應(yīng)的異常處理程序中進(jìn)行進(jìn)一步的處理。該部分由關(guān)鍵字EXCEPTION開始,END關(guān)鍵字結(jié)束。,定義部分,簡單變量定義的一般格式: CONSTANT NOT NULL DEFAULT|:= ; 說明 在PL/SQ
3、L中使用的變量、常量、游標(biāo)和異常處理的名字都必須先定義后使用。 定義部分是包括在關(guān)鍵字DECLARE和BEGIN之間的部分,每條語句后用;結(jié)束。 每行只能定義一個標(biāo)識符。 如果加上關(guān)鍵字CONSTANT,則表示所定義的標(biāo)識符為一個常量,必須為它賦初值。 標(biāo)識符的命名規(guī)則與SQL的規(guī)則基本相同,即每個標(biāo)識符必須以字母開頭,而且不分大小寫。如果定義的標(biāo)識符不能為空,則必須加上關(guān)鍵字NOT NULL,并賦初值。 為標(biāo)識符賦值時,使用賦值符號:=,默認(rèn)值為空。,Oracle 中常用的基本數(shù)據(jù)類型,定義部分,示例 1、聲明幾個變量 today DATE not null:=sysdate; age nu
4、mber(3) not null:=25;,2、聲明一個變量,使它的類型與某個變量或數(shù)據(jù)庫基本表中某個列的數(shù)據(jù)類型一致。(不知道該變量或列的數(shù)據(jù)類型)可以使用 %TYPE 。 DECLARE teacher_name char(5); student_name teacher_name%TYPE; BEGIN END DECLARE no EMP.EMPNO%TYPE; BEGIN ,定義部分,記錄類型定義的一般格式: TYPE IS RECORD ( NOT NULLDEFAULT|:= , ); 說明 標(biāo)識符 是定義的記錄類型名; 要定義記錄型變量,定義方法與前面標(biāo)量型變量定義一樣。 記錄
5、類型變量的屬性引用方法是.引用。,定義部分,示例 1、聲明記錄類型和記錄類型變量 DECLARE TYPE student IS RECORD (id NUMBER(4) NOT NULL default 0,-非空時必須加上缺省值。 name CHAR(10) , birthdate DATE, physics NUMBER(3), chemistry NUMBER(3); -下面定義一個student類型的變量 student1 student; BEGIN ,2、聲明一個記錄型變量,使它的類型與某個基本表的數(shù)據(jù)結(jié)構(gòu)一致,可以使用%ROWTYPE的形式定義。 DECLARE EMP_VAL
6、UE EMP %ROWTYPE; BEGIN ,引用方式: EMP_VALUE .empno EMP_VALUE .ename,定義部分,可執(zhí)行部分,組成語句: 變量賦值語句; 流程控制語句; 數(shù)據(jù)查詢、數(shù)據(jù)操縱和事務(wù)控制語句; 游標(biāo)語句;,賦值語句 賦值賦號為:=。 格式: := ; 示例賦值的幾種情況。 1、標(biāo)量型變量賦值 TEACHER_NAME := LIU; 2、記錄類型變量的賦值 STUDENT1.NAME := FAN; STUDENT1.SEX:=TRUE; STUDENT1.PHYSICS:=90;,可執(zhí)行部分,3、%ROWTYPE型變量的賦值 EMP_VALUE.NAME:
7、=BLACK; E MP_VALUE.EMPNO:=8888; EMP_VALUE.DEPTNO:=10; 4、用SELECT語句為%ROWTYPE型變量整個賦值 SELECT * INTO EMP_VALUE FROM EMP WHERE ENAME:=FA;,可執(zhí)行部分: 賦值語句,可執(zhí)行部分,SQL語句的使用 在可執(zhí)行部分,可以使用SQL語句,但是不是所有的SQL語句都可以使用??梢允褂玫闹饕校篠ELECT,INSERT,UPDATE,DELETE,COMMIT,ROLLBACK等數(shù)據(jù)查詢、數(shù)據(jù)操縱或事務(wù)控制命令,不能使用CREATE,ALTER,DROP,GRANT,REVOKE等數(shù)
8、據(jù)定義和數(shù)據(jù)控制命令。 說明 在PL/SQL中,SELECT語句必須與INTO子句相配合,在INTO子句后面跟需要賦值的變量。 在使用SELECT INTO時,結(jié)果只能有一條,如果返回了多條數(shù)據(jù)或沒有數(shù)據(jù),則將產(chǎn)生錯誤。(對于多條記錄的遍歷,可以使用游標(biāo)) 在PL/SQL中,SQL語句的語法和交互命令時是一樣的。,可執(zhí)行部分: SQL語句,示例1查詢EMP中EMPNO = 9000的雇員的信息。 DECLARE -定義一個記錄類型變量 EMP_VALUE EMP %ROWTYPE; BEGIN select * into emp_value from emp where empno= 7876
9、; -輸出變量的值 dbms_output.put_line(emp_value.ename); END; /,-使用DBMS_OUTPUT.PUT_LINE之前,應(yīng)該設(shè)置環(huán)境變量SERVEROUTPUT。(SET SERVEROUTPUT ON),示例2計(jì)算表EMP中所有雇員的平均工資。 DECLARE avg_sal number(8,3); BEGIN -使用select語句進(jìn)行賦值 select avg(sal) into avg_sal from emp; dbms_output.put_line(avg_sal); END; /,可執(zhí)行部分: SQL語句,第二節(jié)事務(wù)控制命令,事務(wù)(
10、transaction)的概念 事務(wù)是指在相鄰兩條事務(wù)控制命令之間的一組sql語句,它是對數(shù)據(jù)庫操作的邏輯單元。 事務(wù)是一個完整的活動序列,包含一組操作,這些操作或者全部成功地執(zhí)行,此時整個活動序列的所有執(zhí)行結(jié)果都被保存到數(shù)據(jù)庫中?;蛘叨疾粓?zhí)行并恢復(fù)到執(zhí)行前的狀態(tài),我們說事務(wù)已經(jīng)回滾。 買東西是一個典型的事務(wù)過程:交錢、拿走貨物。 驗(yàn)貨入庫也是一個典型的事務(wù)過程:來貨驗(yàn)收、入庫。 財(cái)務(wù)帳目轉(zhuǎn)移:A帳戶轉(zhuǎn)到B帳戶。,事務(wù)控制命令 COMMIT (事務(wù)提交) ROLLBACK(事務(wù)回退) SAVEPOINT(設(shè)置保存點(diǎn)命令),第二節(jié)事務(wù)控制命令,事務(wù)提交(COMMIT),一般格式:COMMIT;
11、說明 提交命令用于提交自上次提交以后對數(shù)據(jù)庫中數(shù)據(jù)所作的改動。 在Oracle數(shù)據(jù)庫中,為了維護(hù)數(shù)據(jù)的一致性,系統(tǒng)為每個用戶分別設(shè)置了一個工作區(qū)。對表中數(shù)據(jù)所作的增、刪、改操作都在工作區(qū)中進(jìn)行,在執(zhí)行提交命令之前,數(shù)據(jù)庫中的數(shù)據(jù)(永久存儲介質(zhì)上的數(shù)據(jù))并沒有發(fā)生任何改變,用戶本人可以通過查詢命令查看對數(shù)據(jù)庫操作的結(jié)果,但是整個網(wǎng)絡(luò)上的其他用戶并沒有看到你對數(shù)據(jù)庫所作的改動。 提交命令就是使對數(shù)據(jù)的改變永久化。,Oracle中設(shè)置了一個自動提交的開關(guān),如果把它設(shè)置為ON,那么所有的改變數(shù)據(jù)庫中數(shù)據(jù)的語句都會立即生效,影響數(shù)據(jù)庫中的數(shù)據(jù),缺省值為OFF。 格式:SET AUTOCOMMIT ON|
12、OFF;,事務(wù)提交(COMMIT),DDL(創(chuàng)建表、索引等)會生成隱含的COMMIT命令。,COMMIT語句應(yīng)用的概念性腳本: insert new rows update row COMMIT;,事務(wù)回退(ROLLBACK),一般格式: ROLLBACK; 說明 在尚未對數(shù)據(jù)庫提交的時候,可以用事務(wù)回退命令ROLLBACK,將數(shù)據(jù)庫回退到上次COMMIT后的狀態(tài)。 一旦事務(wù)已經(jīng)提交,就不能再使用事務(wù)回退命令進(jìn)行回退了。 事務(wù)回退將回退整個事務(wù),如果只需回退事務(wù)的一部分時,可以使用保存點(diǎn),將整個事務(wù)劃分為若干部分,這樣就可以回退部分事務(wù)了。 保存點(diǎn)的設(shè)置和使用格式: SAVEPOINT ; R
13、OLLBACK TO ;,事務(wù)處理示例:ROLLBACK,例使用cw_xs_sfzd表,練習(xí)事務(wù)處理命令。 DELETE FROM cw_xs_sfzd WHERE SFBM = 01; SELECT * FROM EMP WHERE SFBM = 01; ROLLBACK; SELECT * FROM EMP WHERE SFBM = 01; INSERTINTOcw_xs_sfzd(sfbm,sf,bmdm) VALUES(01,北京,04); SAVEPOINT INSERT_POINT; INSERT INTO cw_xs_sfzd(sfzd,sf,bmdm) VALUES(99,東軟
14、,04); ROLLBACK TO INSER_POINT; COMMIT;,第三節(jié)PL/SQL的流程控制,條件控制 循環(huán)控制 跳轉(zhuǎn)控制,條件控制,IF_THEN_ELSE語句 語法格式: IF THEN ELSE END IF; 功能: 如果條件成立,將執(zhí)行,否則執(zhí)行,執(zhí)行完后,轉(zhuǎn)到下一條語句執(zhí)行。 說明: 是一個布爾型變量或表達(dá)式,取值只能是TRUE,F(xiàn)ALSE,NULL。,執(zhí)行流程,語句組1,語句組2,條件,true,false,條件控制,IF_THEN_ELSIF語句 語法格式: IF THEN ELSIF THEN ELSIF THEN ELSE END IF; 功能: 如果成立,將
15、執(zhí)行;否則判斷,如果成立執(zhí)行;否則,判斷,如此循環(huán),直到判斷,如果都不成立,則執(zhí)行執(zhí)行,執(zhí)行完后,轉(zhuǎn)到下一條語句執(zhí)行 。 說明: ELSIF不要誤寫為ELSEIF。,執(zhí)行流程,語句組1,語句組2,true,false,false,語句組n,語句組n+1,false,true,true,條件控制,示例根據(jù)表emp中DEPTNO字段的值,為姓名為FAN的雇員修改工資;若部門號為10,則工資加100;若部門號為20,則工資加300;否則工資加400。 declare name emp.ename%type := FAN; increment emp.sal%type; fandept emp.dep
16、tno%type; begin select deptno into fandept from emp where ename = FAN; if fandept = 10 then increment :=200; elsif fandept = 20 then increment :=300; else increment :=400; end if; update emp set sal = sal +increment where ename = FAN; commit; end;,循環(huán)控制語句,FOR循環(huán) 語法格式: FOR IN REVERSE LOOP END LOOP; 說明:
17、 循環(huán)變量是控制循環(huán)的變量,它不需要顯式的在變量定義部分進(jìn)行定義。系統(tǒng)隱含地將它看成一個整型變量。 系統(tǒng)默認(rèn)時,計(jì)數(shù)器從下界往上界遞增計(jì)數(shù),如果使用REVERSE關(guān)鍵字,則表示計(jì)數(shù)器從下界到上界遞減計(jì)數(shù)。 循環(huán)變量只能在循環(huán)體中使用,不能在循環(huán)體外使用。,循環(huán)控制語句,示例從鍵盤接受一個整數(shù),計(jì)算它的階乘,并在屏幕上打印出來。 variable fac number DECLARE NUM NUMBER(3):=5; BEGIN :fac:=1; if NUM0 then for I in 1.NUM loop :fac:=:fac * I; end loop; end if; END; /
18、PRINT fac; -全局變量的引用時,必須加上:。,另一解法 set serveroutput on DECLARE num NUMBER(3):=5; resu NUMBER(3):=1; BEGIN for i in 1.num loop resu:= resu * i; end loop; dbms_output.put_line(TO_CHAR(resu); END; /,循環(huán)控制語句,直到型循環(huán) 語法格式: LOOP EXIT WHEN ; END LOOP; 執(zhí)行過程: 先執(zhí)行循環(huán)體,然后判斷,如果條件為真,則結(jié)束循環(huán),否則繼續(xù)循環(huán)。 說明: 直到型循環(huán)的循環(huán)體至少執(zhí)行1次。,
19、示例用直到型循環(huán)求1100所有整數(shù)的和 variable sum number declare I number(3):=100; begin :sum:=0; loop :sum:=:sum+1; I:=I-1; exit when I = 0; end loop; end; / print sum;,循環(huán)控制語句,當(dāng)型循環(huán) 語法格式: WHILE LOOP END LOOP; 執(zhí)行過程: 先判斷,如果條件為真,則執(zhí)行循環(huán)體,繼續(xù)循環(huán),否則結(jié)束循環(huán)。 說明: 當(dāng)型循環(huán)的循環(huán)體可能一次也不執(zhí)行。,示例用直到型循環(huán)求1100所有整數(shù)的和 declare summ number :=0; I nu
20、mber(3):=100; begin while I0 loop summ:=summ+i; I:=I - 1; end loop; dbms_output.put_line(summ); end; /,循環(huán)控制語句,循環(huán)的嵌套 三種基本的循環(huán)語句可以進(jìn)行嵌套。即一個循環(huán)可以作為一個普通的語句,完全地嵌套到另一個循環(huán)之中。 需要注意的是,嵌套的時候,一個循環(huán)必須完整的嵌套在另一個循環(huán)里,否則是錯誤的。 示例 求100150的所有的素?cái)?shù),并輸出。,Declare M number(3):=101; I number(2); K number(3); BEGIN WHILE MK; END LO
21、OP; IF I0 THEN DBMS_OUTPUT.PUT_LINE(M); END IF; M:=M+2; END LOOP; END; /,標(biāo)號和跳轉(zhuǎn)語句,語句標(biāo)號的使用 在循環(huán)中的語法格式: 標(biāo)號 LOOP EXIT 標(biāo)號 WHEN ; END LOOP 標(biāo)號 ; GOTO語句 語法格式: 標(biāo)號 GOTO 標(biāo)號; 說明: 塊內(nèi)可以跳轉(zhuǎn),內(nèi)層塊可以跳到外層塊,但外層塊不能跳到內(nèi)層。 IF語句不能跳入。不能從循環(huán)體外跳入循環(huán)體內(nèi)。不能從子程序外部跳到子程序中。 由于goto語句的缺點(diǎn),建議盡量少用甚至不用goto語句。,標(biāo)號和跳轉(zhuǎn)語句,示例 采用GOTO求1100的和。 variable
22、summ number declare I number(3):=100; begin :summ:=0; :summ:=:summ + i; I:= I - 1; if I0 then goto label; end if; end; / print sum;,第四節(jié)游標(biāo)的使用,游標(biāo)的概念 游標(biāo)的屬性 FOR循環(huán)中游標(biāo)的使用 帶參數(shù)游標(biāo)的使用,游標(biāo)的概念,游標(biāo)的定義 游標(biāo)(cursor)是Oracle系統(tǒng)在內(nèi)存中開辟的一個工作區(qū),在其中存放SELECT語句返回的查詢結(jié)果。 說明 使用游標(biāo)時,select語句查詢的結(jié)果可以是單條記錄,多條記錄,也可以是零條記錄。 游標(biāo)工作區(qū)中,存在著一個指針(
23、POINTER),在初始狀態(tài)它指向查詢結(jié)果的首記錄。 要訪問查詢結(jié)果的所有記錄,可以通過FETCH語句,進(jìn)行指針的移動來實(shí)現(xiàn)。 使用游標(biāo)進(jìn)行操作,包括定義游標(biāo)、打開游標(biāo)、提取數(shù)據(jù)以及關(guān)閉游標(biāo)幾步。,游標(biāo)的概念,定義游標(biāo) 語法格式 CURSOR IS ; 說明 PL/SQL塊中,游標(biāo)的定義應(yīng)該放在定義部分。 打開游標(biāo) 語法格式: OPEN ; 說明 打開游標(biāo),實(shí)際上是執(zhí)行游標(biāo)定義時對應(yīng)的SELECT語句,將查詢結(jié)果檢索到工作區(qū)中。 關(guān)閉游標(biāo) 語法格式: CLOSE ; 說明 關(guān)閉游標(biāo)的作用在于,使游標(biāo)所對應(yīng)的內(nèi)存工作區(qū)變?yōu)闊o效,并釋放與游標(biāo)相關(guān)的系統(tǒng)資源。,游標(biāo)的概念,提取數(shù)據(jù) 語法格式: FE
24、TCH INTO 變量1,變量2, 說明 在使用FETCH語句之前必須先打開游標(biāo),這樣才能保證工作區(qū)中有數(shù)據(jù)。 對游標(biāo)第一次使用FETCH語句時,游標(biāo)指針指向第一條記錄,因此操作的對象是第一條記錄,使用后,游標(biāo)指針指向下一條記錄。 游標(biāo)指針只能向下移動,不能回退。如果想查完第二條記錄后又回到第一條記錄,則必須關(guān)閉游標(biāo),然后重新打開游標(biāo)。 INTO子句中的變量個數(shù)、順序、數(shù)據(jù)類型必須與工作區(qū)中每行記錄的字段數(shù)、順序以及數(shù)據(jù)類型一一對應(yīng)。,游標(biāo)的概念,示例 修改表emp中各個雇員的工資,若雇員屬于10號部門,則增加$100,若雇員屬于20號部門,則增加$200,若雇員屬于30號部門,則增加$300
25、.,DECLARE row emp%rowtype; increment number(4); CURSOR cursor_emp IS SELECT * FROM EMP; i number(2); BEGIN select count(*) into i from emp; OPEN cursor_emp; FETCH cursor_emp INTO row; if row.deptno = 10 then increment:=100; elsif row.deptno= 20 then increment:=200; else increment:=300; end if;,updat
26、e emp set sal = sal + increment where ename = row.ename; i:=i - 1 ; if i0 then goto label; end if; close cursor_emp; end; /,游標(biāo)的屬性,游標(biāo)的屬性 %ISOPEN 該屬性是布爾型。如果游標(biāo)已經(jīng)打開,返回TRUE,否則為FALSE。 %FOUND 布爾型,如果最近一次使用FETCH語句,有返回結(jié)果則為TRUE,否則為FALSE; %NOTFOUND 布爾型,如果最近一次使用FETCH語句,沒有返回結(jié)果則為TRUE,否則為FALSE; %ROWCOUNT 數(shù)值型,描述的是到目
27、前為止實(shí)際從游標(biāo)工作區(qū)抽取的記錄數(shù)。,說明 游標(biāo)屬性只能在PL/SQL塊中使用,不能在SQL命令中使用。 屬性的引用格式 游標(biāo)名屬性名 說明 屬性名與游標(biāo)名之間沒有空格。,游標(biāo)的屬性,游標(biāo)的屬性,示例 修改表emp中各個雇員的工資,若雇員屬于10號部門,則增加$100,若雇員數(shù)據(jù)20號部門,則增加$200;若雇員數(shù)據(jù)30號部門,則增加$300。,DECLARE row emp%rowtype; increment number(4); CURSOR cursor_emp IS SELECT * FROM EMP; I NUMBER(2); BEGIN OPEN cursor_emp; FETC
28、H cursor_emp INTO row; if row.deptno = 10 then increment:=100; elsif row.deptno = 20 then increment := 200; else increment:= 300; end if;,update emp set sal = sal+ increment where ENAME = ROW.ENAME; if cursor_emp%FOUND then goto label; end if; END; /,FOR循環(huán)中游標(biāo)的使用,語法格式 FOR IN LOOP END LOOP; 說明 系統(tǒng)自動打開游
29、標(biāo),不用顯式地使用OPEN語句打開; 系統(tǒng)隱含地定義了一個數(shù)據(jù)類型為%ROWTYPE的變量,并以此作為循環(huán)的計(jì)算器。 系統(tǒng)重復(fù)地自動從游標(biāo)工作區(qū)中提取數(shù)據(jù)并放入計(jì)數(shù)器變量中。 當(dāng)游標(biāo)工作區(qū)中所有的記錄都被提取完畢或循環(huán)中斷時,系統(tǒng)自動地關(guān)閉游標(biāo)。,FOR循環(huán)中游標(biāo)的使用,示例 修改表emp中各個雇員的工資,若雇員屬于10號部門,則增加$100,若雇員數(shù)據(jù)20號部門,則增加$200;若雇員數(shù)據(jù)30號部門,則增加$300。,DECLARE increment number(4); CURSOR cursor_emp IS SELECT * FROM EMP; BEGIN FOR emp_recor
30、d in cursor_emp LOOP if emp_record.deptno = 10 then increment:=100; elsif emp_record.deptno = 20 then increment := 200; else increment:= 300; end if;,update emp set sal = sal+ increment where EMPNO = emp_record.EMPNO; END LOOP; END; /,帶參數(shù)游標(biāo)的使用:使用形參方式傳遞參數(shù),游標(biāo)定義語法格式: CURSOR 游標(biāo)名( ,) IS ; 說明 打開帶參數(shù)的游標(biāo)時,參數(shù)
31、個數(shù)和數(shù)據(jù)類型必須與其定義時保持一致。,示例1 DECLARE increment number(4); CURSOR cursor_emp(v_deptno emp.deptno%type) IS SELECT * FROM EMP WHERE deptno = v_deptno;,BEGIN for I in 1.3 loop for emp_record in cursor_emp(I*10) loop increment:=100*I; update emp set sal = sal +increment where EMPNO= emp_record.empno; end loop
32、; end loop; commit; /,帶參數(shù)的游標(biāo) 示例2:,DECLARE CURSOR cursor_emp(v_deptno emp.deptno%type) IS SELECT * FROM EMP WHERE deptno = v_deptno; mm emp%rowtype;,begin open cursor_emp(80); loop fetch cursor_emp into mm; exit when cursor_emp%NOTFOUND update emp set sal = sal +increment where EMPNO= mm.empno; end l
33、oop; end; /,在匿名PL/SQL塊中說明過程 一個過程說明的語法: PROCEDURE procedure_name (參數(shù)1,.,參數(shù)n) IS 過程內(nèi)的局部變量、常量、和其它過程和函數(shù)的聲明 BEGIN 組成過程的PL/SQL語句 可選的過程例外處理程序部分 END; 其中參數(shù)的說明形式為: 參數(shù)名IN/OUT 數(shù)據(jù)類型:=/DEFAULT 參數(shù)初值,在匿名PL/SQL塊中說明過程:舉例,declare - 可以定義本匿名塊的變量; PROCEDURE printLine(width IN INTEGER,chr IN CHAR DEFAULT -) - 可以定義過程內(nèi)的局部變量
34、等。 IS BEGIN FOR i IN 1.width LOOP dbms_output.put(chr); END LOOP; DBMS_OUTPUT.PUT_LINE(); END printLine;,-調(diào)用,按實(shí)參和形參位置對應(yīng)的方式傳遞 begin printline(40,*); end; -調(diào)用,帶名參數(shù)傳遞,隨意書寫參數(shù)對應(yīng)的順序 begin printline(width=20,chr=); end;,-調(diào)用,利用內(nèi)定值 begin printline(40); end;,FUNCTION function_name (parameter1 IN|OUT|IN OUT da
35、tatype :=|DEFAULT expression , parameter2 IN|OUT|IN OUT datatype :=|DEFAULT expression ) RETURN returntype IS declarations BEGIN code EXCEPTION exception_handlers END;,在匿名PL/SQL塊中說明函數(shù),在匿名PL/SQL塊中說明函數(shù):舉例,declare FUNCTION totalsal(v_empno in emp.empno%type) RETURN number IS totalsal1 number; begin sel
36、ect sal + comm into totalsal1 from emp where empno =v_empno; return totalsal1; end;,-調(diào)用,匿名塊的可執(zhí)行部分 begin select empno,totalsal(empno) from emp where totalsal(empno)300; end; /,第五節(jié)PL/SQL中的異常處理,PL/SQL中的異常處理 預(yù)定義異常 對于Oracle預(yù)定義的異常,當(dāng)預(yù)定義的情況發(fā)生時,系統(tǒng)將自動觸發(fā)。 用戶自定義的異常 需要程序員自己定義代碼,對異常情況進(jìn)行處理。 異常處理的一般格式: DECLARE ; BE
37、GIN ; EXCEPTION WHEN 異常情況1 OR 異常情況2 THEN ; WHEN異常情況3 OR 異常情況4 THEN ; WHEN OTHERS THEN ; END;,預(yù)定義的異常處理,預(yù)定義的異常處理,示例 處理預(yù)定義異常的一個例子 DECLARE cursor emp_cursor is select * from emp; record emp%rowtype; begin fetch emp_cursor into record; exception when INVALID_CURSOR then if emp_cursor%isopen then null; el
38、se open emp_cursor; fetch emp_cursor into record; close emp_cursor; end if; when others then null; end ; /,用戶自定義的異常處理,說明 用戶自定義異常必須在定義部分進(jìn)行聲明。 當(dāng)異常發(fā)生時,系統(tǒng)不能自動觸發(fā),需要用戶使用RAISE語句。 示例 DECLARE out_of_stock EXCEPTION; number_on_hand NUMBER; BEGIN IF number_on_hand 1 THEN RAISE out_of_stock; END IF; EXCEPTION W
39、HEN out_of_stock THEN -handle the error END;,第六節(jié) PL/SQL示例,declare record emp%rowtype; v_tax number(4); v_message char(100); cursor emp_cursor is select * from emp; begin open emp_cursor; fetch emp_cursor into record; declare over_sal exception;,begin if record.sal4000 then raise over_sal; else v_tax:=200; end if; v_message:=;,exception when over_sal then v_message:=His sal is too high! He should pay more tax!; v_tax:=record.sal*0.2; when others then null; end;,insert into
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025標(biāo)準(zhǔn)的電力施工合同范本
- 2025北京市常用勞動合同范本
- 2025供貨協(xié)議書合同范文
- 2025建工合同條款細(xì)節(jié)設(shè)置雷區(qū)
- 2025輻照加工合同
- 綠色照明的推廣與節(jié)能減排的實(shí)踐研究
- 生物科技產(chǎn)業(yè)的未來發(fā)展趨勢與創(chuàng)新機(jī)遇分析
- 課題申報參考:老年人健身發(fā)展“主體-時間-空間”三位協(xié)同機(jī)制的社會生態(tài)學(xué)研究
- 小兒聽力損失的醫(yī)學(xué)研究與治療進(jìn)展
- 科技展區(qū)聲光技術(shù)的未來發(fā)展趨勢預(yù)測報告
- 道路瀝青工程施工方案
- 2025年度正規(guī)離婚協(xié)議書電子版下載服務(wù)
- 《田口方法的導(dǎo)入》課件
- 內(nèi)陸?zhàn)B殖與水產(chǎn)品市場營銷策略考核試卷
- 醫(yī)生給病人免責(zé)協(xié)議書(2篇)
- 損傷力學(xué)與斷裂分析
- 2024年縣鄉(xiāng)教師選調(diào)進(jìn)城考試《教育學(xué)》題庫及完整答案(考點(diǎn)梳理)
- 車借給別人免責(zé)協(xié)議書
- 應(yīng)急預(yù)案評分標(biāo)準(zhǔn)表
- “網(wǎng)絡(luò)安全課件:高校教師網(wǎng)絡(luò)安全與信息化素養(yǎng)培訓(xùn)”
- 鋰離子電池健康評估及剩余使用壽命預(yù)測方法研究
評論
0/150
提交評論