數(shù)據(jù)庫系統(tǒng)原理-第九章 服務(wù)器環(huán)境下的SQL_第1頁
數(shù)據(jù)庫系統(tǒng)原理-第九章 服務(wù)器環(huán)境下的SQL_第2頁
數(shù)據(jù)庫系統(tǒng)原理-第九章 服務(wù)器環(huán)境下的SQL_第3頁
數(shù)據(jù)庫系統(tǒng)原理-第九章 服務(wù)器環(huán)境下的SQL_第4頁
數(shù)據(jù)庫系統(tǒng)原理-第九章 服務(wù)器環(huán)境下的SQL_第5頁
已閱讀5頁,還剩71頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第第9章章 服務(wù)器環(huán)境下的服務(wù)器環(huán)境下的SQL 9.1 三層體系結(jié)構(gòu)9.2 SQL環(huán)境9.3 SQL/宿主語言接口9.4 存儲過程9.5 使用調(diào)用層接口Page 19.1 三層體系結(jié)構(gòu) 具有三種不同而又相互聯(lián)系的功能: Web服務(wù)器 指那些連接客戶端和數(shù)據(jù)庫系統(tǒng)的進程 應(yīng)用服務(wù)器 系統(tǒng)要做的所有操作。 數(shù)據(jù)庫服務(wù)器 這些進程運行DBMS并執(zhí)行應(yīng)用服務(wù)器請求的查詢和更新。Page 2Web服務(wù)器 Web服務(wù)器進程管理與用戶交互,當(dāng)用戶發(fā)起連接時,可通過打開URL,Web服務(wù)器則響應(yīng)用戶請求。之后用戶便成為Web服務(wù)器進程的一個客戶端。Page 3應(yīng)用層 應(yīng)用層的工作是將數(shù)據(jù)作為響應(yīng)從數(shù)據(jù)庫發(fā)回給

2、那些從Web服務(wù)器獲得的請求。每個Web服務(wù)器的進程可以調(diào)用一個或多個應(yīng)用層的進程來處理請求。 被應(yīng)用層執(zhí)行的操作通常稱為數(shù)據(jù)庫運行結(jié)構(gòu)的交易邏輯。即應(yīng)用層是根據(jù)推理潛在客戶的請求響應(yīng)和實現(xiàn)這些推理的策略來設(shè)計。Page 4數(shù)據(jù)庫層 數(shù)據(jù)庫層具有多個進程,它們能被分配到多臺機器,也可以在一臺機器上共同工作。數(shù)據(jù)庫層負責(zé)執(zhí)行來自應(yīng)用層請求的查詢,另外提供一些數(shù)據(jù)緩沖。 由于與數(shù)據(jù)庫連接的時間不能忽略,通常保持一定數(shù)量的連接處于開放狀態(tài),同時允許應(yīng)用進程共享這些連接。為避免應(yīng)用進程之間的一些異常交互,每一個應(yīng)用進程必須返回它獲得的連接狀態(tài)。Page 569.2 SQL環(huán)境 SQL環(huán)境是SQL中數(shù)據(jù)

3、所在的框架,為數(shù)據(jù)操作提供支持,即一個運行環(huán)境(如DBMS運行環(huán)境)。 數(shù)據(jù)庫的所有元素,包括表、視圖、觸發(fā)器等,都是在SQL環(huán)境中定義的。這些元素組成了層次層次性結(jié)構(gòu)性結(jié)構(gòu): 模式模式 目錄目錄 簇簇71. 模式 模式是組織的基本單元。 模式是表、視圖、斷言、觸發(fā)器等模式元素的集合。 模式聲明的形式模式聲明的形式CREATE SCHEMA 模式聲明如圖模式聲明如圖9-381. 模式(續(xù)) CREATE SCHEMA 提供了在SQL語句中創(chuàng)建表、視圖以及授予對象權(quán)限的方法,并區(qū)別重名,即屬于不同模式的模式元素可以重名,可用“模式名.模式元素名”來引用某個模式元素。 沒有必要一次就聲明完所有的模

