




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1第第14章章 PL/SQL語(yǔ)言基礎(chǔ)語(yǔ)言基礎(chǔ)2本章內(nèi)容本章內(nèi)容pPL/SQL概述概述pPL/SQL基礎(chǔ)基礎(chǔ)p控制結(jié)構(gòu)控制結(jié)構(gòu)p游標(biāo)游標(biāo)p異常處理異常處理314.1 PL/SQL概述概述14.1.1 PL/SQL特點(diǎn)特點(diǎn)pPL/SQL是是Oracle對(duì)標(biāo)準(zhǔn)對(duì)標(biāo)準(zhǔn)SQL語(yǔ)言進(jìn)行了過(guò)語(yǔ)言進(jìn)行了過(guò)程化擴(kuò)展的程序設(shè)計(jì)語(yǔ)言程化擴(kuò)展的程序設(shè)計(jì)語(yǔ)言14.1.3 PL/SQL執(zhí)行過(guò)程與開發(fā)工具執(zhí)行過(guò)程與開發(fā)工具pPL/SQL開發(fā)工具開發(fā)工具nSQL *PLUSnProcedure BuildernOracle Form、Oracle ReportsnPL/SQL Developer4Declare v_dept
2、no number;Begin Select deptno into v_deptno from emp where empno=7844If v_deptno=10 Then Update emp set sal=sal+100 where empno=7844;Else Update emp set sal=sal+200 where empno=7844;End if;End ;514.2 PL/SQL基礎(chǔ)基礎(chǔ)14.2.1 PL/SQL程序結(jié)構(gòu)程序結(jié)構(gòu)1. PL/SQL塊的組成塊的組成pPL/SQL程序的基本單元是語(yǔ)句塊程序的基本單元是語(yǔ)句塊p一個(gè)完整的一個(gè)完整的PL/SQL語(yǔ)句塊由語(yǔ)句
3、塊由聲明部分、執(zhí)聲明部分、執(zhí)行部分行部分和和異常處理異常處理3部分組成。部分組成。6p定義定義PL/SQL語(yǔ)句塊的語(yǔ)法:語(yǔ)句塊的語(yǔ)法: DECLARE 聲明部分(可選)聲明部分(可選) BEGIN 執(zhí)行部分執(zhí)行部分(必須)(必須) EXCEPTION 異常處理部分(可選)異常處理部分(可選) END; 聲明變量、常量、聲明變量、常量、游標(biāo)和自定義類型游標(biāo)和自定義類型描述了所要完成的處描述了所要完成的處理,可以使用理,可以使用SQL語(yǔ)語(yǔ)句和控制語(yǔ)句句和控制語(yǔ)句當(dāng)程序在當(dāng)程序在BEGIN部分部分出錯(cuò)時(shí)執(zhí)行出錯(cuò)時(shí)執(zhí)行分號(hào)分號(hào)7Declare v_deptno number;Begin Select
4、deptno into v_deptno from scott.emp where empno=7844; If v_deptno=10 Then Update scott.emp set sal=sal+100 where empno=7844; Else Update scott.emp set sal=sal+200 where empno=7844; End if; DBMS_OUTPUT.PUT_LINE(v_deptno);EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE(沒(méi)有這個(gè)人!沒(méi)有這個(gè)人!);END;SET SER
5、VEROUTPUT ON在在SQL*Plus中需要中需要在在PL/SQL Developer中中不需要不需要8在在 SQL*PLUS中執(zhí)行中執(zhí)行PL/SQL程序程序1.連接數(shù)據(jù)庫(kù)連接數(shù)據(jù)庫(kù)92.輸入程序,結(jié)束后輸入輸入程序,結(jié)束后輸入“/”,執(zhí)行程序,執(zhí)行程序10新建新建測(cè)試測(cè)試窗口:調(diào)試窗口:調(diào)試PL/SQL程序腳本程序腳本在在PL/SQL DEVELOPER中執(zhí)行中執(zhí)行PL/SQL程序程序11查看結(jié)果查看結(jié)果輸入程序輸入程序執(zhí)行程序執(zhí)行程序12132. PL/SQL塊分類塊分類p匿名塊匿名塊n匿名塊是指動(dòng)態(tài)生成,匿名塊是指動(dòng)態(tài)生成,只能執(zhí)行一次只能執(zhí)行一次的塊,的塊,不能由其他應(yīng)用程序調(diào)用
6、。不能由其他應(yīng)用程序調(diào)用。p命名塊命名塊n命名塊是指一次編譯可命名塊是指一次編譯可多次執(zhí)行多次執(zhí)行的的PL/SQL程序,包括程序,包括函數(shù)、存儲(chǔ)過(guò)程函數(shù)、存儲(chǔ)過(guò)程、包、觸發(fā)器。、包、觸發(fā)器。n編譯后放在服務(wù)器中,由應(yīng)用程序或系統(tǒng)編譯后放在服務(wù)器中,由應(yīng)用程序或系統(tǒng)在特定條件下調(diào)用執(zhí)行。在特定條件下調(diào)用執(zhí)行。 141.字符集字符集pPL/SQL的字符集包括:的字符集包括:n大小寫字母:大小寫字母:AZ,azn數(shù)字:數(shù)字:09n空白:制表符、空格和回車空白:制表符、空格和回車n數(shù)字符號(hào):數(shù)字符號(hào):+ - * / =n標(biāo)點(diǎn)符號(hào):標(biāo)點(diǎn)符號(hào): ! # $ % &* ()()_ | ? ; :,
7、. “ p注意注意nPL/SQL字符集字符集不區(qū)分大小寫不區(qū)分大小寫。14.2.2 PL/SQL詞法單元詞法單元152.標(biāo)識(shí)符標(biāo)識(shí)符命名規(guī)則命名規(guī)則p在在PL/SQL程序中,標(biāo)識(shí)符是程序中,標(biāo)識(shí)符是以字母開頭以字母開頭的,的,后邊可以跟字母、數(shù)字、美元符號(hào)(后邊可以跟字母、數(shù)字、美元符號(hào)($)、)、井號(hào)(井號(hào)(#)或下劃線()或下劃線(_),其最大長(zhǎng)度為),其最大長(zhǎng)度為30個(gè)個(gè)字符,并且所有字符都是有效的。字符,并且所有字符都是有效的。16p+p-p*p/p=p:= 賦值賦值pp=pp!=p=p=p(p)p/*p*/pp%p;p:p.pp“p.pp| 字符串連接字符串連接p=p* 乘方乘方p-
8、3.分隔符分隔符174. 常量值常量值p字符型文字字符型文字p數(shù)字型文字?jǐn)?shù)字型文字p布爾型文字布爾型文字nTRUE,F(xiàn)ALSE,NULL三個(gè)值。三個(gè)值。p日期型文字日期型文字185. 注釋注釋p單行注釋單行注釋n-p多行注釋多行注釋n以以 “/*”開始,以開始,以“*/”結(jié)束。結(jié)束。1914.2.3 數(shù)據(jù)類型數(shù)據(jù)類型p數(shù)字類型數(shù)字類型p字符類型字符類型p日期日期/區(qū)間類型區(qū)間類型p行標(biāo)識(shí)類型行標(biāo)識(shí)類型p布爾類型布爾類型p原始類型原始類型pLOB類型類型p引用類型引用類型 p記錄類型記錄類型p集合類型集合類型p%TYPE與與%ROWTYPE201 . 數(shù)字類型:數(shù)字類型:p用來(lái)存儲(chǔ)整數(shù)、實(shí)數(shù)和浮
9、點(diǎn)數(shù),常用的數(shù)值類用來(lái)存儲(chǔ)整數(shù)、實(shí)數(shù)和浮點(diǎn)數(shù),常用的數(shù)值類型有型有NUMBER、PLS_INTEGER和和BINARY_INTEGER。 NUMBER(P,S)p存儲(chǔ)整數(shù)或浮點(diǎn)數(shù)。其中存儲(chǔ)整數(shù)或浮點(diǎn)數(shù)。其中P是精度是精度(指數(shù)值中所(指數(shù)值中所有數(shù)字的個(gè)數(shù)),有數(shù)字的個(gè)數(shù)),S是刻度是刻度(指小數(shù)點(diǎn)右邊數(shù)字指小數(shù)點(diǎn)右邊數(shù)字的個(gè)數(shù)的個(gè)數(shù))。 pP和和S都是可選的,但是如果指定了刻度都是可選的,但是如果指定了刻度S,則必,則必須指定精度須指定精度P。 例:例:sgrade number(3,1)pP的取值范圍為的取值范圍為13821 (2) BINARY_INTEGERp表示表示 -2147483
10、647 +2147483647 之間的整數(shù)之間的整數(shù)p發(fā)生溢出時(shí)會(huì)自動(dòng)轉(zhuǎn)換為發(fā)生溢出時(shí)會(huì)自動(dòng)轉(zhuǎn)換為Number類型。類型。 (3) PLS_INTEGERp表示范圍與表示范圍與BINARY_INTEGER相同相同p發(fā)生溢出時(shí)會(huì)報(bào)錯(cuò)發(fā)生溢出時(shí)會(huì)報(bào)錯(cuò)pBINARY_INTEGER和和PLS_INTEGER所需的所需的存儲(chǔ)空間要比存儲(chǔ)空間要比NUMBER少,運(yùn)算的速度要高少,運(yùn)算的速度要高于于NUMBER。pOracle數(shù)據(jù)庫(kù)中只支持?jǐn)?shù)據(jù)庫(kù)中只支持NUMBER222.字符類型字符類型 n變長(zhǎng)字符串變長(zhǎng)字符串VARCHAR2n定長(zhǎng)字符串定長(zhǎng)字符串CHAR nPL/SQL中的字符類型與中的字符類型與Or
11、acle數(shù)據(jù)庫(kù)中允許數(shù)據(jù)庫(kù)中允許字符串的長(zhǎng)度不同。字符串的長(zhǎng)度不同。類類 型型PL/SQL中最大字節(jié)數(shù)中最大字節(jié)數(shù)Oracle中最大字節(jié)數(shù)中最大字節(jié)數(shù)VARCHAR2327674000NVARCHAR2327674000CHAR327672000NCHAR327672000LONG327602GB23 9記錄記錄類型類型n記錄記錄類型的內(nèi)部含有成員分量,類似于類型的內(nèi)部含有成員分量,類似于C語(yǔ)語(yǔ)言中的結(jié)構(gòu)體,言中的結(jié)構(gòu)體, 聲明語(yǔ)法如下聲明語(yǔ)法如下DECLARE TYPE 記錄名記錄名 IS RECORD ( 字段名字段名1 類型類型 , 字段名字段名n 類型類型 ); 聲明記錄類型的變量:聲
12、明記錄類型的變量: 變量名變量名 記錄名記錄名 引用元素格式引用元素格式:記錄變量名記錄變量名.字段名字段名,如如teacher1.tnameDeclare Type JS Is Record(tid char(4), tname varchar2(8), tage number(3) );teacher1 JS;編號(hào)編號(hào)姓名姓名年齡年齡7900王凡王凡367844張松張松47表列的數(shù)據(jù)類型表列的數(shù)據(jù)類型發(fā)生變化怎么辦?發(fā)生變化怎么辦?Scott.教師教師2411. %TYPE與與%ROWTYPEp%TYPEn用于定義與某個(gè)用于定義與某個(gè)變量變量或數(shù)據(jù)庫(kù)表中某個(gè)或數(shù)據(jù)庫(kù)表中某個(gè)列列的數(shù)據(jù)類型一
13、致的數(shù)據(jù)類型一致的變量的變量n變量名變量名 模式名模式名.表名表名.列名列名% TYPEn例如,例如,tn scott.教師教師.姓名姓名%TYPE;p%ROWTYPEn用于定義與數(shù)據(jù)庫(kù)中某個(gè)用于定義與數(shù)據(jù)庫(kù)中某個(gè)表結(jié)構(gòu)一致表結(jié)構(gòu)一致的記的記錄類型的變量,可用于錄類型的變量,可用于存儲(chǔ)表中一行記錄存儲(chǔ)表中一行記錄n變量名變量名 模式名模式名.表名表名% ROWTYPEn例如,例如,teacher2 scott.教師教師%ROWTYPE;n引用變量中的某個(gè)字段值引用變量中的某個(gè)字段值: 變量名變量名.字段名字段名n例如,例如,teacher2.姓名姓名25例,定義變量例,定義變量v_sal 和和
14、v_emp,分別用于存儲(chǔ),分別用于存儲(chǔ)scott.emp表中編號(hào)為表中編號(hào)為7844的職工的工資和的職工的工資和7900的職工信息的職工信息DECLARE v_sal v_empBEGIN SELECT sal FROM scott.emp WHERE empno=7844; SELECT * FROM scott.emp WHERE empno=7900; DBMS_OUTPUT.PUT_LINE(v_sal); DBMS_OUTPUT.PUT_LINE(v_emp);END; empno ename sal7900徐立徐立20007844王鳳王鳳2500scott.emp.sal%TYPE
15、;scott.emp%ROWTYPE;INTO v_salINTO v_emp復(fù)合變量復(fù)合變量按字段分按字段分別輸出別輸出v_emp.empno|v_emp.ename|v_emp.sal26練習(xí),定義變量練習(xí),定義變量num和變量和變量stu ,分別用來(lái)存儲(chǔ),分別用來(lái)存儲(chǔ)sys.xuesheng表中表中“張紅張紅”的學(xué)號(hào)和的學(xué)號(hào)和”王娜王娜”的所有信的所有信息,并輸出息,并輸出 Declare num stu Begin SELECT sid into num FROM sys.xuesheng WHERE name=張紅張紅; SELECT * into stu FROM sys.xues
16、heng WHERE name=王娜王娜; DBMS_OUTPUT.PUT_LINE(num); DBMS_OUTPUT.PUT_LINE(stu.sid||stu.age); END;sys.xuesheng.sid%Type;sys.xuesheng%RowType;sidname age101 張紅張紅18102 王娜王娜172728作業(yè):作業(yè):P297 第第2題(題(1)()(2)29作業(yè):編寫作業(yè):編寫PL/SQL程序,在程序,在scott.emp和和scott.dept表中查找編號(hào)表中查找編號(hào)empno為為7844的員工的員工的姓名的姓名ename和部門名稱和部門名
17、稱dname,并輸出結(jié)果,并輸出結(jié)果declare v_e scott.emp.ename%type; v_d scott.dept.dname%type;begin select ename,dname from scott.emp,scott.dept where emp.deptno=dept.deptno and empno=7844; dbms_output.put_line(v_e|v_d);end; into v_e,v_d30變量聲明14.2.4 變量與常量變量與常量1. 變量與常量的定義變量與常量的定義變量名變量名 數(shù)據(jù)類型數(shù)據(jù)類型p說(shuō)明說(shuō)明n每行只能定義一個(gè)變量每行只能定義
18、一個(gè)變量;n如果加上關(guān)鍵字如果加上關(guān)鍵字CONSTANT,則表示所定,則表示所定義的是一個(gè)義的是一個(gè)常量常量,必須為它賦初值;必須為它賦初值;n如果定義變量時(shí)使用了如果定義變量時(shí)使用了NOT NULL關(guān)鍵字,關(guān)鍵字,則必須為變量賦初值;則必須為變量賦初值;n如果變量沒(méi)有賦初值,則默認(rèn)為如果變量沒(méi)有賦初值,則默認(rèn)為NULL;例如,例如,v2 NUMBER(4) NOT NULL :=10;CONSTANTNOT NULL := 默認(rèn)值默認(rèn)值;DEFAULT|312.變量的作用域變量的作用域p如果如果PL/SQL塊相互嵌套,則在塊相互嵌套,則在內(nèi)部塊中聲內(nèi)部塊中聲明的變量是局部的明的變量是局部的,
19、只能在內(nèi)部塊中引用,只能在內(nèi)部塊中引用,而在而在外部塊中聲明的變量是全局的外部塊中聲明的變量是全局的,既可,既可以在外部塊中引用,也可以在內(nèi)部塊中引以在外部塊中引用,也可以在內(nèi)部塊中引用。用。p如果內(nèi)部塊與外部塊中定義了同名變量,如果內(nèi)部塊與外部塊中定義了同名變量,則在則在內(nèi)部塊中引用外部塊的全局變量時(shí)需內(nèi)部塊中引用外部塊的全局變量時(shí)需要使用外部塊名進(jìn)行標(biāo)識(shí)。要使用外部塊名進(jìn)行標(biāo)識(shí)。 32DECLARE v_ename CHAR(16); v_outer NUMBER(5);BEGIN v_outer :=10; DECLARE v_ename CHAR(20); v_inner DATE;
20、BEGIN v_inner:=sysdate; v_ename:=INNER V_ENAME; OUTER.v_ename:=OUTER V_ENAME; END; DBMS_OUTPUT.PUT_LINE(v_ename);END; 輸出結(jié)果為輸出結(jié)果為OUTER V_ENAME3314.2.5 PL/SQL記錄記錄 1.用戶定義記錄類型及變量用戶定義記錄類型及變量 2.利用利用%ROWTYPE獲取記錄類型定義變量獲取記錄類型定義變量 3.記錄類型變量的應(yīng)用記錄類型變量的應(yīng)用 n在在SELECT語(yǔ)句中使用記錄類型變量語(yǔ)句中使用記錄類型變量 n在在INSERT語(yǔ)句中使用記錄類型變量語(yǔ)句中使用記
21、錄類型變量 n在在UPDATE語(yǔ)句中使用記錄類型變量語(yǔ)句中使用記錄類型變量 n在在DELETE語(yǔ)句中使用記錄類型變量語(yǔ)句中使用記錄類型變量 34(1)在)在SELECT語(yǔ)句中使用記錄類型變量語(yǔ)句中使用記錄類型變量 在在SELECT INTO 語(yǔ)句中使用記錄類型變量語(yǔ)句中使用記錄類型變量p例,在例,在scott.emp表中查詢姓名表中查詢姓名SMITH員工信息員工信息DECLARE v_emp BEGIN END;empnoenamesal7844SMITH2500scott.emp%ROWTYPE;SELECT * INTO v_emp FROM scott.emp WHERE ename=S
22、MITH;SELECT empno, ename, sal INTO v_emp.empno, v_emp.ename, v_emp.sal FROM scott.emp WHERE ename=SMITH;個(gè)數(shù)、順序、個(gè)數(shù)、順序、類型類型 一一匹配一一匹配35(2)在)在INSERT語(yǔ)句中使用記錄類型變量語(yǔ)句中使用記錄類型變量例,向例,向scott.dept表中插入一條新記錄表中插入一條新記錄DECLARE v_deptBEGIN v_dept.deptno:=50; v_dept.loc:=北京北京; v_dept.dname:=計(jì)算機(jī)計(jì)算機(jī); INSERT INTO scott.dept
23、 VALUES v_dept;END;p記錄類型變量中分量的個(gè)數(shù)、順序、類型應(yīng)記錄類型變量中分量的個(gè)數(shù)、順序、類型應(yīng)該與表中列的個(gè)數(shù)、順序、類型完全匹配。該與表中列的個(gè)數(shù)、順序、類型完全匹配。 deptno locdname48廣州廣州研發(fā)研發(fā)49上海上海運(yùn)維運(yùn)維50北京北京計(jì)算機(jī)計(jì)算機(jī)scott.dept%ROWTYPE;逐個(gè)字段賦值逐個(gè)字段賦值36(3) 在在UPDATE語(yǔ)句中使用記錄類型變量語(yǔ)句中使用記錄類型變量例,將例,將deptno為為50的部門名稱的部門名稱dname改為管理改為管理DECLARE v_dept scott.dept%ROWTYPE;BEGIN v_dept.dep
24、tno:=50; v_dept.loc:=北京北京; v_dept.dname:=管理管理; UPDATE scott.dept SET dname=v_dept.dname WHERE deptno=50;END;DELETE FROM scott.dept WHERE deptno=v_emp.deptno;deptno locdname48廣州廣州研發(fā)研發(fā)49上海上海運(yùn)維運(yùn)維50北京北京計(jì)算機(jī)計(jì)算機(jī)管理管理37p練習(xí),定義變量練習(xí),定義變量v_sal初始值為初始值為2000,用于存儲(chǔ),用于存儲(chǔ)scott.emp(empno,ename,sal)表中表中sal列的值,向列的值,向scott
25、.emp表中插入數(shù)據(jù),其中表中插入數(shù)據(jù),其中empno列數(shù)據(jù)為列數(shù)據(jù)為7500,ename為為JOAN,sal為為v_sal 的值。然后將該表中所的值。然后將該表中所有有sal列值小于列值小于v_sal的員工的員工sal增加增加100。最后將。最后將sal列值列值大于大于v_sal的員工信息刪除的員工信息刪除DECLARE v_sal scott.emp.sal%TYPE :=2000;BEGIN INSERT INTO scott.emp(empno,ename,sal) VALUES(7500, JOAN, v_sal); UPDATE scott.emp SET sal=sal+100
26、WHERE salv_sal;END; p在在PL/SQL程序中可以動(dòng)態(tài)指定變量的值程序中可以動(dòng)態(tài)指定變量的值例,將指定員工的工資增加例,將指定員工的工資增加400 declare v_empno number(4); begin v_empno:= update scott.emp set sal=sal+400 where empno=v_empno; end;38&x;在程序運(yùn)行時(shí)輸入在程序運(yùn)行時(shí)輸入在在SQL*PLUS中運(yùn)行中運(yùn)行3914.2.7 PL/SQL中中SQL語(yǔ)句語(yǔ)句p在在PL/SQL中只允許出現(xiàn)中只允許出現(xiàn): nSELECT 、UPDATE、DELETE、INSER
27、Tn事務(wù)控制語(yǔ)句(事務(wù)控制語(yǔ)句(COMMIT、ROLLBACK、SAVEPOINT)p注意注意nDDL語(yǔ)句不可以直接使用語(yǔ)句不可以直接使用401.SELECT語(yǔ)句語(yǔ)句p在在PL/SQL程序中,使用程序中,使用SELECTINTO語(yǔ)句查詢一個(gè)記錄的信息。語(yǔ)句查詢一個(gè)記錄的信息。pSELECTINTO語(yǔ)句只能查詢得到一條結(jié)語(yǔ)句只能查詢得到一條結(jié)果記錄果記錄,如果沒(méi)有查詢到任何數(shù)據(jù),會(huì)產(chǎn),如果沒(méi)有查詢到任何數(shù)據(jù),會(huì)產(chǎn)生生NO_DATA_FOUND異常;如果查詢到多異常;如果查詢到多個(gè)記錄,則會(huì)產(chǎn)生個(gè)記錄,則會(huì)產(chǎn)生TOO_MANY_ROWS異異常。常。412.DML語(yǔ)句語(yǔ)句允許允許使用變量使用變量3.
28、WHERE語(yǔ)句語(yǔ)句pWHERE條件中變量和列名的區(qū)分條件中變量和列名的區(qū)分先匹配列名,后匹配變量先匹配列名,后匹配變量如,如,Where empno=v_empno and ename=JOANp字符串比較字符串比較填充比較:填充比較:Char類型類型添加空格使字符串等長(zhǎng),比較每個(gè)字符添加空格使字符串等長(zhǎng),比較每個(gè)字符ASCII碼碼非填充比較:非填充比較:Varchar2類型類型比較每個(gè)字符比較每個(gè)字符ASCII碼,最先結(jié)束的字符串小碼,最先結(jié)束的字符串小424.RETURNING語(yǔ)句語(yǔ)句p在在DML語(yǔ)句末尾語(yǔ)句末尾使用使用RETURNING語(yǔ)句返語(yǔ)句返回當(dāng)前語(yǔ)句操作的記錄的信息回當(dāng)前語(yǔ)句操作
29、的記錄的信息例,將編號(hào)為例,將編號(hào)為7844的職工工資提高的職工工資提高100并返回修并返回修改后的結(jié)果改后的結(jié)果DECLARE v_sal scott.emp.sal%TYPE;BEGIN UPDATE scott.emp SET sal=sal+100 WHERE empno=7844 RETURNING sal INTO v_sal ; DBMS_OUTPUT.PUT_LINE(v_sal);END;4314.3 14.3 控制結(jié)構(gòu)控制結(jié)構(gòu) p選擇結(jié)構(gòu)選擇結(jié)構(gòu)nIF語(yǔ)句語(yǔ)句nCASE語(yǔ)句語(yǔ)句p循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)nLOOP循環(huán)循環(huán)nWhile循環(huán)循環(huán)nFor循環(huán)循環(huán)p跳轉(zhuǎn)結(jié)構(gòu)跳轉(zhuǎn)結(jié)構(gòu)nGOT
30、O4414.3.1選擇結(jié)構(gòu)選擇結(jié)構(gòu)1. IF語(yǔ)句語(yǔ)句pIF 條件條件1 THEN 語(yǔ)句語(yǔ)句1; END IF; ELSIF 條件條件2 THEN 語(yǔ)句語(yǔ)句2; ELSE 語(yǔ)句語(yǔ)句n+1;45例如,例如,輸入輸入一個(gè)員工號(hào),修改該員工的工資,一個(gè)員工號(hào),修改該員工的工資,如果該員工的部門號(hào)如果該員工的部門號(hào)detpno為為10,工資增加,工資增加100,否則增加,否則增加300。 DECLARE v_empno scott.emp.empno%type; -員工號(hào)員工號(hào) v_deptno scott.emp.deptno%type; -部門號(hào)部門號(hào) v_increment NUMBER(4);
31、-增加工資增加工資BEGIN -變量值由用戶在變量值由用戶在SQL*PLUS輸入輸入 v_empno:= &x ; -獲取該員工的部門號(hào)獲取該員工的部門號(hào)deptno SELECT deptno INTO v_deptno FROM scott.emp WHERE empno=v_empno; 46-判斷判斷v_deptno是否為是否為10,更新的值不同,更新的值不同IF v_deptno=10 THEN v_increment:=100;ELSE v_increment:=300;END IF;-更新該員工的更新該員工的salUPDATE scott.emp SET sal=sal+
32、v_increment WHERE empno=v_empno;END;47(1)只進(jìn)行只進(jìn)行等值比較等值比較的的CASE語(yǔ)句語(yǔ)句CASE 變量名變量名 WHEN 值值1 THEN 語(yǔ)句語(yǔ)句1; WHEN 值值n THEN語(yǔ)句語(yǔ)句n; ELSE 語(yǔ)句語(yǔ)句n+1;END CASE; p判斷判斷變量值變量值與與WHEN后面的值是否后面的值是否相等相等,如,如果相等,執(zhí)行對(duì)應(yīng)果相等,執(zhí)行對(duì)應(yīng)THEN后面的語(yǔ)句后面的語(yǔ)句p注意注意 :當(dāng)遇到第一個(gè)當(dāng)遇到第一個(gè)WHEN成立時(shí),執(zhí)行成立時(shí),執(zhí)行其后的操作,操作完后其后的操作,操作完后結(jié)束結(jié)束CASE語(yǔ)句。語(yǔ)句。其其他的他的WHEN不再判斷不再判斷 2 CA
33、SE語(yǔ)句語(yǔ)句48(2) 進(jìn)行多種進(jìn)行多種條件比較條件比較的的CASE語(yǔ)句語(yǔ)句CASE WHEN 條件條件1 THEN 語(yǔ)句語(yǔ)句1; WHEN 條件條件n THEN 語(yǔ)句語(yǔ)句n; ELSE 語(yǔ)句語(yǔ)句n+1; END CASE;p對(duì)對(duì)WHEN后面的條件進(jìn)行判斷,后面的條件進(jìn)行判斷,條件為真條件為真則則執(zhí)行后面的語(yǔ)句執(zhí)行后面的語(yǔ)句49例,根據(jù)輸入的員工號(hào),修改該員工工資。如果該員例,根據(jù)輸入的員工號(hào),修改該員工工資。如果該員工工資低于工工資低于1000,則工資增加,則工資增加200;如果工資在;如果工資在10002000之間,則增加之間,則增加150;否則增加;否則增加50。DECLAREv_e s
34、cott.emp.empno%type;v_sal emp.sal%type;v_i NUMBER(4);BEGINv_e:=&x;SELECT sal INTO v_sal FROM scott.emp WHERE empno=v_e;CASE WHEN v_sal1000 THEN v_i:=200; WHEN v_sal2000 THEN v_i:=150; ELSE v_i:=50;END CASE;UPDATE scott.emp SET sal=sal+v_i WHERE empno=v_e;END; 501. 簡(jiǎn)單循環(huán)簡(jiǎn)單循環(huán)p語(yǔ)法語(yǔ)法 LOOP 循環(huán)體循環(huán)體; EXIT
35、 WHEN 條件條件 ;END LOOP;p注意注意n在循環(huán)體中在循環(huán)體中一定要包含一定要包含EXIT語(yǔ)句語(yǔ)句,否則程,否則程序進(jìn)入死循環(huán)序進(jìn)入死循環(huán) 14.3.2循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)512.While循環(huán)循環(huán)p基本語(yǔ)法基本語(yǔ)法WHILE 條件條件 LOOP 循環(huán)體循環(huán)體;END LOOP; 例例3.4 使用使用WHILE循環(huán)輸出循環(huán)輸出110的數(shù)值。的數(shù)值。 declare num number(2):=1; begin while _ loop dbms_output.put_line(num); _ end loop; end;num=10num:=num+1;523. FOR循環(huán)循環(huán)p基本
36、語(yǔ)法基本語(yǔ)法FOR 循環(huán)變量循環(huán)變量 IN 下界下界.上界上界LOOP 循環(huán)體循環(huán)體;END LOOP;p注意:注意:n循環(huán)變量循環(huán)變量不需要顯式定義不需要顯式定義;n如果使用如果使用REVERSE關(guān)鍵字,則表示循環(huán)關(guān)鍵字,則表示循環(huán)變量從變量從上界向下界上界向下界遞減計(jì)數(shù);遞減計(jì)數(shù);n循環(huán)變量只能在循環(huán)體中使用,不能在循循環(huán)變量只能在循環(huán)體中使用,不能在循環(huán)體外使用。環(huán)體外使用。REVERSE53 例例3.5 使用使用FOR循環(huán)輸出循環(huán)輸出110的數(shù)值。的數(shù)值。 declare num number(2); begin for _ dbms_output.put_line(num); _ e
37、nd;如果改成如果改成for num in reverse 1.10 loop輸輸出什么結(jié)果?出什么結(jié)果?num in 1.10 loopend loop;54練習(xí):使用練習(xí):使用PL/SQL程序計(jì)算程序計(jì)算1到到100的和的和declare i number(3);s number(5);begini:=0;s:=0;while i1000;Is7834張紅張紅12007844宋佳佳宋佳佳 15007859王楚王楚11007934田宇樂(lè)田宇樂(lè) 200062(3)檢索游標(biāo))檢索游標(biāo)p使游標(biāo)使游標(biāo)指針下移指針下移,指向下一個(gè)數(shù)據(jù)行,指向下一個(gè)數(shù)據(jù)行,然后取然后取出出指針?biāo)傅臄?shù)據(jù)行,將其指針?biāo)?/p>
38、的數(shù)據(jù)行,將其存入到變量中存入到變量中。pFETCH 游標(biāo)名游標(biāo)名 INTO 變量列表變量列表|記錄變量記錄變量; p游標(biāo)指針只能向下移動(dòng),游標(biāo)指針只能向下移動(dòng),不能回退不能回退p由于游標(biāo)中取出的為一條記錄,因此變量需由于游標(biāo)中取出的為一條記錄,因此變量需要是能夠存儲(chǔ)記錄的要是能夠存儲(chǔ)記錄的記錄變量記錄變量,或者使用,或者使用變變量列表(多個(gè)變量)量列表(多個(gè)變量)63p兩種形式變量:兩種形式變量: (1) 變量列表:多個(gè)變量名,游標(biāo)中各個(gè)字段變量列表:多個(gè)變量名,游標(biāo)中各個(gè)字段依次存入各變量中依次存入各變量中 如如 fetch my into a,b,c;n變量個(gè)數(shù)、順序、數(shù)據(jù)類型必須與游標(biāo)
39、中每變量個(gè)數(shù)、順序、數(shù)據(jù)類型必須與游標(biāo)中每行記錄的字段數(shù)、順序以及數(shù)據(jù)類型行記錄的字段數(shù)、順序以及數(shù)據(jù)類型一一對(duì)一一對(duì)應(yīng)應(yīng)。 (2)記錄變量:使用記錄變量:使用“游標(biāo)名游標(biāo)名%rowtype”定義的定義的記錄類型的變量記錄類型的變量 如如 fetch my into p;64001張紅張紅網(wǎng)絡(luò)網(wǎng)絡(luò)1班班002宋佳佳宋佳佳 網(wǎng)絡(luò)網(wǎng)絡(luò)1班班003王楚王楚網(wǎng)絡(luò)網(wǎng)絡(luò)1班班001 張紅張紅網(wǎng)絡(luò)網(wǎng)絡(luò)1班班1.使用三個(gè)變量使用三個(gè)變量a, b, c分別存儲(chǔ)三個(gè)值分別存儲(chǔ)三個(gè)值a system.student.sid%type;b system.student.sname%type;c system.stud
40、ent.sclass%type;游標(biāo)游標(biāo)mySelect sid, sname, sclass from system.student2.定義變量定義變量 p, 存儲(chǔ)游標(biāo)的一行記錄存儲(chǔ)游標(biāo)的一行記錄 p my%rowtype; 變量變量 p65(4)關(guān)閉游標(biāo))關(guān)閉游標(biāo)n語(yǔ)法格式語(yǔ)法格式p CLOSE 游標(biāo)名游標(biāo)名; n說(shuō)明說(shuō)明p游標(biāo)所對(duì)應(yīng)的內(nèi)存工作區(qū)變?yōu)闊o(wú)效,游標(biāo)所對(duì)應(yīng)的內(nèi)存工作區(qū)變?yōu)闊o(wú)效,釋放與游標(biāo)相關(guān)的系統(tǒng)資源釋放與游標(biāo)相關(guān)的系統(tǒng)資源。66例題,例題, 使用游標(biāo)在使用游標(biāo)在scott.emp表中根據(jù)輸入的表中根據(jù)輸入的部門號(hào)部門號(hào)deptno查詢某個(gè)部門的所有員工信息,查詢某個(gè)部門的所有員
41、工信息,部門號(hào)在程序運(yùn)行時(shí)指定部門號(hào)在程序運(yùn)行時(shí)指定DECLARE a scott.emp.deptno%TYPE; CURSOR c_emp IS SELECT * FROM scott.emp WHERE deptno=a; -變量要先定義變量要先定義 v1 BEGIN a:=&x; OPEN c_emp; -打開游標(biāo)打開游標(biāo) c_emp%ROWTYPE;67-取游標(biāo)中的記錄取游標(biāo)中的記錄LOOP FETCH c_emp INTO v1; EXIT WHEN c_emp%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v1.empno| v1.ename| v1.sa
42、l | a); END LOOP; -關(guān)閉游標(biāo)關(guān)閉游標(biāo)CLOSE c_emp;END; 7844 張紅張紅1200107845 宋佳佳宋佳佳 1300107846 王楚王楚200010Fetch語(yǔ)句執(zhí)語(yǔ)句執(zhí)行失敗,退行失敗,退出循環(huán)出循環(huán)682 游標(biāo)的屬性游標(biāo)的屬性 p%ISOPENn布爾型。如果游標(biāo)已經(jīng)打開,返回布爾型。如果游標(biāo)已經(jīng)打開,返回TRUE,否則為否則為FALSE。p%FOUNDn布爾型,如果最近一次使用布爾型,如果最近一次使用FETCH語(yǔ)句有語(yǔ)句有返回結(jié)果返回結(jié)果,則為,則為TRUE,否則為否則為FALSE;p%NOTFOUNDn布爾型,如果最近一次使用布爾型,如果最近一次使用F
43、ETCH語(yǔ)句沒(méi)語(yǔ)句沒(méi)有返回結(jié)果有返回結(jié)果,則為,則為TRUE,否則為否則為FALSE;p%ROWCOUNTn數(shù)值型,返回到目前為止從游標(biāo)緩沖區(qū)檢數(shù)值型,返回到目前為止從游標(biāo)緩沖區(qū)檢索的元組數(shù)。索的元組數(shù)。69練習(xí),定義游標(biāo)練習(xí),定義游標(biāo)mycus為從表為從表scott.emp中取出的中取出的sal的值大于的值大于1000的數(shù)據(jù),顯示第一條數(shù)據(jù)的的數(shù)據(jù),顯示第一條數(shù)據(jù)的empno字段內(nèi)容。字段內(nèi)容。Declare _ -定義定義 select * from scott.emp where sal1000; a _ -變量變量a存儲(chǔ)游標(biāo)記錄存儲(chǔ)游標(biāo)記錄Begin open mycus; -打開打開
44、 _ _ -推進(jìn)推進(jìn) dbms_output.put_line( ); close mycus; -關(guān)閉關(guān)閉End;Cursor mycus Isfetch mycus into a;mycus%rowtype;a.empno70練習(xí):利用游標(biāo)統(tǒng)計(jì)并輸出練習(xí):利用游標(biāo)統(tǒng)計(jì)并輸出scott.emp表中各個(gè)表中各個(gè)部門編號(hào)部門編號(hào)deptno和各部門工資和各部門工資sal的平均值。的平均值。DECLARE CURSOR c1 IS SELECT deptno, avg(sal) asal FROM scott.emp GROUP BY deptno; v_dept c1%ROWTYPE;BEGIN
45、 OPEN c1; 102567202280301340deptnoasal游標(biāo)游標(biāo)c171pscott.emp表表72LOOP FETCH c1 INTO v_dept; EXIT WHEN c1%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_dept.deptno| v_dept.asal);END LOOP;CLOSE c1;END; 102567202280301340deptnoasal游標(biāo)游標(biāo)c1732.輸出所有比本部門平均工資高的員工信息輸出所有比本部門平均工資高的員工信息DECLARECURSOR c1 ISselect * from scott.emp w
46、here sal (select avg(sal) from scott.emp group by deptno having ); 74bab.deptno=a.deptnop復(fù)習(xí):顯式游標(biāo)的使用復(fù)習(xí):顯式游標(biāo)的使用p定義游標(biāo)定義游標(biāo)Cursor 游標(biāo)名游標(biāo)名 Is Select 語(yǔ)句;語(yǔ)句;p打開游標(biāo)打開游標(biāo) Open 游標(biāo)名;游標(biāo)名;p檢索游標(biāo):循環(huán)檢索游標(biāo):循環(huán) Fetch 游標(biāo)名游標(biāo)名 Into 變量;變量;p關(guān)閉游標(biāo)關(guān)閉游標(biāo) Close 游標(biāo)名;游標(biāo)名;75變量列表變量列表 或或游標(biāo)名游標(biāo)名%Rowtype作業(yè):作業(yè):1.輸出所有員工的姓名、員工號(hào)、工資輸出所有員工的姓名、員工號(hào)、
47、工資和部門號(hào)和部門號(hào)DECLARE CURSOR c1 IS SELECT ename, empno, sal, deptno FROM scott.emp; v_e c1%ROWTYPE;BEGIN OPEN c1;76LOOP FETCH c1 INTO v_e; EXIT WHEN c1%NOTFOUND; DBMS_OUTPUT.PUT_LINE( 姓名姓名|v_e.ename|員工號(hào)員工號(hào)|v_e.empno| 工資工資|v_e.sal|部門號(hào)部門號(hào)|v_e.deptno);END LOOP;CLOSE c1;END; 77各字段依各字段依次輸出次輸出enameempno salde
48、ptnoJOAN78441300 10PETER 78481800 20SCOTT 75002000 1078 4 顯式游標(biāo)的檢索顯式游標(biāo)的檢索p利用簡(jiǎn)單循環(huán)檢索游標(biāo)利用簡(jiǎn)單循環(huán)檢索游標(biāo)p利用利用WHILE循環(huán)檢索游標(biāo)循環(huán)檢索游標(biāo)p利用利用FOR循環(huán)檢索游標(biāo)循環(huán)檢索游標(biāo)79(1)利用簡(jiǎn)單)利用簡(jiǎn)單LOOP循環(huán)檢索游標(biāo)循環(huán)檢索游標(biāo)OPEN游標(biāo)名游標(biāo)名 ;LOOP FETCH 游標(biāo)名游標(biāo)名 INTO變量名變量名; EXIT WHEN 游標(biāo)名游標(biāo)名%NOTFOUND; END LOOP;pEXIT WHEN子句應(yīng)該是子句應(yīng)該是FETCHINTO語(yǔ)語(yǔ)句的下一條語(yǔ)句。句的下一條語(yǔ)句。 80(2)利用)利
49、用WHILE循環(huán)檢索游標(biāo)循環(huán)檢索游標(biāo)OPEN 游標(biāo)名游標(biāo)名;FETCH 游標(biāo)名游標(biāo)名 INTO 變量名變量名;WHILE LOOP FETCH 游標(biāo)名游標(biāo)名 INTO 變量名變量名; END LOOP;p在在While循環(huán)之前進(jìn)行一次循環(huán)之前進(jìn)行一次FETCH操作,操作,作為第一次循環(huán)的條件。作為第一次循環(huán)的條件。游標(biāo)名游標(biāo)名%FOUND 81例:利用例:利用WHILE循環(huán)統(tǒng)計(jì)并輸出各個(gè)部門的平循環(huán)統(tǒng)計(jì)并輸出各個(gè)部門的平均工資。均工資。DECLARE CURSOR c2 IS SELECT deptno, avg(sal) asal FROM scott.emp v_dept c2%ROWTY
50、PE;BEGIN OPEN c2; GROUP BY deptno;82FETCH c2 INTO v_dept; WHILE LOOP DBMS_OUTPUT.PUT_LINE(v_dept.deptno| v_dept.asal); FETCH c2 INTO v_dept;END LOOP;CLOSE c2;END; 102567202280301340deptnoasal游標(biāo)游標(biāo)c2c2%FOUND83(3)利用)利用FOR循環(huán)檢索游標(biāo)循環(huán)檢索游標(biāo)FOR 循環(huán)變量循環(huán)變量 IN LOOP END LOOP;p系統(tǒng)系統(tǒng)自動(dòng)定義自動(dòng)定義循環(huán)變量,并且其類型為循環(huán)變量,并且其類型為“游標(biāo)游標(biāo)
51、名名%ROWTYPE” 。p系統(tǒng)系統(tǒng)自動(dòng)打開游標(biāo)自動(dòng)打開游標(biāo),不用,不用OPEN語(yǔ)句;語(yǔ)句;p系統(tǒng)系統(tǒng)自動(dòng)自動(dòng)不斷從游標(biāo)中不斷從游標(biāo)中取數(shù)據(jù)取數(shù)據(jù)并放入循環(huán)變量并放入循環(huán)變量p系統(tǒng)系統(tǒng)自動(dòng)進(jìn)行自動(dòng)進(jìn)行%FOUND屬性檢查屬性檢查以確定是否有以確定是否有數(shù)據(jù)數(shù)據(jù)p當(dāng)游標(biāo)中所有的記錄都被提取完畢或循環(huán)中斷當(dāng)游標(biāo)中所有的記錄都被提取完畢或循環(huán)中斷時(shí),系統(tǒng)時(shí),系統(tǒng)自動(dòng)地關(guān)閉游標(biāo)自動(dòng)地關(guān)閉游標(biāo)。游標(biāo)名游標(biāo)名例,利用例,利用FOR循環(huán)統(tǒng)計(jì)并輸出各個(gè)部門的平均循環(huán)統(tǒng)計(jì)并輸出各個(gè)部門的平均工資。工資。DECLARE CURSOR c3 IS SELECT deptno, avg(sal) avgsal FRO
52、M scott.emp GROUP BY deptno;BEGIN FOR v_dept IN c3 LOOP DBMS_OUTPUT.PUT_LINE (v_dept.deptno|v_dept.avgsal); END LOOP; END; 102567202280301340deptnoasal游標(biāo)游標(biāo)c3無(wú)需聲明,無(wú)需聲明,自動(dòng)定義自動(dòng)定義游標(biāo)名游標(biāo)名85p可以可以不在聲明部分定義游標(biāo)不在聲明部分定義游標(biāo),而在,而在FOR語(yǔ)句語(yǔ)句中直接使用子查詢。中直接使用子查詢。DECLARE CURSOR c3 IS SELECT deptno, avg(sal) avgsal FROM scot
53、t.emp GROUP BY deptno;BEGINFOR v_emp IN DBMS_OUTPUT.PUT_LINE(v_emp.empno| v_emp.ename);END LOOP;END; (SELECT deptno, avg(sal) avgsal FROM scott.emp GROUP BY deptno) LOOP c3 LOOP 練習(xí):輸出所有員工的姓名、員工號(hào)、工資和部練習(xí):輸出所有員工的姓名、員工號(hào)、工資和部門號(hào),用門號(hào),用For循環(huán)實(shí)現(xiàn)循環(huán)實(shí)現(xiàn)DECLARECURSOR c1 IS SELECT ename, empno, sal, deptno FROM sco
54、tt.emp; BEGINFor v_e in c1 LOOP DBMS_OUTPUT.PUT_LINE(姓名姓名|v_e.ename |員工號(hào)員工號(hào)|v_e.empno|工資工資|v_e.sal |部門號(hào)部門號(hào)|v_e.deptno);END LOOP;END; 86873 參數(shù)化顯式游標(biāo)參數(shù)化顯式游標(biāo)p通過(guò)參數(shù)的取值來(lái)通過(guò)參數(shù)的取值來(lái)限制限制游標(biāo)的游標(biāo)的SQL查詢結(jié)果查詢結(jié)果p參數(shù)值不同選取的數(shù)據(jù)行不同,從而能夠動(dòng)態(tài)參數(shù)值不同選取的數(shù)據(jù)行不同,從而能夠動(dòng)態(tài)使用游標(biāo)使用游標(biāo) Declare Cursor 游標(biāo)名游標(biāo)名 Is Select 語(yǔ)句語(yǔ)句 Begin Open 游標(biāo)名游標(biāo)名(參數(shù)值參
55、數(shù)值)(參數(shù)名參數(shù)名 數(shù)據(jù)類型數(shù)據(jù)類型)Where 條件中條件中體現(xiàn)參數(shù)體現(xiàn)參數(shù)88例,根據(jù)部門編號(hào)例,根據(jù)部門編號(hào)deptno輸出該部門員工姓名輸出該部門員工姓名DECLARECURSOR c4 IS SELECT * FROM scott.emp WHERE v_emp c4%ROWTYPE;BEGIN OPEN c4(10); LOOP FETCH c4 INTO v_emp; EXIT WHEN c_emp%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_emp.ename); END LOOP; CLOSE c4;END;deptno=p;(p emp.deptno
56、%TYPE)89p注意:注意:n定義參數(shù)化游標(biāo)時(shí),只能指定參數(shù)的類型,定義參數(shù)化游標(biāo)時(shí),只能指定參數(shù)的類型,而而不能指定參數(shù)的長(zhǎng)度、精度、刻度;不能指定參數(shù)的長(zhǎng)度、精度、刻度;n打開帶參數(shù)的游標(biāo)時(shí),實(shí)參的個(gè)數(shù)和數(shù)據(jù)類打開帶參數(shù)的游標(biāo)時(shí),實(shí)參的個(gè)數(shù)和數(shù)據(jù)類型等必須與游標(biāo)定義時(shí)形參個(gè)數(shù)和數(shù)據(jù)類型型等必須與游標(biāo)定義時(shí)形參個(gè)數(shù)和數(shù)據(jù)類型等相等相匹配匹配。905 利用游標(biāo)更新或刪除數(shù)據(jù)利用游標(biāo)更新或刪除數(shù)據(jù)p游標(biāo)定義語(yǔ)法游標(biāo)定義語(yǔ)法CURSOR 游標(biāo)名游標(biāo)名 IS SELECT 列列 FROM 表名表名 FOR UPDATEp注意注意n打開游標(biāo)時(shí)對(duì)相應(yīng)的表加鎖打開游標(biāo)時(shí)對(duì)相應(yīng)的表加鎖, 其他用戶不其他用
57、戶不能對(duì)該表進(jìn)行更新操作;能對(duì)該表進(jìn)行更新操作;n若數(shù)據(jù)對(duì)象已經(jīng)被其他會(huì)話加鎖,則當(dāng)前若數(shù)據(jù)對(duì)象已經(jīng)被其他會(huì)話加鎖,則當(dāng)前會(huì)話掛起等待,若指定了會(huì)話掛起等待,若指定了NOWAIT子句,子句,則不等待,返回則不等待,返回ORACLE錯(cuò)誤。錯(cuò)誤。n當(dāng)用戶執(zhí)行當(dāng)用戶執(zhí)行COMMIT或或ROLLBACK操作操作時(shí),數(shù)據(jù)上的鎖會(huì)自動(dòng)被釋放。時(shí),數(shù)據(jù)上的鎖會(huì)自動(dòng)被釋放。 OF 列名列名 NOWAIT; 91p例如,修改員工的工資,如果員工的部門號(hào)為例如,修改員工的工資,如果員工的部門號(hào)為10,則工資,則工資提高提高100;如果部門號(hào)為;如果部門號(hào)為20,則工資提高,則工資提高150,否則工資提,否則工資提
58、高高250。DECLARE CURSOR c_emp IS SELECT * FROM emp FOR UPDATE; v_increment NUMBER;BEGIN FOR v_emp IN c_emp LOOP CASE v_emp.deptno WHEN 10 THEN v_increment:=100; WHEN 20 THEN v_increment:=150; ELSE v_increment:=250; END CASE; UPDATE emp SET sal=sal+v_increment WHERE CURRENT OF c_emp; END LOOP; COMMIT;EN
59、D; 9214.4.3 隱式游標(biāo)隱式游標(biāo)p概念概念n所有的所有的SQL語(yǔ)句都有一個(gè)執(zhí)行的緩沖區(qū),語(yǔ)句都有一個(gè)執(zhí)行的緩沖區(qū),隱式游標(biāo)就是指向該緩沖區(qū)的指針,由系隱式游標(biāo)就是指向該緩沖區(qū)的指針,由系統(tǒng)隱含地打開、處理和關(guān)閉。隱式游標(biāo)又統(tǒng)隱含地打開、處理和關(guān)閉。隱式游標(biāo)又稱為稱為SQL游標(biāo)。游標(biāo)。n隱式游標(biāo)主要用于處理隱式游標(biāo)主要用于處理INSERT、UPDATE,DELETE以及單行的以及單行的SELECTINTO語(yǔ)句,沒(méi)有語(yǔ)句,沒(méi)有OPEN,F(xiàn)ETCH,CLOSE等操作命令。等操作命令。9314.5 異常處理異常處理14.5.1 異常概述異常概述1.Oracle錯(cuò)誤處理機(jī)制錯(cuò)誤處理機(jī)制pOrac
60、le中對(duì)運(yùn)行時(shí)錯(cuò)誤的處理采用了異中對(duì)運(yùn)行時(shí)錯(cuò)誤的處理采用了異常處理機(jī)制。常處理機(jī)制。 p一個(gè)錯(cuò)誤對(duì)應(yīng)一個(gè)異常,當(dāng)錯(cuò)誤產(chǎn)生時(shí)一個(gè)錯(cuò)誤對(duì)應(yīng)一個(gè)異常,當(dāng)錯(cuò)誤產(chǎn)生時(shí)拋出相應(yīng)的異常,并被異常處理器捕獲,拋出相應(yīng)的異常,并被異常處理器捕獲,程序控制權(quán)傳遞給異常處理器。程序控制權(quán)傳遞給異常處理器。 942.異常的類型異常的類型(1)預(yù)定義的)預(yù)定義的Oracle異常(異常( Oracle錯(cuò)誤)錯(cuò)誤)p錯(cuò)誤產(chǎn)生時(shí),與錯(cuò)誤對(duì)應(yīng)的預(yù)定義異常被自錯(cuò)誤產(chǎn)生時(shí),與錯(cuò)誤對(duì)應(yīng)的預(yù)定義異常被自動(dòng)拋出,通過(guò)捕獲該異??梢詫?duì)錯(cuò)誤進(jìn)行處理。動(dòng)拋出,通過(guò)捕獲該異常可以對(duì)錯(cuò)誤進(jìn)行處理。表表14-4(2)非預(yù)定義的)非預(yù)定義的Oracle異常(異常( Oracle錯(cuò)誤)錯(cuò)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 有效護(hù)理計(jì)劃制定試題及答案
- 深度剖析2025年衛(wèi)生資格考試的試題及答案
- 醫(yī)學(xué)研究設(shè)計(jì)試題及答案解析
- 2025年醫(yī)師考試值得深入的問(wèn)題試題及答案
- 行政管理2025年必考知識(shí)網(wǎng)點(diǎn)試題及答案
- 行政管理公共預(yù)算試題及答案
- 構(gòu)建執(zhí)業(yè)藥師知識(shí)體系的試題及答案
- 主管護(hù)師臨床案例處理試題及答案
- 臨床藥學(xué)服務(wù)模式創(chuàng)新探討試題及答案
- 2025年文化創(chuàng)新試題及答案
- 生理學(xué)基礎(chǔ)題庫(kù)(46道)
- GB/T 17395-2024鋼管尺寸、外形、重量及允許偏差
- DB5101-T135-2021城市公園分類分級(jí)管理規(guī)范
- 小學(xué)生中醫(yī)藥文化知識(shí)科普傳承中醫(yī)文化弘揚(yáng)國(guó)粹精神課件
- 2024年福建省中考?xì)v史試卷(含標(biāo)準(zhǔn)答案及解析)
- 代持存款合同協(xié)議書
- 蛋糕店產(chǎn)品與服務(wù)方案
- 國(guó)開《會(huì)計(jì)學(xué)概論》網(wǎng)核模擬測(cè)試答案
- 2023年度健康體檢大數(shù)據(jù)藍(lán)皮書-美年健康+中關(guān)村美年健康產(chǎn)業(yè)研究院
- ASME材料-設(shè)計(jì)許用應(yīng)力
- 數(shù)字貿(mào)易學(xué) 課件 第15章 數(shù)字支付與數(shù)字貨幣
評(píng)論
0/150
提交評(píng)論