版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第7章PL/SQL編程第7章PL/SQL編程PL/SQL編程7.1PL/SQL語言基礎7.2PL/SQL程序結構7.3異常處理PL/SQL編程7.1PL/SQL語言基礎7.1PL/SQL語言基礎7.1.1PL/SQL語言優(yōu)點PL/SQL是一種高效的事務處理語言,它具備以下優(yōu)點:PL/SQL是一種高性能的基于事務處理的語言,能運行在任何Oracle環(huán)境中,支持所有數(shù)據(jù)處理命令。通過使用PL/SQL程序單元處理SQL的數(shù)據(jù)定義和數(shù)據(jù)控制元素。PL/SQL支持所有SQL數(shù)據(jù)類型和所有SQL函數(shù),同時支持所有Oracle對象類型。PL/SQL塊可以被命名并存儲在Oracle服務器中,同時也能被其他PL/SQL程序或SQL命令調用,任何客戶/服務器工具都能訪問PL/SQL程序,具有很好的可重用性??梢允褂肙racle數(shù)據(jù)工具管理PL/SQL程序的安全性??梢允跈嗷虺蜂N數(shù)據(jù)庫其他用戶訪問PL/SQL程序權限。7.1PL/SQL語言基礎7.1.1PL/SQL語言7.1PL/SQL語言基礎PL/SQL代碼可以使用任何ASCII文本編輯器編寫,所以對任何能夠運行Oracle的操作系統(tǒng)都是非常便利的。對于SQL,Oracle必須在同一時間處理每一條SQL語句,在網絡環(huán)境下這就意味著每一個獨立的調用都必須被Oracle服務器處理,從而占用大量的服務器時間,導致網絡擁擠。而PL/SQL以整個語句塊形式發(fā)給服務器,可以減少網絡擁擠。7.1PL/SQL語言基礎PL/SQL代碼可以使用任何7.1PL/SQL語言基礎7.1.2PL/SQL的基本結構一個PL/SQL程序包含一個或多個邏輯塊,每個塊都可以劃分為三個部分:聲明部分(用DECLARE開頭)、執(zhí)行部分(以BEGIN開頭)和異常處理部分(以EXCEPTION開頭)
1、PL/SQL基本結構如下:
DECLARE
聲明部分
BEGIN
執(zhí)行部分
EXCEPTION
異常處理部分
END;7.1PL/SQL語言基礎7.1.2PL/SQL的基7.1PL/SQL語言基礎其中:聲明部分:定義變量和常量的數(shù)據(jù)類型和初始值,以及程序中要使用的函數(shù)、游標、異常處理名稱等。如果沒有需要聲明的內容,可以省略這一部分。PL/SQL中要使用的所有定義都必須在這一部分進行集中定義。執(zhí)行部分:此部分是PL/SQL塊中的指令部分,所有的可執(zhí)行語句都放在這一部分,包括對數(shù)據(jù)庫的操作語句和各種流程控制語句,也可以嵌套其他的PL/SQL塊。執(zhí)行部分至少包含一條可執(zhí)行語句。異常處理部分:包含在執(zhí)行部分中,以關鍵字EXCEPTION開始,到END結束。當程序檢測到錯誤而產生異常時,就轉到由EXCEPTION標識的部分執(zhí)行異常處理程序。這部分是可選的,利用異常處理可以提高PL/SQL程序的健壯性。7.1PL/SQL語言基礎其中:7.1PL/SQL語言基礎2、
PL/SQL的特殊結構
<<BLOCK1>>/*以名字標識PL/SQL塊*/DECLARE
聲明部分BEGIN
執(zhí)行部分EXCEPTION
異常處理部分END<<BLOCK1>>;DECLARE
主塊聲明部分BEGIN
主塊執(zhí)行部分
DECLARE
子塊聲明部分
BEGIN
子塊執(zhí)行部分
EXCEPTION
子塊異常處理部分
END;EXCEPTION
主塊異常處理部分END;帶命名塊的PL/SQL塊嵌套結構的PL/SQL塊7.1PL/SQL語言基礎2、PL/SQL的特殊結構7.1PL/SQL語言基礎7.1.3PL/SQL的字符集1、合法字符,包括:大寫字母A-Z和小寫字母a-z數(shù)字0-9符號()、+、-、*、/、<、>、=、!、~、^、;、:、.、’、@、”、#、$、_、{}、[]、?制表符、空格符、回車符等非顯示的間空符號2、操作符,包括:算術操作符關系操作符邏輯操作符3、其他字符7.1PL/SQL語言基礎7.1.3PL/SQL的字7.1PL/SQL語言基礎7.1.4PL/SQL基本語法1、常量與變量的聲明,語法格式如下:
<常(變)量名>[CONSTANT]<數(shù)據(jù)類型>[NOTNULL][(寬度):=<初始值>]
【例7.1】幾個聲明的例子①聲明一個長度為10B的變量count,初值為1,類型為VARCHAR2。
cvarchar2(10):='1';②聲明一個NUMBER數(shù)據(jù)類型的常量c_limit,并賦予初值5000.00。
c_limitconstantnumber(8.2):=5000.00;③聲明一個NUMBER數(shù)據(jù)類型的常量c_area,并用表達式給它賦初值。
c_areaconstantnumber(8.5):=3.14159*3**2;7.1PL/SQL語言基礎7.1.4PL/SQL基本7.1PL/SQL語言基礎2、作用域變量的作用域指變量的有效使用范圍,它從變量聲明開始,直到當前程序塊結束,只有在其作用域范圍內,程序才能使用該變量,否則將導致編譯錯誤。在同一程序塊中,不允許聲明兩個同名變量,但在不同程序塊內可以聲明兩個同名變量。在程序塊內聲明的變量稱為局部變量,在程序塊外聲明的變量稱為全局變量。引用程序塊內的局部變量不需要加限定詞,而引用塊外的全局變量需要加限定詞(即父塊的名稱)。子塊中可以引用父塊的變量,但是父塊中不能引用子塊的變量。如果父塊與子塊具有相同的變量名,在子塊中引用這個變量時若是不加限定詞則引用的是子塊內的局部變量。若兩個塊不是父子關系,則他們之間的變量不能相互引用。7.1PL/SQL語言基礎2、作用域7.1PL/SQL語言基礎(3)變量的屬性變量有名字和數(shù)據(jù)類型兩個屬性。變量名用于標識該變量,變量的數(shù)據(jù)類型確定了該變量存放值的格式及允許的運算。在PL/SQL中,使用“%”表示屬性提示符,后面緊跟屬性名。%TYPE和%ROWTYPE是PL/SQL中兩個特殊的屬性,常用來定義變量,使被定義變量的數(shù)據(jù)類型與一個已定義變量(或參照表中的記錄)的數(shù)據(jù)類型相一致。%TYPE使用%TYPE屬性定義變量時,被定義變量的數(shù)據(jù)類型與一個已經定義了的變量的數(shù)據(jù)類型相一致,當被參照的變量數(shù)據(jù)類型改變后,新定義變量的數(shù)據(jù)類型也隨之改變。當無法準確知道被參照變量的數(shù)據(jù)類型時,只能采用這種定義方法。定義格式為:<新變量名><被參照表.被參照列>%TYPE7.1PL/SQL語言基礎(3)變量的屬性7.1PL/SQL語言基礎【例7.1】聲明三個變量“v_班級名稱”,“v_班級人數(shù)”,“v_班主任”,其數(shù)據(jù)類型分別對應“班級表”中相應字段的數(shù)據(jù)類型。根據(jù)輸入的班級代碼,輸出對應的班級名稱、人數(shù)和班主任信息。代碼如下:DECLAREv_班級名稱班級表.班級名稱%TYPE;v_班級人數(shù)班級表.班級人數(shù)%TYPE;v_班主任班級表.班主任%TYPE;BEGINSELECT班級名稱,班級人數(shù),班主任intov_班級名稱,v_班級人數(shù),v_班主任FROM班級表WHERE班級代碼='&班級代碼';DBMS_OUTPUT.PUT_LINE('班級名稱:'||v_班級名稱);DBMS_OUTPUT.PUT_LINE('班級人數(shù):'||v_班級人數(shù));DBMS_OUTPUT.PUT_LINE('班主任:'||v_班主任);END;語句:Setserverouton7.1PL/SQL語言基礎【例7.1】聲明三個變量“v7.1PL/SQL語言基礎%ROWTYPE使用%ROWTYPE屬性能夠定義記錄變量,使得被定義的記錄成員個數(shù)、名稱、數(shù)據(jù)類型與已定義的表或視圖中列的個數(shù)、名稱和數(shù)據(jù)類型完全相同。這種定義方式,可以定義一個表,當被參照表中列及數(shù)據(jù)類型改變時,新定義表中的列及數(shù)據(jù)類型自動改變。當一個表有較多列時,使用%ROWTYPE定義記錄,比使用%TYPE要方便,并且不容易出錯。定義格式為:<新表名><被參照表>%ROWTYPE7.1PL/SQL語言基礎%ROWTYPE7.1PL/SQL語言基礎【例7.2】聲明一個變量“v_班級”,與班級表具有相同的數(shù)據(jù)類型。根據(jù)輸入的班級代碼,輸出對應的班級名稱、人數(shù)和班主任信息。代碼如下:DECLAREv_班級班級表%ROWTYPE;BEGINSELECT*intov_班級
FROM班級表WHERE班級代碼='&班級代碼';DBMS_OUTPUT.PUT_LINE('班級名稱:'||v_班級.班級名稱);DBMS_OUTPUT.PUT_LINE('班級人數(shù):'||v_班級.班級人數(shù));DBMS_OUTPUT.PUT_LINE('班主任:'||v_班級.班主任);END;7.1PL/SQL語言基礎【例7.2】聲明一個變量“v7.1PL/SQL語言基礎3、數(shù)據(jù)類型標量類型LOB型數(shù)據(jù)類型定義的運算符7.1PL/SQL語言基礎3、數(shù)據(jù)類型7.1PL/SQL語言基礎【例7.3】聲明一個TIMESTAMP類型的變量,并為它賦值。代碼如下:SETSERVEROUTONDECLAREcheckoutTIMESTAMP(2);BEGINcheckout:='10-6月-07075';DBMS_OUTPUT.PUT_LINE(checkout);END;7.1PL/SQL語言基礎【例7.3】聲明一個TIME7.2PL/SQL程序結構7.2.1選擇結構選擇結構又稱條件控制,通過先測試一個條件,根據(jù)測試結果選擇運行不同的語句段。選擇結構允許嵌套執(zhí)行。選擇結構常用到的4種語法格式:IF…THEN…ENDIF結構IF…THEN…ELSE…ENDIF結構IF…THEN…ELSIF…ENDIF結構CASE結構7.2PL/SQL程序結構7.2.1選擇結構7.2PL/SQL程序結構【例7.4】查找“ASP.NET程序設計”課程,若是“備注”信息為“C#”,將其改為“J#”,否則將“備注”信息置空。7.2PL/SQL程序結構【例7.4】查找“ASP.N7.2PL/SQL程序結構
DECLARE
v_課程課程表%ROWTYPE;
BEGIN
SELECT*INTOv_課程FROM課程表
WHERE課程名='ASP.NET程序設計';
IFv_課程.備注='C#'THEN
UPDATE課程表
SET備注='J#'
WHERE課程名=v_課程.課程名;
ELSE
UPDATE課程表
SET備注=''
WHERE課程名=v_課程.課程名;
ENDIF;
DBMS_OUTPUT.PUT_LINE('更新完成!');
END;
試一試:數(shù)據(jù)被修改了嗎?為什么?作業(yè)一、用你熟悉的方法完成該問題,比較兩種方法。7.2PL/SQL程序結構DECLARE7.2PL/SQL程序結構【例7.5】學生成績按照分數(shù)段分為“優(yōu)秀”、“良好”、“合格”、“不及格”4種等級,根據(jù)等級的不同,可以輸出對應的分數(shù)段,代碼如下:DECLAREv_resultVARCHAR2(20):='良好';BEGINIFv_result='優(yōu)秀'THENDBMS_OUTPUT.PUT_LINE('90~100');ELSIFv_result='良好'THENDBMS_OUTPUT.PUT_LINE('80~89');ELSIFv_result='合格'THENDBMS_OUTPUT.PUT_LINE('60~79');ELSIFv_result='不及格'THENDBMS_OUTPUT.PUT_LINE('<60');ELSEDBMS_OUTPUT.PUT_LINE('不存在該等級');ENDIF;END;7.2PL/SQL程序結構【例7.5】學生成績按照分數(shù)7.2PL/SQL程序結構【例7.6】從“成績表”中根據(jù)學生的學號和課程號查找學生某門課程的成績,并輸出成績的等級。采用CASE語法格式:7.2PL/SQL程序結構【例7.6】從“成績表”中根7.2PL/SQL程序結構DECLAREv_scoreNUMBER(3);BEGINSELECT成績intov_scoreFROM成績表WHERE學號=&學號and課程號=&課程號;CASEWHEN(v_score>=90andv_score<=100)THENDBMS_OUTPUT.PUT_LINE('成績:'||v_score||'優(yōu)秀');WHEN(v_score>=80andv_score<90)THENDBMS_OUTPUT.PUT_LINE('成績:'||v_score||'良好');WHEN(v_score>=60andv_score<80)THENDBMS_OUTPUT.PUT_LINE('成績:'||v_score||'合格');WHEN(v_score>=0andv_score<60)THENDBMS_OUTPUT.PUT_LINE('成績:'||v_score||'不及格');ELSEDBMS_OUTPUT.PUT_LINE('成績:'||v_score||'成績異常');ENDCASE;END;7.2PL/SQL程序結構DECLARE7.2PL/SQL程序結構【例7.7】使用CASE語句完成例7.5程序。要求使用CASE語句第二種語法格式實現(xiàn),代碼如下:DECLAREv_resultVARCHAR2(20):='良好';BEGINCASEv_resultWHEN'優(yōu)秀'THENDBMS_OUTPUT.PUT_LINE('90~100');WHEN'良好'THENDBMS_OUTPUT.PUT_LINE('80~89');WHEN'合格'THENDBMS_OUTPUT.PUT_LINE('60~79');WHEN'不及格'THENDBMS_OUTPUT.PUT_LINE('<60');ELSEDBMS_OUTPUT.PUT_LINE('不存在該等級');ENDCASE;END;7.2PL/SQL程序結構【例7.7】使用CASE語句7.2PL/SQL程序結構7.2.2循環(huán)結構循環(huán)結構可以對一段語句反復執(zhí)行,直到滿足某一條件,跳出循環(huán)
。循環(huán)結構常用到的3種語法格式:LOOP…ENDLOOP結構WHILE…LOOP…ENDLOOP結構FOR…LOOP…ENDLOOP結構7.2PL/SQL程序結構7.2.2循環(huán)結構7.2PL/SQL程序結構【例7.8】利用LOOP循環(huán)和EXIT語句計算1至100的自然數(shù)之和。代碼如下:DECLAREv_iNUMBER:=1;v_sNUMBER:=0;BEGINLOOPEXITWHENv_i>100;v_s:=v_s+v_i;v_i:=v_i+1;ENDLOOP;DBMS_OUTPUT.PUT_LINE('1~100自然數(shù)之和:'||v_s);END;7.2PL/SQL程序結構【例7.8】利用LOOP循環(huán)7.2PL/SQL程序結構【例7.9】利用WHILE循環(huán)計算1至100的自然數(shù)之和。代碼如下:DECLAREv_iNUMBER:=0;v_sNUMBER:=0;BEGINWHILEv_i<=100LOOPv_s:=v_s+v_i;v_i:=v_i+1;ENDLOOP;DBMS_OUTPUT.PUT_LINE('1~100自然數(shù)之和:'||v_s);END;7.2PL/SQL程序結構【例7.9】利用WHILE循7.2PL/SQL程序結構【例7.10】利用FOR循環(huán)語句計算1至100的自然數(shù)之和。代碼如下:DECLAREv_sNUMBER:=0;BEGINFORv_iIN1..100LOOPv_s:=v_s+v_i;ENDLOOP;DBMS_OUTPUT.PUT_LINE('1~100自然數(shù)之和:'||v_s);END;思考題:如何利用循環(huán)語句生成數(shù)據(jù)?7.2PL/SQL程序結構【例7.10】利用FOR循環(huán)7.2PL/SQL程序結構7.2.3順序結構順序結構是一種最簡單的控制結構,程序按語句順序依次執(zhí)行。有時為了打破執(zhí)行順序,將當前程序跳轉到另一個地方繼續(xù)運行,需要借助GOTO語句。GOTO語句是一種無條件跳轉語句,能夠將語句無條件地跳轉到一個用標簽指定的語句,其目的地必須與GOTO語句在同一程序塊中或更高層次(比如父塊中)中。但過多的使用GOTO語句會導致程序復雜,破壞程序的結構。因此,GOTO語句一般只用在從一個PL/SQL塊中跳轉到異常處理語句的前面7.2PL/SQL程序結構7.2.3順序結構7.2PL/SQL程序結構【例7.11】利用GOTO語句計算1至100的自然數(shù)之和。代碼如下:DECLAREv_iNUMBER:=0;v_sNUMBER:=0;BEGIN<<label_1>>v_i:=v_i+1;IFv_i<=100THENv_s:=v_s+v_i;GOTOlabel_1;ENDIF;DBMS_OUTPUT.PUT_LINE('1~100自然數(shù)之和:'||v_s);END;7.2PL/SQL程序結構【例7.11】利用GOTO語7.2PL/SQL程序結構7.2.4NULL結構NULL語句是一個空操作的執(zhí)行語句,通過執(zhí)行NULL語句,可以直接將控制傳遞到下一條語句,以提高PL/SQL塊的可讀性?!纠?.12】根據(jù)輸入的學生學號和課程號,從“成績表”中查找學生的課程成績,如果成績低于60分,將“是否補考”字段的值修改為“是”,否則不執(zhí)行任何操作。
7.2PL/SQL程序結構7.2.4NULL結構7.2PL/SQL程序結構
DECLARE
v_學號成績表.學號%TYPE;
v_課程號成績表.課程號%TYPE;
v_成績成績表.成績%TYPE;
BEGIN
v_學號:='&學號';
v_課程號:='&課程號';
SELECT成績INTOv_成績FROM成績表
WHERE學號=v_學號AND課程號=v_課程號;
IFv_成績<60THEN
UPDATE成績表SET是否補考='是'
WHERE學號=v_學號AND課程號=v_課程號;
DBMS_OUTPUT.PUT_LINE(v_學號||'號學生'||v_課程號||'號課程'||'成績?yōu)椋?/p>
'||v_成績||'需要補考');
ELSE
NULL;
ENDIF;
END;思考:如何對表中所有數(shù)據(jù)進行判斷并設置補考信息?7.2PL/SQL程序結構DECLARE7.3異常處理注意:commit語句7.3異常處理在語句執(zhí)行過程中,因為各種原因是的語句不能正常執(zhí)行時,就有可能造成更大錯誤或整個系統(tǒng)的崩潰,所以應該采取必要的措施來防止這種情況的發(fā)生。PL/SQL提供了異常這一處理錯誤情況的方法。在PL/SQL代碼部分執(zhí)行的過程中無論何時發(fā)生錯誤,控制將自動轉向執(zhí)行異常部分。PL/SQL有三種異常:系統(tǒng)預定義異常、非預定義異常和用戶自定義異常。7.3異常處理注意:commit語句7.3異常處理7.3.1系統(tǒng)預定義異常系統(tǒng)預定義異常處理是針對PL/SQL程序編譯、執(zhí)行過程中發(fā)生的問題進行處理的程序,當一段PL/SQL程序違反Oracle規(guī)則或是超出系統(tǒng)特定限制時就會引發(fā)異常。例如,如果SELECTINTO語句沒有返回記錄,或者在已經達到結果集末尾的情況下,Oracle將激活預定義異常NO_DATA_FOUND。系統(tǒng)中預定義的異常如表7-9所示。7.3異常處理7.3.1系統(tǒng)預定義異常7.3異常處理系統(tǒng)預定義異常的拋出和處理的語法格式如下:EXCEPTIONWHEN異常名1[OR異常名2…]THEN
異常處理段1;[WHEN異常名3[OR異常名4…]THEN
異常處理段2;[WHENOTHERSTHEN
異常處理段3;]]7.3異常處理系統(tǒng)預定義異常的拋出和處理的語法格式如下:7.3異常處理【例7.13】根據(jù)輸入的學生姓名,在“學生表”中查找并輸出其相關信息,如果不存在該學生,進行異常處理。代碼如下:7.3異常處理【例7.13】根據(jù)輸入的學生姓名,在“學生7.3異常處理DECLAREv_學號學生表.學號%TYPE;v_性別學生表.性別%TYPE;v_入學時間學生表.入學時間%TYPE;BEGINSELECT學號,性別,入學時間INTOv_學號,v_性別,v_入學時間FROM學生表WHERE姓名='&姓名';DBMS_OUTPUT.PUT_LINE('學號:'||v_學號);DBMS_OUTPUT.PUT_LINE('性別:'||v_性別);DBMS_OUTPUT.PUT_LINE('入學時間:'||v_入學時間);EXCEPTION WHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE('沒有該學生!');END;作業(yè)二、用%ROWTYPE完成上述問題。7.3異常處理DECLARE7.3異常處理7.3.2非預定義異常預定義異常只能用于處理21種Oracle系統(tǒng)異常,而PL/SQL塊運行時可能還會遭遇其他Oracle異常,為了提高PL/SQL程序塊的健壯性,系統(tǒng)提供了非預定義異常,用于處理與預定義異常無關的Oracle異常。非預定義異常處理步驟如下:在聲明部分,用EXCEPTION類型定義異常的名稱。在聲明部分,使用EXCEPTION_INIT編譯指令建立該異常名稱與某個Oracle異常的關聯(lián)。當該Oracle異常發(fā)生時,就會自動進行處理。在異常處理部分,處理異常。7.3異常處理7.3.2非預定義異常7.3異常處理EXCEPTION_INIT的語法格式為:PRAGMAEXCEPTION_INIT(exception_name,oracle_error_code)其中:exception_name是定義的異常名稱;oracle_error_code是Oracle的異常代碼。7.3異常處理EXCEPTION_INIT的語法格式為:7.3異常處理【例7.14】“學生表”中學號字段不允許為空,當插入一個空值時,系統(tǒng)會產生錯誤代碼為-1400(-01400)的異常,對這個錯誤進行異常處理的代碼如下:
DECLARE
e_null_errorEXCEPTION;
pragmaEXCEPTION_INIT(e_null_error,-1400);
BEGIN
INSERTINTO學生表VALUES(NULL,'張健','男','12-3月-1987','18-9月-2006','保定市','060101001');
EXCEPTION
WHENe_null_errorTHEN
DBMS_OUTPUT.PUT_LINE('不能向學號列插入NULL');
END;7.3異常處理【例7.14】“學生表”中學號字段不允許為7.3異常處理7.3.3自定義異常自定義異常是由PL/SQL程序員定義的異常,它并不一定是一個錯誤,而是程序員根據(jù)編程和調試的需要而為特殊情況所定義的異常。自定義異常必須要聲明,并且用RAISE語句觸發(fā)異常,使用自定義異常的步驟如下:在聲明部分,用EXCEPTION類型定義異常錯誤的名稱。在執(zhí)行部分,當出現(xiàn)異常情況時,使用RAISE語句觸發(fā)異常。在異常處理部分,處理異常錯誤。7.3異常處理7.3.3自定義異常7.3異常處理【例7.15】根據(jù)學號統(tǒng)計學生某學期選課門數(shù),如果選課超過3門,則提示異常信息。代碼如下:7.3異常處理【例7.15】根據(jù)學號統(tǒng)計學生某學期選課門DECLAREv_學號選課表.學號%TYPE;v_學年學期選課表.學年學期%TYPE;v_countNUMBER;e_lesson_errorEXCEPTION;BEGINv_學號:='&學號';v_學年學期:='&學年學期';SELECTcount(*)INTOv_countFROM選課表WHERE學號=v_學號and學年學期=v_學年學期;IFv_count>3THENRAISE
e_lesson_error;ELSEDBMS_OUTPUT.PUT_LINE(v_學號||'號學生'||v_學年學期||'學期選課'||v_count||'門,選課正常。');ENDIF;EXCEPTIONWHENe_lesson_errorTHENDBMS_OUTPUT.PUT_LINE(v_學號||'號學生'||v_學年學期||'學期選課'||v_count||'門,超過3門。');END;作業(yè):用其他方法實現(xiàn)上述問題。DECLARE第7章PL/SQL編程第7章PL/SQL編程PL/SQL編程7.1PL/SQL語言基礎7.2PL/SQL程序結構7.3異常處理PL/SQL編程7.1PL/SQL語言基礎7.1PL/SQL語言基礎7.1.1PL/SQL語言優(yōu)點PL/SQL是一種高效的事務處理語言,它具備以下優(yōu)點:PL/SQL是一種高性能的基于事務處理的語言,能運行在任何Oracle環(huán)境中,支持所有數(shù)據(jù)處理命令。通過使用PL/SQL程序單元處理SQL的數(shù)據(jù)定義和數(shù)據(jù)控制元素。PL/SQL支持所有SQL數(shù)據(jù)類型和所有SQL函數(shù),同時支持所有Oracle對象類型。PL/SQL塊可以被命名并存儲在Oracle服務器中,同時也能被其他PL/SQL程序或SQL命令調用,任何客戶/服務器工具都能訪問PL/SQL程序,具有很好的可重用性??梢允褂肙racle數(shù)據(jù)工具管理PL/SQL程序的安全性。可以授權或撤銷數(shù)據(jù)庫其他用戶訪問PL/SQL程序權限。7.1PL/SQL語言基礎7.1.1PL/SQL語言7.1PL/SQL語言基礎PL/SQL代碼可以使用任何ASCII文本編輯器編寫,所以對任何能夠運行Oracle的操作系統(tǒng)都是非常便利的。對于SQL,Oracle必須在同一時間處理每一條SQL語句,在網絡環(huán)境下這就意味著每一個獨立的調用都必須被Oracle服務器處理,從而占用大量的服務器時間,導致網絡擁擠。而PL/SQL以整個語句塊形式發(fā)給服務器,可以減少網絡擁擠。7.1PL/SQL語言基礎PL/SQL代碼可以使用任何7.1PL/SQL語言基礎7.1.2PL/SQL的基本結構一個PL/SQL程序包含一個或多個邏輯塊,每個塊都可以劃分為三個部分:聲明部分(用DECLARE開頭)、執(zhí)行部分(以BEGIN開頭)和異常處理部分(以EXCEPTION開頭)
1、PL/SQL基本結構如下:
DECLARE
聲明部分
BEGIN
執(zhí)行部分
EXCEPTION
異常處理部分
END;7.1PL/SQL語言基礎7.1.2PL/SQL的基7.1PL/SQL語言基礎其中:聲明部分:定義變量和常量的數(shù)據(jù)類型和初始值,以及程序中要使用的函數(shù)、游標、異常處理名稱等。如果沒有需要聲明的內容,可以省略這一部分。PL/SQL中要使用的所有定義都必須在這一部分進行集中定義。執(zhí)行部分:此部分是PL/SQL塊中的指令部分,所有的可執(zhí)行語句都放在這一部分,包括對數(shù)據(jù)庫的操作語句和各種流程控制語句,也可以嵌套其他的PL/SQL塊。執(zhí)行部分至少包含一條可執(zhí)行語句。異常處理部分:包含在執(zhí)行部分中,以關鍵字EXCEPTION開始,到END結束。當程序檢測到錯誤而產生異常時,就轉到由EXCEPTION標識的部分執(zhí)行異常處理程序。這部分是可選的,利用異常處理可以提高PL/SQL程序的健壯性。7.1PL/SQL語言基礎其中:7.1PL/SQL語言基礎2、
PL/SQL的特殊結構
<<BLOCK1>>/*以名字標識PL/SQL塊*/DECLARE
聲明部分BEGIN
執(zhí)行部分EXCEPTION
異常處理部分END<<BLOCK1>>;DECLARE
主塊聲明部分BEGIN
主塊執(zhí)行部分
DECLARE
子塊聲明部分
BEGIN
子塊執(zhí)行部分
EXCEPTION
子塊異常處理部分
END;EXCEPTION
主塊異常處理部分END;帶命名塊的PL/SQL塊嵌套結構的PL/SQL塊7.1PL/SQL語言基礎2、PL/SQL的特殊結構7.1PL/SQL語言基礎7.1.3PL/SQL的字符集1、合法字符,包括:大寫字母A-Z和小寫字母a-z數(shù)字0-9符號()、+、-、*、/、<、>、=、!、~、^、;、:、.、’、@、”、#、$、_、{}、[]、?制表符、空格符、回車符等非顯示的間空符號2、操作符,包括:算術操作符關系操作符邏輯操作符3、其他字符7.1PL/SQL語言基礎7.1.3PL/SQL的字7.1PL/SQL語言基礎7.1.4PL/SQL基本語法1、常量與變量的聲明,語法格式如下:
<常(變)量名>[CONSTANT]<數(shù)據(jù)類型>[NOTNULL][(寬度):=<初始值>]
【例7.1】幾個聲明的例子①聲明一個長度為10B的變量count,初值為1,類型為VARCHAR2。
cvarchar2(10):='1';②聲明一個NUMBER數(shù)據(jù)類型的常量c_limit,并賦予初值5000.00。
c_limitconstantnumber(8.2):=5000.00;③聲明一個NUMBER數(shù)據(jù)類型的常量c_area,并用表達式給它賦初值。
c_areaconstantnumber(8.5):=3.14159*3**2;7.1PL/SQL語言基礎7.1.4PL/SQL基本7.1PL/SQL語言基礎2、作用域變量的作用域指變量的有效使用范圍,它從變量聲明開始,直到當前程序塊結束,只有在其作用域范圍內,程序才能使用該變量,否則將導致編譯錯誤。在同一程序塊中,不允許聲明兩個同名變量,但在不同程序塊內可以聲明兩個同名變量。在程序塊內聲明的變量稱為局部變量,在程序塊外聲明的變量稱為全局變量。引用程序塊內的局部變量不需要加限定詞,而引用塊外的全局變量需要加限定詞(即父塊的名稱)。子塊中可以引用父塊的變量,但是父塊中不能引用子塊的變量。如果父塊與子塊具有相同的變量名,在子塊中引用這個變量時若是不加限定詞則引用的是子塊內的局部變量。若兩個塊不是父子關系,則他們之間的變量不能相互引用。7.1PL/SQL語言基礎2、作用域7.1PL/SQL語言基礎(3)變量的屬性變量有名字和數(shù)據(jù)類型兩個屬性。變量名用于標識該變量,變量的數(shù)據(jù)類型確定了該變量存放值的格式及允許的運算。在PL/SQL中,使用“%”表示屬性提示符,后面緊跟屬性名。%TYPE和%ROWTYPE是PL/SQL中兩個特殊的屬性,常用來定義變量,使被定義變量的數(shù)據(jù)類型與一個已定義變量(或參照表中的記錄)的數(shù)據(jù)類型相一致。%TYPE使用%TYPE屬性定義變量時,被定義變量的數(shù)據(jù)類型與一個已經定義了的變量的數(shù)據(jù)類型相一致,當被參照的變量數(shù)據(jù)類型改變后,新定義變量的數(shù)據(jù)類型也隨之改變。當無法準確知道被參照變量的數(shù)據(jù)類型時,只能采用這種定義方法。定義格式為:<新變量名><被參照表.被參照列>%TYPE7.1PL/SQL語言基礎(3)變量的屬性7.1PL/SQL語言基礎【例7.1】聲明三個變量“v_班級名稱”,“v_班級人數(shù)”,“v_班主任”,其數(shù)據(jù)類型分別對應“班級表”中相應字段的數(shù)據(jù)類型。根據(jù)輸入的班級代碼,輸出對應的班級名稱、人數(shù)和班主任信息。代碼如下:DECLAREv_班級名稱班級表.班級名稱%TYPE;v_班級人數(shù)班級表.班級人數(shù)%TYPE;v_班主任班級表.班主任%TYPE;BEGINSELECT班級名稱,班級人數(shù),班主任intov_班級名稱,v_班級人數(shù),v_班主任FROM班級表WHERE班級代碼='&班級代碼';DBMS_OUTPUT.PUT_LINE('班級名稱:'||v_班級名稱);DBMS_OUTPUT.PUT_LINE('班級人數(shù):'||v_班級人數(shù));DBMS_OUTPUT.PUT_LINE('班主任:'||v_班主任);END;語句:Setserverouton7.1PL/SQL語言基礎【例7.1】聲明三個變量“v7.1PL/SQL語言基礎%ROWTYPE使用%ROWTYPE屬性能夠定義記錄變量,使得被定義的記錄成員個數(shù)、名稱、數(shù)據(jù)類型與已定義的表或視圖中列的個數(shù)、名稱和數(shù)據(jù)類型完全相同。這種定義方式,可以定義一個表,當被參照表中列及數(shù)據(jù)類型改變時,新定義表中的列及數(shù)據(jù)類型自動改變。當一個表有較多列時,使用%ROWTYPE定義記錄,比使用%TYPE要方便,并且不容易出錯。定義格式為:<新表名><被參照表>%ROWTYPE7.1PL/SQL語言基礎%ROWTYPE7.1PL/SQL語言基礎【例7.2】聲明一個變量“v_班級”,與班級表具有相同的數(shù)據(jù)類型。根據(jù)輸入的班級代碼,輸出對應的班級名稱、人數(shù)和班主任信息。代碼如下:DECLAREv_班級班級表%ROWTYPE;BEGINSELECT*intov_班級
FROM班級表WHERE班級代碼='&班級代碼';DBMS_OUTPUT.PUT_LINE('班級名稱:'||v_班級.班級名稱);DBMS_OUTPUT.PUT_LINE('班級人數(shù):'||v_班級.班級人數(shù));DBMS_OUTPUT.PUT_LINE('班主任:'||v_班級.班主任);END;7.1PL/SQL語言基礎【例7.2】聲明一個變量“v7.1PL/SQL語言基礎3、數(shù)據(jù)類型標量類型LOB型數(shù)據(jù)類型定義的運算符7.1PL/SQL語言基礎3、數(shù)據(jù)類型7.1PL/SQL語言基礎【例7.3】聲明一個TIMESTAMP類型的變量,并為它賦值。代碼如下:SETSERVEROUTONDECLAREcheckoutTIMESTAMP(2);BEGINcheckout:='10-6月-07075';DBMS_OUTPUT.PUT_LINE(checkout);END;7.1PL/SQL語言基礎【例7.3】聲明一個TIME7.2PL/SQL程序結構7.2.1選擇結構選擇結構又稱條件控制,通過先測試一個條件,根據(jù)測試結果選擇運行不同的語句段。選擇結構允許嵌套執(zhí)行。選擇結構常用到的4種語法格式:IF…THEN…ENDIF結構IF…THEN…ELSE…ENDIF結構IF…THEN…ELSIF…ENDIF結構CASE結構7.2PL/SQL程序結構7.2.1選擇結構7.2PL/SQL程序結構【例7.4】查找“ASP.NET程序設計”課程,若是“備注”信息為“C#”,將其改為“J#”,否則將“備注”信息置空。7.2PL/SQL程序結構【例7.4】查找“ASP.N7.2PL/SQL程序結構
DECLARE
v_課程課程表%ROWTYPE;
BEGIN
SELECT*INTOv_課程FROM課程表
WHERE課程名='ASP.NET程序設計';
IFv_課程.備注='C#'THEN
UPDATE課程表
SET備注='J#'
WHERE課程名=v_課程.課程名;
ELSE
UPDATE課程表
SET備注=''
WHERE課程名=v_課程.課程名;
ENDIF;
DBMS_OUTPUT.PUT_LINE('更新完成!');
END;
試一試:數(shù)據(jù)被修改了嗎?為什么?作業(yè)一、用你熟悉的方法完成該問題,比較兩種方法。7.2PL/SQL程序結構DECLARE7.2PL/SQL程序結構【例7.5】學生成績按照分數(shù)段分為“優(yōu)秀”、“良好”、“合格”、“不及格”4種等級,根據(jù)等級的不同,可以輸出對應的分數(shù)段,代碼如下:DECLAREv_resultVARCHAR2(20):='良好';BEGINIFv_result='優(yōu)秀'THENDBMS_OUTPUT.PUT_LINE('90~100');ELSIFv_result='良好'THENDBMS_OUTPUT.PUT_LINE('80~89');ELSIFv_result='合格'THENDBMS_OUTPUT.PUT_LINE('60~79');ELSIFv_result='不及格'THENDBMS_OUTPUT.PUT_LINE('<60');ELSEDBMS_OUTPUT.PUT_LINE('不存在該等級');ENDIF;END;7.2PL/SQL程序結構【例7.5】學生成績按照分數(shù)7.2PL/SQL程序結構【例7.6】從“成績表”中根據(jù)學生的學號和課程號查找學生某門課程的成績,并輸出成績的等級。采用CASE語法格式:7.2PL/SQL程序結構【例7.6】從“成績表”中根7.2PL/SQL程序結構DECLAREv_scoreNUMBER(3);BEGINSELECT成績intov_scoreFROM成績表WHERE學號=&學號and課程號=&課程號;CASEWHEN(v_score>=90andv_score<=100)THENDBMS_OUTPUT.PUT_LINE('成績:'||v_score||'優(yōu)秀');WHEN(v_score>=80andv_score<90)THENDBMS_OUTPUT.PUT_LINE('成績:'||v_score||'良好');WHEN(v_score>=60andv_score<80)THENDBMS_OUTPUT.PUT_LINE('成績:'||v_score||'合格');WHEN(v_score>=0andv_score<60)THENDBMS_OUTPUT.PUT_LINE('成績:'||v_score||'不及格');ELSEDBMS_OUTPUT.PUT_LINE('成績:'||v_score||'成績異常');ENDCASE;END;7.2PL/SQL程序結構DECLARE7.2PL/SQL程序結構【例7.7】使用CASE語句完成例7.5程序。要求使用CASE語句第二種語法格式實現(xiàn),代碼如下:DECLAREv_resultVARCHAR2(20):='良好';BEGINCASEv_resultWHEN'優(yōu)秀'THENDBMS_OUTPUT.PUT_LINE('90~100');WHEN'良好'THENDBMS_OUTPUT.PUT_LINE('80~89');WHEN'合格'THENDBMS_OUTPUT.PUT_LINE('60~79');WHEN'不及格'THENDBMS_OUTPUT.PUT_LINE('<60');ELSEDBMS_OUTPUT.PUT_LINE('不存在該等級');ENDCASE;END;7.2PL/SQL程序結構【例7.7】使用CASE語句7.2PL/SQL程序結構7.2.2循環(huán)結構循環(huán)結構可以對一段語句反復執(zhí)行,直到滿足某一條件,跳出循環(huán)
。循環(huán)結構常用到的3種語法格式:LOOP…ENDLOOP結構WHILE…LOOP…ENDLOOP結構FOR…LOOP…ENDLOOP結構7.2PL/SQL程序結構7.2.2循環(huán)結構7.2PL/SQL程序結構【例7.8】利用LOOP循環(huán)和EXIT語句計算1至100的自然數(shù)之和。代碼如下:DECLAREv_iNUMBER:=1;v_sNUMBER:=0;BEGINLOOPEXITWHENv_i>100;v_s:=v_s+v_i;v_i:=v_i+1;ENDLOOP;DBMS_OUTPUT.PUT_LINE('1~100自然數(shù)之和:'||v_s);END;7.2PL/SQL程序結構【例7.8】利用LOOP循環(huán)7.2PL/SQL程序結構【例7.9】利用WHILE循環(huán)計算1至100的自然數(shù)之和。代碼如下:DECLAREv_iNUMBER:=0;v_sNUMBER:=0;BEGINWHILEv_i<=100LOOPv_s:=v_s+v_i;v_i:=v_i+1;ENDLOOP;DBMS_OUTPUT.PUT_LINE('1~100自然數(shù)之和:'||v_s);END;7.2PL/SQL程序結構【例7.9】利用WHILE循7.2PL/SQL程序結構【例7.10】利用FOR循環(huán)語句計算1至100的自然數(shù)之和。代碼如下:DECLAREv_sNUMBER:=0;BEGINFORv_iIN1..100LOOPv_s:=v_s+v_i;ENDLOOP;DBMS_OUTPUT.PUT_LINE('1~100自然數(shù)之和:'||v_s);END;思考題:如何利用循環(huán)語句生成數(shù)據(jù)?7.2PL/SQL程序結構【例7.10】利用FOR循環(huán)7.2PL/SQL程序結構7.2.3順序結構順序結構是一種最簡單的控制結構,程序按語句順序依次執(zhí)行。有時為了打破執(zhí)行順序,將當前程序跳轉到另一個地方繼續(xù)運行,需要借助GOTO語句。GOTO語句是一種無條件跳轉語句,能夠將語句無條件地跳轉到一個用標簽指定的語句,其目的地必須與GOTO語句在同一程序塊中或更高層次(比如父塊中)中。但過多的使用GOTO語句會導致程序復雜,破壞程序的結構。因此,GOTO語句一般只用在從一個PL/SQL塊中跳轉到異常處理語句的前面7.2PL/SQL程序結構7.2.3順序結構7.2PL/SQL程序結構【例7.11】利用GOTO語句計算1至100的自然數(shù)之和。代碼如下:DECLAREv_iNUMBER:=0;v_sNUMBER:=0;BEGIN<<label_1>>v_i:=v_i+1;IFv_i<=100THENv_s:=v_s+v_i;GOTOlabel_1;ENDIF;DBMS_OUTPUT.PUT_LINE('1~100自然數(shù)之和:'||v_s);END;7.2PL/SQL程序結構【例7.11】利用GOTO語7.2PL/SQL程序結構7.2.4NULL結構NULL語句是一個空操作的執(zhí)行語句,通過執(zhí)行NULL語句,可以直接將控制傳遞到下一條語句,以提高PL/SQL塊的可讀性?!纠?.12】根據(jù)輸入的學生學號和課程號,從“成績表”中查找學生的課程成績,如果成績低于60分,將“是否補考”字段的值修改為“是”,否則不執(zhí)行任何操作。
7.2PL/SQL程序結構7.2.4NULL結構7.2PL/SQL程序結構
DECLARE
v_學號成績表.學號%TYPE;
v_課程號成績表.課程號%TYPE;
v_成績成績表.成績%TYPE;
BEGIN
v_學號:='&學號';
v_課程號:='&課程號';
SELECT成績INTOv_成績FROM成績表
WHERE學號=v_學號AND課程號=v_課程號;
IFv_成績<60THEN
UPDATE成績表SET是否補考='是'
WHERE學號=v_學號AND課程號=v_課程號;
DBMS_OUTPUT.PUT_LINE(v_學號||'號學生'||v_課程號||'號課程'||'成績?yōu)椋?/p>
'||v_成績||'需要補考');
ELSE
NULL;
ENDIF;
END;思考:如何對表中所有數(shù)據(jù)進行判斷并設置補考信息?7.2PL/SQL程序結構DECLARE7.3異常處理注意:commit語句7.3異常處理在語句執(zhí)行過程中,因為各種原因是的語句不能正常執(zhí)行時,就有可能造成更大錯誤或整個系統(tǒng)的崩潰,所以應該采取必要的措施來防止這種情況的發(fā)生。PL/SQL提供了異常這一處理錯誤情況的方法。在PL/SQL代碼部分執(zhí)行的過程中無論何時發(fā)生錯誤,控制將自動轉向執(zhí)行異常部分。PL/SQL有三種異常:系統(tǒng)預定義異常、非預定義異常和用戶自定義異常。7.3異常處理注意:commit語句7.3異常處理7.3.1系統(tǒng)預定義異常系統(tǒng)預定義異常處理是針對PL/SQL程序編譯、執(zhí)行過程中發(fā)生的問題進行處理的程序,當一段PL/SQL程序違反Oracle規(guī)則或是超出系統(tǒng)特定限制時就會引發(fā)異常。例如,如果SELECTINTO語句沒有返回記錄,或者在已經達到結果集末尾的情況下,Oracle將激活預定義異常NO_DATA_FOUND。系統(tǒng)中預定義的異常如表7-9所示。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)院業(yè)務副院長職責(五篇)
- 網絡課程設計的分類
- 網頁課程設計摘要模板
- 網上書店c 課程設計
- 微機原理通訊錄課程設計
- 聯(lián)想記憶課程設計
- 電話禮儀課程設計
- 職工系統(tǒng)Delphi課程設計
- 家政保潔公司營業(yè)員服務總結
- 美的物流課程設計
- (八省聯(lián)考)2025年高考綜合改革適應性演練 語文試卷(含答案解析)
- 數(shù)字媒體技術應用基礎知識單選題及答案解析
- GB/T 45002-2024水泥膠砂保水率測定方法
- 2025年高考歷史復習之小題狂練300題(選擇題):世界多極化與經濟全球化(20題)
- ISO 56001-2024《創(chuàng)新管理體系-要求》專業(yè)解讀與應用實踐指導材料之1:0 引言(雷澤佳編制-2025B0)
- 2024版環(huán)衛(wèi)清潔班車租賃服務協(xié)議3篇
- 生產安全事故事件管理知識培訓課件
- 項目施工單位與當?shù)卣按迕竦膮f(xié)調措施
- 藥劑科工作人員的專業(yè)提升計劃
- 2024年《論教育》全文課件
- 浙江省溫州市鹿城區(qū)2023-2024學年三年級上學期期末數(shù)學試卷
評論
0/150
提交評論