4、式??梢允褂煤线m的CREATE、DROP或ALTER語句來修改或增加模式 使用SET SCHEMA語句改變“當(dāng)前”的模式。 例如: SET SCHEMA MovieSchama ; 將使圖9-3描述的模式作為當(dāng)前模式92. 目錄 模式的集合。每個目錄有一個或多個模式,目錄中的模式名必須唯一,每個目錄包含一個叫INFORMATION_SCHEMA的特殊模式,這個模式包含了該目錄中所有模式的信息。 沒有CREATE CATALOG語句,只規(guī)定了設(shè)設(shè)置當(dāng)前目錄的語句:置當(dāng)前目錄的語句: SET CATALOG ; 對模式的操作(新建/修改模式等)都是針對當(dāng)前目錄10模式元素的全名 . . 例如:例如

5、:目錄MovieCatalog中的模式MovieSchema的表Movies的引用如下:MovieCatalog . MovieSchema . Movies 如果目錄是缺省的或是當(dāng)前的目錄,則可省去目錄名 如果模式也是缺省的或當(dāng)前的模式,那么模式部分也可以省去,這樣只留下元素自己的名稱。 然而,當(dāng)需要訪問當(dāng)前模式或目錄以外的元素時,就不得不使用完全名。113. 簇 簇是目錄的集合。每個用戶有一個關(guān)聯(lián)的簇:用戶可訪問的所有目錄的集合。簇是被提交的查詢的最大范圍,故在一定程度上,簇是特定用戶所看到的“數(shù)據(jù)庫”。12SQL環(huán)境中的客戶端和服務(wù)器 依照SQL標(biāo)準(zhǔn),SQL環(huán)境有兩種特殊的進程: SQL

6、 服務(wù)器:服務(wù)器:支持對數(shù)據(jù)庫元素的操作,充當(dāng)數(shù)據(jù)庫服務(wù)器的角色。 SQL客戶端:客戶端:允許用戶連接到服務(wù)器上,對數(shù)據(jù)庫進行操作 例如: 服務(wù)器運行在一個大的存儲數(shù)據(jù)庫的主機上,而客戶端運行在其他主機上,也許是遠離服務(wù)器的個人工作站,也許是和服務(wù)器運行在同一臺主機上。13連接 如果在SQL客戶端主機上運行包含SQL 的程序,則可通過下面的SQL語句打開客戶端和服務(wù)器間的連接: CONNECT TO AS AUTHORIZATION 依賴于安裝??捎妹QDEFAULT將用戶連接到任何被作為“缺省服務(wù)器”安裝的SQL服務(wù)器。如果僅是在SQL客戶端主機上執(zhí)行SQL語句,也可為自己建立一個缺省連接

7、可在以后用于引用連接。原因是SQL允許用戶打開好幾個連接,但任何時候只有一個連接有效 AUTHORIZATION授權(quán)子句授權(quán)子句后跟隨著用戶名和密碼。14引用連接 將將conn1切換為有效連接:切換為有效連接:SET CONNECTION conn1; 任何當(dāng)前有效的連接進入休眠狀態(tài)后,只有用下任何當(dāng)前有效的連接進入休眠狀態(tài)后,只有用下列語句顯式地調(diào)用才能將其激活:列語句顯式地調(diào)用才能將其激活:SET CONNECTION conn1; 斷開連接時斷開連接時conn1被中止,不是休眠,也不能被激被中止,不是休眠,也不能被激活活:DISCONNECT conn1; 注:如果連接創(chuàng)建后再也不被引用

8、,CONNECT TO子句中的AS和連接名可以省略15會話 連接有效時,執(zhí)行的連接有效時,執(zhí)行的SQL操作形成了一個會話操作形成了一個會話 會話和創(chuàng)建它的連接具有相同的生命周期會話和創(chuàng)建它的連接具有相同的生命周期。例如: 當(dāng)連接處于休眠狀態(tài)時,它的會話也處于休眠態(tài) SET CONNECTION語句可激活連接,同時激活相應(yīng)會話。連接和會話是客戶和服務(wù)器間鏈路的兩個方面16會話 每個會話有一個當(dāng)前目錄和該目錄中的一個當(dāng)前每個會話有一個當(dāng)前目錄和該目錄中的一個當(dāng)前模式模式 由語句SET SCHEMA和SET CATALOG進行設(shè)置 每個會話都有一個授權(quán)用戶17模塊 模塊是對應(yīng)用程序而言的,SQL標(biāo)準(zhǔn)

9、提出三種模塊: 普通普通SQL界面:界面:用戶可以鍵入SQL服務(wù)器執(zhí)行的SQL語句。這種模式下,每個查詢或其他語句本身是一個模塊。 嵌套嵌套SQL:預(yù)處理器將這個嵌套的SQL語句轉(zhuǎn)變?yōu)镾QL系統(tǒng)的對應(yīng)函數(shù)或過程調(diào)用。編譯后的宿主語言程序(包括這些函數(shù)調(diào)用)是一個模塊。 真模塊:真模塊:含有存儲函數(shù)或過程集合的模塊。這些函數(shù)|過程部分是宿主語言代碼,部分是SQL語句,它們之間可通過參數(shù)或共享變量進行通訊。 僅要求SQL的實現(xiàn)中至少提供一種類型給用戶。189.3 SQL/宿主語言接口 用宿主語言編程,且用到了一些并非宿主語言的嵌套SQL語句,將整個程序提交給預(yù)處理器。 預(yù)處理器將嵌套SQL語句轉(zhuǎn)化

10、為調(diào)用函數(shù),此函數(shù)把SQL語句當(dāng)作字符串參數(shù),并且執(zhí)行這個SQL語句 經(jīng)過預(yù)處理的宿主語言程序隨后以通常的方式編譯19包含SQL語句的典型編程系統(tǒng) DBMS銷售商提供了必要的函數(shù)定義庫。這樣實現(xiàn)SQL的函數(shù)被執(zhí)行,并且整個程序像一個整體一樣運作。 還有另一種方式:程序員直接用宿主語言編寫程序,只是在必要時使用這些函數(shù)調(diào)用。這就是SQL編程的第3種方式“調(diào)用級界面/CLI”20阻抗不匹配問題 連接SQL語句和常規(guī)編程語言的基本問題就是阻抗不匹配:即SQL數(shù)據(jù)模式與編程語言模式差別非常大。 SQL:關(guān)系數(shù)據(jù)模型,不使用指針、結(jié)構(gòu)體、循環(huán)和轉(zhuǎn)移 常規(guī)編程語言:整型、實型、算術(shù)性、字符型、指針、記錄、

11、數(shù)組無法直接表示集合 因此,在SQL和常規(guī)編程語言之間不能直接轉(zhuǎn)移數(shù)據(jù)21SQL與常規(guī)編程語言二者缺一不可 SQL與常規(guī)編程語言二者缺一不可 SQL在很大程度上幫助程序員編寫數(shù)據(jù)庫操作 而很多重要工作(如算法實現(xiàn))又離不開常規(guī)編程語言 必須設(shè)計一種機制(例如提供接口),允許程序的開發(fā)既可以使用SQL,也可以使用常規(guī)編程語言(宿主語言)22SQL/宿主語言接口 數(shù)據(jù)庫只能由SQL語句訪問 在數(shù)據(jù)庫和宿主語言程序之間的信息交換是通過共享變量共享變量實現(xiàn)的。這種變量允許出現(xiàn)在宿主語言和SQL語句中。 SQL中共享變量前面要加上冒號作為前綴 在宿主語言中這些變量并不需要冒號23關(guān)鍵字EXEC SQL

12、在宿主語言中使用SQL語句時,通過SQL語句前面的關(guān)鍵字EXEC SQL提示預(yù)處理器將有SQL代碼進入。 系統(tǒng)將預(yù)處理這些語句,用宿主語言中合適的函數(shù)調(diào)用來代替這些語句,并充分利用與SQL相關(guān)的函數(shù)庫。24特殊變量SQLSTATE 在SQL標(biāo)準(zhǔn)中,SQLSTATE這個特殊變量用于連接宿主語言程序與SQL執(zhí)行系統(tǒng)。 SQLSTATE是五個字符的數(shù)組類型。 每次調(diào)用SQL的庫函數(shù),向SQLSTATE變量中存放一個代碼,該代碼表示調(diào)用過程中出現(xiàn)的問題。25SQLSTATE變量的值 SQL標(biāo)準(zhǔn)同時指定了大量的五個字符的代碼和它們的意義。例如: 00000(五個零五個零): 沒有產(chǎn)生任何錯誤 02000

13、:沒找到作為SQL查詢結(jié)果組成部分的元組。 這個代碼非常重要:它允許在宿主語言程序中創(chuàng)建一個循環(huán)并且每執(zhí)行一次循環(huán)檢查一個元組,當(dāng)關(guān)系中最后一個元組被檢查后中止該循環(huán)。26DECLARE節(jié) EXEC SQL BEGIN DECLARE SECTION; 共享變量的聲明共享變量的聲明 EXEC SQL END DECLARE SECTION; 聲明節(jié)中的變量聲明形式可以是宿主語言要求的任何形式。 為使聲明的變量有意義,共享變量類型必須是宿主語言和SQL都可以處理的 如整型、實型和字符型,或者數(shù)組類型27示例9.3EXEC SQL BEGIN DECLARE SECTION; char studi

14、oName50,studioAddr256; char SQLSTATE6;EXEC SQL END DECLARE SECTION;28使用共享變量后面是嵌套的后面是嵌套的SQL語句語句共享變量在共享變量在SQL中須加冒中須加冒號作前綴號作前綴29SQL語句的嵌入 任何不返回結(jié)果的SQL語句(即非查詢語句)都可以用EXEC SQL為前綴直接嵌入到宿主語言中 包括INSERT、DELETE和UPDATE語句以及那些創(chuàng)建、修改或者刪除表和視圖等模式元素的語句。 然而由于“阻抗不匹配”,select-from-where查詢不能直接嵌套到宿主語言。 查詢產(chǎn)生的結(jié)果是元組包,但是大多數(shù)宿主語言均不直

15、接支持集合或包數(shù)據(jù)類型。30查詢嵌入宿主語言的機制 為了將查詢結(jié)果與宿主語言程序相連接,嵌套SQL有兩種機制可選擇: (1) 單元組選擇語句單元組選擇語句:只有一個結(jié)果元組的查詢可將該元組存儲到共享變量中,一個變量對應(yīng)元組的一個分量。 (2) 游標(biāo):游標(biāo):如果為查詢聲明一個游標(biāo),那么產(chǎn)生多于一個元組的查詢就可以執(zhí)行了。游標(biāo)范圍覆蓋了結(jié)果關(guān)系中的所有元組,每個元組依次被提取到共享變量中,并由宿主語言進行處理。31(1) 單元組選擇語句 單元組選擇的形式類似于普通的select-from-where語句,只是SELECT子句后緊跟著關(guān)鍵字INTO和一連串的共享變量(以冒號作為前綴)。 如果查詢結(jié)果

16、是個單一元組,那么這個元組的分量將分配給這些變量并成為它們的值。 如果結(jié)果沒有元組或者多于一個元組,那么不會分配給這些共享變量,同時一個相應(yīng)的錯誤碼被寫入到SQLSTATE變量中。32單元組選擇示例Page 3233(2) 游標(biāo) 游標(biāo)聲明游標(biāo)聲明 EXEC SQL DECLARECURSOR FOR 其中查詢可以是通常的select-from-where查詢或者關(guān)系名。游標(biāo)范圍覆蓋該查詢產(chǎn)生的關(guān)系元組。 打開游標(biāo)打開游標(biāo) (初始化初始化) EXEC SQL OPEN 這個語句初始化游標(biāo)的位置,使游標(biāo)指向其覆蓋的那個關(guān)系中的第一個元組,并從那里開始檢索。34(2) 游標(biāo)(續(xù)1) 一次或者多次使用

17、一次或者多次使用fetch子句子句 EXEC SQL FETCH FROMINTO 目的是得到游標(biāo)覆蓋的那個關(guān)系中的下一個元組。 每個關(guān)系元組的屬性對應(yīng)列表里的一個變量。假如有一個可獲取的元組,那么該元組相應(yīng)的分量將賦值給對應(yīng)的變量。如果元組已經(jīng)被遍歷過了,那么不會返回任何元組,且SQLSTATE被賦值為02000,表示“沒有發(fā)現(xiàn)任何元組”。35(2) 游標(biāo)(續(xù)2) 關(guān)閉游標(biāo)關(guān)閉游標(biāo) EXEC SQL CLOSE 這條語句關(guān)閉游標(biāo),游標(biāo)將不再覆蓋關(guān)系的元組。 然而,游標(biāo)可由另外一條OPEN語句重新初始化,它將重新覆蓋這個關(guān)系的元組。36游標(biāo)示例 分別計算凈資產(chǎn)位數(shù)從1-14的出品人個數(shù)Page

18、 3637游標(biāo)更新 當(dāng)游標(biāo)遍歷一個基本表的元組時,不僅可以讀和處理每個元組的值,也可以修改或者刪除當(dāng)前元組。 這里的UPDATE和DELETE語句,要求其WHERE子句只能是WHERE CURRENT OF,其后跟著游標(biāo)的名稱。38游標(biāo)更新示例39防止并發(fā)更新 不希望游標(biāo)讀取的元組被并發(fā)的變化所影響,而強調(diào)統(tǒng)計是針對某個時刻已存在的關(guān)系。 對游標(biāo)所讀取關(guān)系進行修改的語句,在游標(biāo)讀取元組前就已徹底完成或在游標(biāo)讀取元組后再運行 為了保證這一點,對于并發(fā)變化可以將游標(biāo)聲明為對并發(fā)修改不敏感(insensitive)。例如: EXEC SQL DECLARE execCursor INSENSITIV

19、E CURSOR FOR SELECT netWorth FROM MovieExec ; 保證在execCursor打開和關(guān)閉之間,對關(guān)系MovieExec所作的變化不會影響游標(biāo)提取到的元組集合。40將游標(biāo)聲明為READ ONLY 若確信關(guān)系R上的游標(biāo)不會改變R,則該游標(biāo)可與R的不敏感游標(biāo)同時運行。 將游標(biāo)聲明為FOR READ ONLY,那么數(shù)據(jù)庫系統(tǒng)可以保證基本關(guān)系R不會因為讀取游標(biāo)而修改了關(guān)系R。 EXEC SQL DECLARE execCursor CURSOR FOR SELECT netWorth FROM MovieExec FOR READ ONLY; 這樣,任何試圖通過游

20、標(biāo)execCursor所做出的關(guān)系修改都會產(chǎn)生錯誤。41動態(tài)SQL 目前為止,嵌套在宿主語言中的SQL模型都是在宿主語言程序中特定的特定的SQL查詢和命令。 嵌套SQL的另一種形式是自身可以被宿主語言處理的語句。這種語句編譯時不可知編譯時不可知,因此,不能被SQL預(yù)處理器和宿主語言編譯器處理。 例如:例如:程序提示用戶輸入SQL查詢,然后讀這個查詢并執(zhí)行。 查詢被讀到后,將立即進行語法分析,并且由SQL系統(tǒng)尋找適合執(zhí)行該查詢的方式。42動態(tài)SQL的執(zhí)行 1. EXEC SQL PREPARE V FROM V是SQL變量,是其值為字符串的任意一條宿主語言表達式,該字符串被當(dāng)作SQL語句。 宿主

21、語言程序指導(dǎo)SQL系統(tǒng)接受剛讀到的字符串,經(jīng)語法分析后將其轉(zhuǎn)化為可執(zhí)行SQL語句, 用V表達 2. EXEC SQL EXECUTE V 執(zhí)行V所代表的SQL語句。43動態(tài)SQL的執(zhí)行(2) 上述兩個步驟也可以合二為一 EXEC SQL EXECUTE IMMEDIATE +字符串表達式字符串表達式 如果一條語句被編譯一次,然后執(zhí)行很多次時,就會看到合并這兩步是不利的。 使用EXECUTE IMMEDIATE ,每次語句執(zhí)行時都要付出準(zhǔn)備該語句的代價,而不是只付出一次。44動態(tài)SQL示例既然查詢只執(zhí)行一次,那么既然查詢只執(zhí)行一次,那么6)7)可替代為:可替代為:EXEC SQL EXECUTE

22、 IMMEDIATE:query459.4 存儲過程 Persistent Stored Modules: SQL/PSM(簡寫為簡寫為PSM) 允許用簡單通用的語言編寫過程并且將它們存儲在數(shù)據(jù)庫中,作為模式的一部分。這些過程可以在數(shù)據(jù)庫中完成不能用SQL單獨完成的處理。 每個商用性DBMS均向用戶提供了自身的PSM擴展。本書描述的是SQL/PSM標(biāo)準(zhǔn),表明這些功能的主要思想,幫助大家理解任何與特定系統(tǒng)相關(guān)的該類語言。46PSM模塊 PSM中定義了模塊(modules),該模塊是如下內(nèi)容的集合: 函數(shù)和過程定義 臨時關(guān)系聲明 其他可選聲明471. 創(chuàng)建PSM函數(shù)和過程 過程聲明過程聲明 PSM

23、過程的參數(shù)是模式前綴模式前綴-參數(shù)名參數(shù)名-參數(shù)類型參數(shù)類型三元組 模式前綴模式前綴為IN|OUT|INOUT。這三個關(guān)鍵字分別表明參數(shù)是僅輸入的僅輸入的|僅輸出的僅輸出的|既可輸入又可輸出既可輸入又可輸出的的。缺省前綴是IN,可省略。CREATE PROCEDURE () 可選的局部變量聲明可選的局部變量聲明 ; 定義過程的可執(zhí)行的代碼體定義過程的可執(zhí)行的代碼體48創(chuàng)建PSM函數(shù)和過程 函數(shù)聲明函數(shù)聲明 函數(shù)定義與過程定義的不同之處 使用保留字使用保留字FUNCTION; 必須指定返回值的類型;必須指定返回值的類型; 函數(shù)的參數(shù)只可以是函數(shù)的參數(shù)只可以是IN模式。模式。PSM阻止了函數(shù)中的副

24、作 用,從函數(shù)中得到信息的唯一方式是通過函數(shù)的返回值。 在過程定義中常指出IN模式,但函數(shù)參數(shù)中不指明。CREATE FUNCTION () RETURNS ;49存儲過程示例 存儲過程中SQL語句的限制:只允許查詢進行單元組選擇語句和基于游標(biāo)的訪問。 PSM過程將新舊兩個地址作為其參數(shù),并且用新地址替換MovieStar中每一個舊地址。變量類型與變量類型與MovieStar模式定模式定義中義中address的類的類型相匹配型相匹配參數(shù)名可作常量參數(shù)名可作常量PSM過程和函數(shù)中過程和函數(shù)中的參數(shù)或別的局部的參數(shù)或別的局部變量不要求加冒號變量不要求加冒號502. PSM中的簡單語句格式 調(diào)用語句

25、 返回語句 局部變量聲明 賦值語句 語句組 語句標(biāo)號51(1)過程調(diào)用的語句 CALL() 這種調(diào)用語句在不同的地方使用不同的形式: 在宿主語言中的調(diào)用形式在宿主語言中的調(diào)用形式 例如: EXEC SQL CALL Foo( :x, 3); 作為另一個作為另一個PSM函數(shù)或過程的語句。函數(shù)或過程的語句。 作為發(fā)送給基本作為發(fā)送給基本SQL界面的界面的SQL命令。命令。 例如:把語句CALL Foo(1,3);發(fā)送給該界面,并分別用 1和3作為賦值過程的兩個參數(shù),然后執(zhí)行存儲過程Foo 注意:這里不允許調(diào)用函數(shù)。在PSM中調(diào)用函數(shù)應(yīng)使用函數(shù)名和匹配的參數(shù)作為表達式的一部分。52(2)返回語句 R

26、ETURN; 該語句只能出現(xiàn)在函數(shù)中。它計算表達式的值,并將函數(shù)的返回值設(shè)置為該計算結(jié)果。 和普通編程語言不同的是: PSM的返回語句不結(jié)束這個函數(shù)。 甚至,它將繼續(xù)控制后面的語句,而且在函數(shù)完成之前返回值都可能會改變。53(3)局部變量聲明 DECLARE; 用給定的類型聲明給定名稱的變量。 這個變量是局部的,在函數(shù)或者過程運行后,DBMS不再保存其值。 函數(shù)或過程體中的聲明必須在可執(zhí)行語句之前54(4)賦值語句 SET=; 除了引導(dǎo)保留字SET外,PSM中的賦值和別的語言完全相似。計算等號右邊表達式的值,將其賦值給左邊的變量。 表達式可以是NULL,甚至可以是查詢,只要該查詢是返回一個單值

27、。55(5)語句組 語句組以分號結(jié)束,并置于保留字BEGIN和END之間。 這種構(gòu)造被當(dāng)作單個語句,可以出現(xiàn)在任何單個語句可以出現(xiàn)的地方。 特別是,由于過程或函數(shù)體相當(dāng)于單個語句,所以在過程和函數(shù)體中可插入任何語句序列,只要它們被置于BEGIN和END之間。56(6)語句標(biāo)號 語句標(biāo)號:用名字(標(biāo)號名)和冒號作為前綴來標(biāo)識語句。573. 分支語句(IF語句) 其形式與C和其他類似語言的不同是: 用保留字END IF結(jié)束 嵌套在IF語句中的ELSE子句以單詞ELSEIF開始可選可選任何布爾類型的表達式任何布爾類型的表達式語句列表由以分號結(jié)束語句列表由以分號結(jié)束的語句構(gòu)成,但不必置的語句構(gòu)成,但不

28、必置于于BEGINEND之間之間Page 5758課本示例P236例9.12 編寫一個關(guān)于年份y和電影公司s的函數(shù),它返回一個布爾值,其值為TRUE當(dāng)且僅當(dāng)電影公司s在第y年至少制作了一部喜劇電影,或其該年沒有制作任何電影594. PSM中select-from-where查詢方式 (1)子查詢可用于條件語句中,或者一般而言,在SQL中任何地方使用子查詢都是合法的。Page 59604. PSM中select-from-where查詢方式 (2)返回單一值的查詢可用在賦值語句的右邊。 (3)PSM中單元組選擇語句是合法語句。INTO子句將變量賦值為單個返回元組的分量。這些變量可以是局部變量或P

29、SM過程的參數(shù)。 SET presNetWorth=(SELECT netWorth FROM Studio,MovieExec WHERE presC#=cert# AND S=studioName);614. PSM中select-from-where查詢方式 (4)聲明和使用游標(biāo)。下面幾點是不同的: 語句中不出現(xiàn)EXEC SQL 局部變量不使用冒號前綴 使用游標(biāo)的例子將被延遲到下一節(jié)學(xué)習(xí)了PSM循環(huán)語句之后625. PSM中的LOOP循環(huán) LOOP END LOOP; 若對LOOP語句設(shè)置循環(huán)標(biāo)識,可使用下面的語句中斷循環(huán): LEAVE; 循環(huán)中可用游標(biāo)讀取元組,當(dāng)沒

30、有更多元組時,就希望離開這個循環(huán)。對于表示沒有找到元組的SQLSTATE值( 02000),可以定義一個條件名: DECLARE Not_Found CONDITION FOR SQLSTATE 02000; 更一般地,可以用如下語句聲明表示任何希望與SQLSTATE值相對應(yīng)的標(biāo)識作為條件: DECLARE CONDITION FOR SQLSTATE ;63PSM循環(huán)示例 本例的PSM過程將電影公司名稱s作為輸入?yún)?shù),并且用輸出參數(shù)mean和variance給出電影公司s擁有的所有電影長度的平均值和方差。Page 63646.PSM中的FOR循環(huán) PSM中的FOR循環(huán)結(jié)構(gòu),唯一重要的目的是游

31、標(biāo)的迭代。65FOR循環(huán)示例Page 6566PSM中的其他循環(huán) PSM中也有while和repeat循環(huán),其含義與C相同。也就是說,可以創(chuàng)建如下形式的循環(huán) WHILEDO END WHILE; 或者這種形式的循環(huán): REPEAT UNTIL END REPEAT;677. PSM的異常處理 SQL系統(tǒng)通過在長為5個字符的字符串SQLSTATE變量中設(shè)置非零數(shù)字序列來表明錯誤條件。例如: 02000表示“沒有找到元組” 21000表示單元組選擇返回了多個元組 PSM可以聲明稱為異常處理異常處理的代碼。即在語句或語句組執(zhí)行過程中,當(dāng)錯誤代碼列表中的任何一個出現(xiàn)在SQLSTATE中時,就調(diào)用異常處

32、理。68異常處理的組成 每一個異常處理都和一個由BEGINEND描述的代碼塊有關(guān)。處理過程出現(xiàn)在代碼塊中,并且僅僅針對代碼塊中的語句。 異常處理的組成異常處理的組成 一組異常條件:當(dāng)這些條件成立時調(diào)用異常處理 當(dāng)異常發(fā)生時,與該異常相關(guān)聯(lián)的執(zhí)行代碼 指明處理器完成處理后的轉(zhuǎn)移去處。69異常處理聲明的形式 DECLARE HANDLER FOR 有3種選擇: CONTINUE:表示執(zhí)行異常處理聲明中的語句之后,繼續(xù)執(zhí)行產(chǎn)生異常的語句之后的那條語句。 EXIT:表示執(zhí)行異常處理語句后,控制離開聲明異常處理的BEGINEND塊,下一步執(zhí)行該代碼塊之后的語句 UNDO:與EXIT差不多,區(qū)別在于到目前為止,已執(zhí)行的該塊語句對數(shù)據(jù)庫或局部變量產(chǎn)生的變化都被撤消 由逗號分隔的條件的列表,可以是被聲明的條件,也可以是SQLSTATE和5位字符串的表達式。70異常示例 編寫一個PSM函數(shù),以電影片名作為參數(shù),返回電影的年份。如果該片名的電影不存在或是不止一個的 話,則返回NULL。如果有多條語句,則放在如果有多條語句,則放在BEGINEND之間之間718. 使用PSM函數(shù)和過程 在嵌套的SQL程序、PSM代碼或提供給基本界面的普通S

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論