ch9-服務(wù)器環(huán)境下的SQL_第1頁
ch9-服務(wù)器環(huán)境下的SQL_第2頁
ch9-服務(wù)器環(huán)境下的SQL_第3頁
ch9-服務(wù)器環(huán)境下的SQL_第4頁
ch9-服務(wù)器環(huán)境下的SQL_第5頁
已閱讀5頁,還剩107頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、本章討論的問題1在獨立運用SQL言語進展數(shù)據(jù)庫操作時,這種運用方法被稱為交互式SQL,交互式SQL的缺陷是只能進展數(shù)據(jù)庫的操作,不能進展數(shù)據(jù)處置。當(dāng)一個程序既要訪問數(shù)據(jù)庫又要處置數(shù)據(jù)時,把SQL言語嵌入到程序設(shè)計言語即宿主言語中,將SQL言語訪問數(shù)據(jù)庫的功能和宿主言語的數(shù)據(jù)處置功能結(jié)合起來是目前常用的方法,以這種方式運用的SQL被稱為嵌入式SQL。.本章討論的問題2本章主要討論的就是如何把SQL運用到一個完好的編程環(huán)境中。由于宿主言語編譯程序不能識別SQL言語,如何將嵌有SQL言語的宿主言語程序編譯成可執(zhí)行代碼?宿主言語和DBMS之間如何傳送數(shù)據(jù)?數(shù)據(jù)庫的查詢結(jié)果普通是一些元組的集合,這些元組

2、必需賦值給宿主言語變量才干被宿主言語運用。如何將元組賦給宿主言語的變量?DBMS和宿主言語的數(shù)據(jù)類型不完全對應(yīng),如何在兩者之間進展必要而且合理的數(shù)據(jù)類型的轉(zhuǎn)換?.SQL的三種編程方式嵌入到宿主言語(常規(guī)程序設(shè)計言語,如C)中關(guān)鍵問題:SQL與環(huán)境變量/宿主言語之間如何交換數(shù)據(jù)存儲過程將SQL和被稱為耐久性存儲模塊的普統(tǒng)統(tǒng)用程序結(jié)合起來,這些模塊是以數(shù)據(jù)庫方式方式存儲的代碼段,由用戶以命令的方式執(zhí)行調(diào)用級界面以常規(guī)言語編程,用函數(shù)庫來訪問數(shù)據(jù)庫,例如為了從C程序中調(diào)用,可以運用稱為SQL/CLI的SQL規(guī)范庫,Java的JDBC,或PHP等.主要內(nèi)容9.1 編程環(huán)境下的SQL9.2 方式中的存儲

3、過程9.3 SQL 環(huán)境9.4 運用調(diào)用層接口9.5 SQL中的平安機制和用戶認證.包含SQL語句的典型編程系統(tǒng)將包含宿主言語+嵌套SQL語句的程序提交給預(yù)處置器。預(yù)處置器將嵌套SQL語句轉(zhuǎn)化為調(diào)用函數(shù),此函數(shù)把SQL語句當(dāng)作字符串參數(shù),并且執(zhí)行這個SQL語句 經(jīng)過預(yù)處置的宿主言語程序隨后以通常的方式編譯.DBMS銷售商提供了必要的函數(shù)庫,這樣實現(xiàn)SQL的函數(shù)被執(zhí)行,并且整個程序像一個整體一樣運作。還有另一種方式:程序員用宿主言語編寫程序,在涉及到數(shù)據(jù)庫訪問時直接運用這些函數(shù)調(diào)用。這就是SQL編程的第3種方式“調(diào)用級界面/CLI.SQL與宿主言語之間的阻抗不匹配問題SQL與編程言語的數(shù)據(jù)類型差

4、別非常大SQL:關(guān)系數(shù)據(jù)模型,不運用指針、構(gòu)造體、循環(huán)和分支常規(guī)編程言語:整型、實型、字符型、指針、記錄、數(shù)組無法直接表示集合因此,在SQL和常規(guī)編程言語之間不能直接轉(zhuǎn)移數(shù)據(jù)SQL與常規(guī)編程言語二者缺一不可SQL在很大程度上協(xié)助程序員編寫數(shù)據(jù)庫操作而很多重要任務(wù)(如算法實現(xiàn))又離不開常規(guī)編程言語必需設(shè)計一種機制(例如提供接口),允許程序的開發(fā)既可以運用SQL,也可以運用常規(guī)編程言語(宿主言語).SQL/宿主言語接口數(shù)據(jù)庫只能由SQL語句訪問,在SQL和宿主言語之間經(jīng)過宿主言語變量來傳送信息,可以用SQL語句讀或?qū)懰拗餮哉Z變量;數(shù)據(jù)庫和宿主言語程序之間實現(xiàn)信息交換的變量稱為共享變量SQL中對共享

5、變量的援用要加上冒號作為前綴在宿主言語中這些變量并不需求冒號.共享變量的聲明 EXEC SQL BEGIN DECLARE SECTION; 共享變量的聲明 EXEC SQL END DECLARE SECTION;共享變量的聲明要放在DECLARE節(jié)中,聲明節(jié)中的變量聲明方式可以是宿主言語要求的任何方式。為使聲明的變量有意義,共享變量類型必需是宿主言語和SQL都可以處置的如整型、實型和字符型,或者數(shù)組類型聲明節(jié).例如9.3EXEC SQL BEGIN DECLARE SECTION; char studioName50,studioAddr256; char SQLSTATE6;EXEC S

6、QL END DECLARE SECTION;.運用共享變量后面是嵌套的SQL語句共享變量在SQL中須加冒號作前綴.特殊變量SQLSTATE在SQL規(guī)范中,SQLSTATE這個特殊的變量由系統(tǒng)定義,用于銜接宿主言語程序與SQL執(zhí)行系統(tǒng)。SQLSTATE是五個字符的數(shù)組類型。每次調(diào)用SQL的庫函數(shù),向SQLSTATE變量中存放一個代碼,該代碼表示調(diào)用過程中出現(xiàn)的問題。宿主言語程序可以讀出SQLSTATE的值并且基于該值做出判別。.SQLSTATE變量的值SQL規(guī)范同時指定了大量的五個字符的代碼和它們的意義。例如:00000: 沒有產(chǎn)生任何錯誤02000:沒找到作為SQL查詢結(jié)果組成部分的元組。這

7、個代碼非常重要:它允許在宿主言語程序中創(chuàng)建一個循環(huán)并且每執(zhí)行一次循環(huán)檢查一個元組,當(dāng)關(guān)系中最后一個元組被檢查后中止該循環(huán)。21000:表示單元組選擇前往了多個元組.關(guān)鍵字EXEC SQL在宿主言語中運用SQL語句時,經(jīng)過SQL語句前面的關(guān)鍵字EXEC SQL提示預(yù)處置器將有SQL代碼進入。系統(tǒng)將預(yù)處置這些語句,用宿主言語中適宜的函數(shù)調(diào)用來替代這些語句,并充分利用與SQL相關(guān)的函數(shù)庫。.SQL語句的嵌入任何不前往結(jié)果的SQL語句(即非查詢語句)都可以用EXEC SQL為前綴直接嵌入到宿主言語中包括INSERT、DELETE和UPDATE語句以及那些創(chuàng)建、修正或者刪除表和視圖等方式元素的語句。然而

8、由于“阻抗不匹配,select-from-where查詢不能直接嵌套到宿主言語。查詢產(chǎn)生的結(jié)果是元組包,但是大多數(shù)宿主言語均不直接支持集合或包數(shù)據(jù)類型。.查詢嵌入宿主言語的機制為了將查詢結(jié)果與宿主言語程序相銜接,嵌套SQL有兩種機制可選擇:(1) 單元組選擇語句:只需一個結(jié)果元組的查詢可將該元組存儲到共享變量中,一個變量對應(yīng)元組的一個分量。(2) 游標:當(dāng)查詢結(jié)果是多個元組,可以為查詢聲明一個游標,游標范圍覆蓋結(jié)果關(guān)系中的一切元組,每個元組依次被提取到共享變量中,并由宿主言語進展處置。.(1) 單元組選擇語句單元組選擇的方式類似于交互式SQL中的select-from-where語句,只是SE

9、LECT子句后緊跟著關(guān)鍵字INTO和一連串的共享變量(以冒號作為前綴)。假設(shè)查詢結(jié)果是個單一元組,那么這個元組的分量將分配給這些變量并成為它們的值。假設(shè)結(jié)果沒有元組或者多于一個元組,那么不會分配給這些共享變量,同時一個相應(yīng)的錯誤碼被寫入到SQLSTATE變量中。.單元組選擇例如.(2) 游標 游標聲明 EXEC SQL DECLARE CURSOR FOR 其中查詢可以是通常的select-from-where查詢或者關(guān)系名。游標范圍覆蓋該查詢產(chǎn)生的關(guān)系元組。 翻開游標 (初始化) EXEC SQL OPEN 初始化游標的位置,使游標指向其所覆蓋的關(guān)系中的第一個元組之前。.(2) 游標(續(xù)1)

10、 fetch子句 EXEC SQL FETCH FROM INTO 將游標向前推進一個位置,然后按照游標的當(dāng)前位置取一個元組,對共享變量進展賦值。每個關(guān)系元組的屬性對應(yīng)列表里的一個變量。假設(shè)有一個可獲取的元組,那么該元組相應(yīng)的分量將賦值給對應(yīng)的變量。假設(shè)元組曾經(jīng)被遍歷過了,那么不會前往任何元組,且SQLSTATE被賦值為02000,表示“沒有發(fā)現(xiàn)任何元組。.(2) 游標(續(xù)2) 封鎖游標 EXEC SQL CLOSE 游標將不再覆蓋關(guān)系的元組。然而,游標可由另外一條OPEN語句重新初始化,它將重新覆蓋這個關(guān)系的元組。.游標例如P266例7.4 分別計算凈資產(chǎn)位數(shù)從1-14的出品人個數(shù).游標更新

11、當(dāng)游標遍歷一個根本表的元組時,不僅可以讀和處置每個元組的值,也可以修正或者刪除當(dāng)前元組。這里的UPDATE和DELETE語句,要求其WHERE子句只能是WHERE CURRENT OF,其后跟著游標的稱號。.P267例7.5 更新行政長官的資產(chǎn)值,假設(shè)凈資產(chǎn)值少于1000那么刪除該元組,否那么將其凈資產(chǎn)值加倍。MovieExecs (name, address, cert#, netWorth)游標更新例如.防止并發(fā)更新不希望游標讀取的元組被并發(fā)的變化所影響對游標所讀取關(guān)系進展修正的語句,在游標讀取元組前就已徹底完成或在游標讀取元組后再運轉(zhuǎn)為了保證這一點,對于并發(fā)變化可以將游標聲明為對并發(fā)修正

12、不敏感(insensitive)。例如: EXEC SQL DECLARE execCursor INSENSITIVE CURSOR FOR SELECT netWorth FROM MovieExec ;保證在execCursor翻開和封鎖之間,對關(guān)系MovieExec所作的變化不會影響游標提取到的元組集合。.將游標聲明為READ ONLY假設(shè)知關(guān)系R上的一個游標不會改動R,那么該游標可與R的其他不敏感游標同時運轉(zhuǎn)。將游標聲明為FOR READ ONLY,那么數(shù)據(jù)庫系統(tǒng)可以保證根本關(guān)系R不會由于讀取游標而修正了關(guān)系R。 EXEC SQL DECLARE execCursor CURSOR

13、FOR SELECT netWorth FROM MovieExec FOR READ ONLY;這樣,任何試圖經(jīng)過游標execCursor所做出的關(guān)系修正都會產(chǎn)生錯誤。.卷型游標SCROLL游標同時提供了遍歷關(guān)系中元組的順序選擇缺省選擇是從關(guān)系頂端開場,依次提取元組直至末尾(最常用)。也可以經(jīng)過定義卷型游標按別的順序提取元組。為了可以按其他順序提取元組,有2個步驟:聲明游標時,將關(guān)鍵字SCROLL置于保管字CURSOR之前。通知SQL系統(tǒng),游標的運用方式不只是按照元組順序向前挪動。 FETCH語句中,關(guān)鍵字FETCH后面的選項決議所期望的元組的位置。.FETCH選項NEXT|PRIOR: 按

14、順序提取相對于游標當(dāng)前位置的下一個|上一個元組。NEXT為默許值。FIRST|LAST: 提取第一個|最后一個元組RELATIVE n: n為正|負整數(shù)。相對游標當(dāng)前位置向前(n為正整數(shù))|向后(n為負整數(shù))挪動n個元組。 RELATIVE 1即NEXT, RELATIVE -1即PRIORABSOLUTE n: n為正|負整數(shù)。從頭部(n為正整數(shù))|尾部(n為負整數(shù))挪動n個元組。 ABSOLUTE 1即FIRST , ABSOLUTE -1即LAST.卷型游標例如EXEC SQL DECLARE execCursor SCROLL CURSOR FOR MovieExec;EXEC SQL

15、 OPEN execCursor;EXEC SQL FETCH LAST FROM execCursor INTO :execName, :execAddr, :certNo, :worth;While(1) EXEC SQL FETCH PRIOR FROM execCursor INTO :execName, :execAddr, :certNo, :worth;.動態(tài)SQL 嵌入式SQL有兩種主要的方式:靜態(tài)的SQL和動態(tài)的SQL。靜態(tài)的SQL語句是在編寫程序時要定義一切的SQL語句,如INSERT、SELECT等普通的SQL語句。但很多情況下,SQL語句或SQL所帶的參數(shù)在編譯時并不知

16、道,運用必需在運轉(zhuǎn)時才干生成SQL語句,這種在運轉(zhuǎn)時才干生成的SQL語句叫動態(tài)SQL語句。對于動態(tài)SQL,SQL語句可以被運用程序在運轉(zhuǎn)時構(gòu)造。.假設(shè)在預(yù)編譯時以下信息不能確認,就必需運用動態(tài)SQL技術(shù): 1SQL語句正文 2主變量個數(shù) 3主變量的數(shù)據(jù)類型 4SQL語句中援用的數(shù)據(jù)對象例如,列、根本表、視圖等 動態(tài)SQL方法允許在程序運轉(zhuǎn)過程中暫時“組裝SQL語句,主要有三種方式:1語句可變:允許用戶在程序運轉(zhuǎn)時暫時輸入完好的SQL語句。2條件可變:對于查詢語句,SELECT子句是確認的,即語句的輸出是確定的,其他子句如Where子句、Having短語有一定的可變性。3數(shù)據(jù)庫對象,查詢條件均可

17、變:對于查詢語句,Select子句的列名、From子句中的表名或視圖名、Where子句和Having短語中的條件均可由用戶暫時構(gòu)造,即語句的輸入和輸出能夠都是不確定的。.與之相關(guān)的動態(tài)定義語句簡要引見如下:PREPARE語句:將一字符串解釋成一組SQL語句,并賦給它一個語句標識符,以后的動態(tài)管理語句經(jīng)過語句標識來援用這組SQL語句。PREPARE語句的普通方式為: PREPARE 語句標識名 from “SQL語句 或 PREPARE 語句標識名 from :宿主變量;EXECUTE語句:運轉(zhuǎn)與其語句標識符對應(yīng)的事先預(yù)備好的語句,對非select語句,用EXECUTE來運轉(zhuǎn)。 EXECUTE語

18、句的普通方式為: EXECUTE 被預(yù)備的語句標識名using宿主變量列3. EXECUTE IMMEDIATE語句:立刻執(zhí)行語句,它接納一字符串,將其解釋成SQL語句并立刻執(zhí)行它,然后釋放預(yù)備SQL語句所占用的資源。.4. DECLARE語句:為已預(yù)備好的select語句闡明游標。5. FREE語句:釋放已預(yù)備好的語句或已翻開的游標所占用的資源6. DESCRIBE語句:確定已預(yù)備好的語句能否為select語句,假設(shè)是,那么得到單一查找行的存儲要求,否那么只前往語句類型。.動態(tài)SQL的特性為:語句的闡明與執(zhí)行分為兩步。第一步,PREPARE語句用于分析SQL語句,并且在必要時建立一個程序方案

19、;第二步,用EXECUTE或定義游標來執(zhí)行被預(yù)備好的SQL語句。這樣一旦一條SQL語句經(jīng)過預(yù)備處置后,就可反復(fù)執(zhí)行它多次。參與僅執(zhí)行一次的SQL語句那就不用做預(yù)備處置。.動態(tài)SQL執(zhí)行的兩個步驟1. 讀入字符串并轉(zhuǎn)換成可執(zhí)行的SQL語句 EXEC SQL PREPARE V FROM V是SQL變量,是其值為字符串的恣意一條宿主言語表達式。宿主言語程序指點SQL系統(tǒng)接受剛讀到的字符串,經(jīng)語法分析后將其轉(zhuǎn)化為可執(zhí)行SQL語句, 用V表示2. 執(zhí)行該SQL語句 EXEC SQL EXECUTE V執(zhí)行V所代表的SQL語句。.上述兩個步驟也可以合二為一 EXEC SQL EXECUTE IMMEDI

20、ATE 假設(shè)一條語句被編譯一次,然后執(zhí)行很多次時,就會看到合并這兩步是不利的。運用EXECUTE IMMEDIATE ,每次語句執(zhí)行時都要付出預(yù)備該語句的代價,而不是只付出一次。.動態(tài)SQL例如既然查詢只執(zhí)行一次,那么6)7)可替代為:EXEC SQL EXECUTE IMMEDIATE:query.本節(jié)習(xí)題機械三 P233 清華版 P271 9.3.1 (a) (d) 7.1.1 (a) (d) (f)(f) 使一切“舊PC的價風(fēng)格低$100。要確保在他的程序運轉(zhuǎn)期間插入的任何“新PC的價錢不會調(diào)低。7.1.3 請運用滾動游標找出如下關(guān)系中滿足條件的一切PC。PC (model, speed

21、, ram, hd, cd, price)條件是:至少有兩種速度一樣而價錢更貴的PC。提示:讀取先按速度再按價錢排序的PC的元組,對于每個讀出的元組,往前跳兩個元組看看速度能否沒變。.主要內(nèi)容9.1 編程環(huán)境下的SQL9.2 方式中的存儲過程9.3 SQL 環(huán)境9.4 運用調(diào)用層接口9.5 SQL中的平安機制和用戶認證.耐久性存儲模塊Persistent Stored Modules: SQL/PSM(簡寫為PSM)第二種結(jié)合SQL與通用程序設(shè)計言語的編程方法,允許用簡單通用的言語編寫過程并且將它們存儲在數(shù)據(jù)庫中,作為方式的一部分,稱為PSM。這些過程可以在數(shù)據(jù)庫中完成不能用SQL單獨完成的處

22、置。 每個商用性的DBMS均向用戶提供了本身的PSM擴展,本書中引見的是SQL/PSM規(guī)范,描畫了這些擴展功能的主要思想。.PSM模塊PSM中定義了模塊 (modules),該模塊是如下內(nèi)容的集合:函數(shù)和過程定義暫時關(guān)系聲明其他可選聲明.1. 創(chuàng)建PSM函數(shù)和過程PSM過程的聲明創(chuàng)建過程的保管字CREATE PROCEDUREPSM過程的參數(shù)是方式前綴-參數(shù)名-參數(shù)類型三元組方式前綴為IN|OUT|INOUT。這三個關(guān)鍵字分別闡明參數(shù)是僅輸入的|僅輸出的|既可輸入又可輸出的。缺省前綴是IN,可省略。CREATE PROCEDURE () 可選的部分變量聲明 定義過程的可執(zhí)行的代碼體.創(chuàng)建PSM

23、函數(shù)和過程PSM函數(shù)的聲明函數(shù)定義與過程定義的不同之處 運用保管字FUNCTION; 必需指定前往值的類型 RETURN; 函數(shù)的參數(shù)只可以是IN方式。換句話說,PSM阻止了函數(shù)中的副作用,從函數(shù)中得到信息的獨一方式是經(jīng)過函數(shù)的前往值。 在過程定義中常指出IN方式,但函數(shù)參數(shù)中不指明CREATE FUNCTION () RETURNS .存儲過程例如存儲過程中SQL語句的限制:只允許查詢進展單元組選擇語句和基于游標的訪問。PSM過程將新舊兩個地址作為其參數(shù),并且用新地址交換MovieStar中每一個舊地址。變量類型與MovieStar方式定義中address的類型相匹配參數(shù)名可作常量,PSM過

24、程和函數(shù)中的參數(shù)或別的部分變量不要求加冒號.2. PSM中的簡單語句格式調(diào)用語句前往語句部分變量聲明賦值語句語句組語句標號.(1) 過程調(diào)用的語句 CALL ()調(diào)用語句在不同的地方運用不同的方式:宿主言語中的調(diào)用方式:EXEC SQL CALL Foo( :x, 3);作為另一個PSM函數(shù)或過程的語句作為發(fā)送給根本SQL界面的SQL命令例如:把語句CALL Foo(1,3);發(fā)送給該界面,并分別用 1和3作為賦值過程的兩個參數(shù),然后執(zhí)行存儲過程Foo在PSM中調(diào)用函數(shù)應(yīng)運用函數(shù)名和匹配的參數(shù)作為表達式的一部分。.(2) 前往語句 RETURN ;該語句只能出如今函數(shù)中。它計算表達式的值,并將

25、函數(shù)的前往值設(shè)置為該計算結(jié)果。和普通編程言語不同的是:PSM的前往語句不終了這個函數(shù)。甚至,它將繼續(xù)控制后面的語句,而且在函數(shù)完成之前前往值都能夠會改動。.(3) 部分變量聲明 DECLARE ;用給定的類型聲明給定稱號的變量。這個變量是部分的,在函數(shù)或者過程運轉(zhuǎn)后,DBMS不再保管其值。函數(shù)或過程體中的部分變量聲明必需在可執(zhí)行語句之前.(4) 賦值語句 SET =;除了引導(dǎo)保管字SET外,PSM中的賦值和別的言語完全類似。計算等號右邊表達式的值,將其賦值給左邊的變量。表達式可以是NULL,甚至可以是查詢,只需該查詢是前往一個單值。.(5) 語句組語句組以分號終了,并置于保管字BEGIN和EN

26、D之間。這種構(gòu)造被當(dāng)作單個語句,可以出如今任何單個語句可以出現(xiàn)的地方。特別是,由于過程或函數(shù)體相當(dāng)于單個語句,所以在過程和函數(shù)體中可插入任何語句序列,只需它們被置于BEGIN和END之間。.(6) 語句標號語句標號:用名字(標號名)和冒號作為前綴來標識語句。.3. 分支語句(IF語句)其方式與C和其他類似言語的不同是:用保管字END IF終了嵌套在IF語句中的ELSE子句以單詞ELSEIF開場可選任何布爾類型的表達式語句列表由以分號終了的語句構(gòu)成,但不用置于BEGINEND之間.課本例如編寫一個關(guān)于年份y和電影公司s的函數(shù),它前往一個布爾值,其值為TRUE當(dāng)且僅當(dāng)電影公司s在第y年至少制造了一

27、部喜劇電影,或其該年沒有制造任何電影.4. PSM中的select-from-where查詢方式(1)子查詢可用于條件語句中,或者普通而言,在SQL中任何地方運用子查詢都是合法的。.4. PSM中的select-from-where查詢方式(2)前往單一值的查詢可用在賦值語句的右邊。(3)PSM中單元組選擇語句是合法語句。INTO子句將變量賦值為單個前往元組的分量。這些變量可以是部分變量或PSM過程的參數(shù)。SET presNetWorth=(SELECT netWorth FROM Studio,MovieExec WHERE presC#=cert# AND S=studioName);.4

28、. PSM中的select-from-where查詢方式(4)聲明和運用游標。下面幾點是不同的:語句中不出現(xiàn)EXEC SQL部分變量不運用冒號前綴運用游標的例子將被延遲到下一節(jié)學(xué)習(xí)了PSM循環(huán)語句之后.5. PSM中的LOOP循環(huán) LOOP END LOOP;假設(shè)對LOOP語句設(shè)置循環(huán)標識,可運用下面的語句中斷循環(huán): LEAVE ;循環(huán)中可用游標讀取元組,當(dāng)沒有更多元組時,就希望分開這個循環(huán)。對于表示沒有找到元組的SQLSTATE值( 02000),可以定義一個條件名: DECLARE Not_Found CONDITION FOR SQLSTATE 02000;更普通地,可以用如下語句聲明表

29、示任何希望與SQLSTATE值相對應(yīng)的標識作為條件: DECLARE CONDITION FOR SQLSTATE ;.PSM循環(huán)例如本例的PSM過程將電影公司稱號s作為輸入?yún)?shù),并且用輸出參數(shù)mean和variance給出電影公司s擁有的一切電影長度的平均值和方差。 均值的定義: 方差的定義: 方差計算公式: .6.PSM中的FOR循環(huán)PSM中的FOR循環(huán)構(gòu)造,獨一重要的目的是游標的迭代。.FOR循環(huán)例如.PSM中的其他循環(huán) PSM中也有while和repeat循環(huán),其含義與C一樣。也就是說,可以創(chuàng)建如下方式的循環(huán) WHILEDO END WHILE;或者這種方式的循環(huán): REPEAT UN

30、TIL END REPEAT;.7. PSM中的異常處置SQL系統(tǒng)經(jīng)過在SQLSTATE變量中設(shè)置非零數(shù)字序列來闡明錯誤條件。例如:02000表示“沒有找到元組 21000表示單元組選擇前往了多個元組PSM可以聲明稱為異常處置的代碼。即在語句或語句組執(zhí)行過程中,當(dāng)錯誤代碼列表中的任何一個出如今SQLSTATE中時,就調(diào)用異常處置。.異常處置的組成每一個異常處置都和一個由BEGINEND描畫的代碼塊有關(guān)。處置過程出如今代碼塊中,并且僅僅針對代碼塊中的語句。異常處置的組成一組異常條件:當(dāng)這些條件成立時調(diào)用異常處置當(dāng)異常發(fā)生時,與該異常相關(guān)聯(lián)的執(zhí)行代碼指明處置器完成處置后的轉(zhuǎn)移去處。.異常處置聲明的

31、方式DECLARE HANDLER FOR 轉(zhuǎn)移方式有3種選擇:CONTINUE:表示執(zhí)行異常處置聲明中的語句之后,繼續(xù)執(zhí)行產(chǎn)生異常的語句之后的語句。EXIT:表示執(zhí)行異常處置語句后,控制分開聲明異常處置的BEGINEND塊,下一步執(zhí)行該代碼塊之后的語句。UNDO:與EXIT差不多,區(qū)別在于到目前為止,已執(zhí)行的該塊語句對數(shù)據(jù)庫或部分變量產(chǎn)生的變化都被吊銷由逗號分隔的條件列表,可以是被聲明的條件,也可以是SQLSTATE和5位字符串的表達式。.異常例如編寫一個PSM函數(shù),以電影片名作為參數(shù),前往電影的年份。假設(shè)該片名的電影不存在或是不止一個的 話,那么前往NULL。.8. 運用PSM函數(shù)和過程在

32、嵌套的SQL程序、PSM代碼本身或提供應(yīng)根本界面的普通SQL命令中都可調(diào)用PSM函數(shù)和過程用保管字CALL作為前綴來調(diào)用過程函數(shù)作為表達式的一部分出現(xiàn).運用PSM函數(shù)和過程的例如假定方式中包括了具有GetYear函數(shù)的模塊。想象面對根本界面,預(yù)備輸入Denzel Washington是Remember the Titans中的影星這個現(xiàn)實。但卻忘記了電影年份。只需這個稱號的電影只需一部,并且它在關(guān)系Movies中,那么就不用經(jīng)過預(yù)先查詢?nèi)フ页鲈撃攴荨6?,可以將下面的語句插入到根本SQL界面中:.P241 習(xí)題9.4.1 在電影數(shù)據(jù)庫上用PSM過程或函數(shù)完成以下義務(wù): Movies (titl

33、e, year, length, genre, studioName, producerC#) StarsIn (movieTitle, movieYear, starName) MovieStar (name, address, gender, birthdate) MovieExecs (name, address, cert#, netWorth) Studio (name, address, presC#)a)給定電影公司的稱號,計算其制片經(jīng)理的凈產(chǎn)值。c)給定電影公司稱號,將該電影公司的兩部最長的電影片名作為參數(shù)輸出。假設(shè)沒有這樣的電影那么參數(shù)中的一個或兩個被賦值為NULL(例如,假

34、設(shè)電影公司只需一部電影,那么沒有“第二長的電影)。d)給定一個影星的名字,找出由他出演的時間超越120分鐘的最早的電影。假設(shè)沒有這樣的電影,那么前往年份0 .主要內(nèi)容9.1 編程環(huán)境下的SQL9.2 方式中的存儲過程9.3 SQL 環(huán)境9.4 運用調(diào)用層接口9.5 SQL中的平安機制和用戶認證.什么是SQL環(huán)境SQL環(huán)境是SQL中數(shù)據(jù)所在的框架,該框架下可以存儲數(shù)據(jù)、并對數(shù)據(jù)進展SQL操作,可以看做安裝并運轉(zhuǎn)在某些系統(tǒng)上的DBMS。數(shù)據(jù)庫的一切元素,包括表、視圖、觸發(fā)器等,都是在SQL環(huán)境中定義的。這些元素組成了層次性構(gòu)造:方式目錄簇.1. 方式指“數(shù)據(jù)庫方式而非“關(guān)系方式,是組織的根本單元。

35、方式是表、視圖、斷言、觸發(fā)器等數(shù)據(jù)庫元素的集合。方式聲明的方式:CREATE SCHEMA 方式聲明例如7.19.1. 方式(續(xù))CREATE SCHEMA 提供了在SQL語句中創(chuàng)建表、視圖以及授予對象權(quán)限的方法;不同方式的方式元素可以重名,可用“方式名.方式元素名來援用某個方式元素。沒有必要一次就聲明完一切的方式??梢赃\用適宜的CREATE、DROP或ALTER語句來修正或添加方式運用SET SCHEMA語句改動“當(dāng)前的方式。 例如: SET SCHEMA MovieSchema ; 將使例7.19描畫的方式作為當(dāng)前方式.2. 目錄方式的集合,方式的創(chuàng)建和修正都在目錄中。每個目錄有一個或多個

36、方式,目錄中的方式名必需獨一,每個目錄包含一個叫IMFORMATION_SCHEMA的特殊方式,這個方式包含了該目錄中一切方式的信息。設(shè)置當(dāng)前目錄的語句: SET CATALOG ;對方式的操作(新建/修正方式等)都是針對當(dāng)前目錄.數(shù)據(jù)庫方式元素的全名 . . 例如:目錄MovieCatalog中的方式MovieSchema的表Movies的援用如下:MovieCatalog . MovieSchema . Movies假設(shè)目錄是缺省的或是當(dāng)前的目錄,那么可省去目錄名假設(shè)方式也是缺省的或當(dāng)前的方式,那么方式部分也可以省去,這樣只留下元素本人的稱號。然而,當(dāng)需求訪問當(dāng)前方式或目錄以外的元素時,就

37、不得不運用完全名。.3. 簇簇是目錄的集合。每個用戶有一個關(guān)聯(lián)的簇,是用戶可訪問的一切目錄的集合。簇是被提交的查詢的最大范圍,故在一定程度上,簇是特定用戶所看到的“數(shù)據(jù)庫。.SQL環(huán)境中的客戶和效力器按照SQL規(guī)范,SQL環(huán)境有兩種特殊的進程:SQL 效力器:支持對數(shù)據(jù)庫元素的操作,充任數(shù)據(jù)庫效力器的角色。SQL客戶程序:允許用戶銜接到效力器上,對數(shù)據(jù)庫進展操作。 例如:效力器運轉(zhuǎn)在一個大的存儲數(shù)據(jù)庫的主機上,而客戶程序運轉(zhuǎn)在其他主機上,也許是遠離效力器的個人任務(wù)站,也許是和效力器運轉(zhuǎn)在同一臺主機上。SQL的客戶程序和效力器通常與銜接、會話和模塊這三個概念嚴密地聯(lián)絡(luò)在一同。.銜接銜接是指將客戶

38、端和效力器銜接起來。假設(shè)在SQL客戶端主機上運轉(zhuǎn)包含SQL的程序,那么可經(jīng)過CONNECT語句翻開客戶端和效力器間的銜接: CONNECT TO AS AUTHORIZATION 依賴于安裝??捎梅Q號DEFAULT將用戶銜接到任何被作為“缺省效力器安裝的SQL效力器。AUTHORIZATION授權(quán)子句后跟隨著用戶名和密碼,提供應(yīng)效力器進展驗證??稍谝院笥糜谠勉暯?。緣由是SQL允許用戶翻開好幾個銜接,但任何時候只需一個銜接有效。.援用銜接任何當(dāng)前有效的銜接進入休眠形狀后,只需用SET CONNECTION語句顯式地調(diào)用才干將其激活; SET CONNECTION conn1;運用DISCONN

39、ECT語句斷開銜接時conn1被中止不是休眠,不能再被激活: DISCONNECT conn1; 注:假設(shè)銜接創(chuàng)建后再也不被援用,CONNECT TO子句中的AS和銜接名可以省略。.會話當(dāng)銜接激活時,所執(zhí)行的SQL操作將在客戶端和效力器之間構(gòu)成懇求-呼應(yīng)式的交互,我們稱這樣的操作序列為一個會話Session。會話和創(chuàng)建它的銜接處于同一形狀,例如:當(dāng)銜接處于休眠形狀時,它的會話也處于休眠形狀SET CONNECTION語句可激活銜接,同時激活相應(yīng)會話。每個會話有一個當(dāng)前目錄和該目錄中的一個當(dāng)前方式由語句SET SCHEMA和SET CATALOG進展設(shè)置每個會話都有一個授權(quán)用戶.模塊SQL操作代

40、碼SQL2規(guī)范建議SQL實現(xiàn)至少為用戶提供如下三種類型的運用程序稱為模塊之一:通用SQL接口:這種類型就是交互式SQL,在這種方式下用戶可以輸入由SQL效力器執(zhí)行的SQL語句,每個查詢或其他操作都是獨立的模塊。嵌入式SQL:在這種方式下,SQL語句出如今宿主言語程序中,并有EXEC SQL引導(dǎo)。經(jīng)過預(yù)處置程序把嵌入式SQL言語轉(zhuǎn)換為適于SQL系統(tǒng)的函數(shù)調(diào)用,編譯好的宿主言語程序執(zhí)行到相應(yīng)的函數(shù)語句時將調(diào)用相應(yīng)的函數(shù)。實踐模塊:含有存儲函數(shù)或過程集合的模塊。這些函數(shù)|過程部分是宿主言語代碼,部分是SQL語句,它們之間可經(jīng)過參數(shù)或共享變量進展通訊。.SQL客戶端-效力器交互模塊的執(zhí)行被稱為SQL代

41、理;模塊是代碼,SQL代理是代碼的執(zhí)行;模塊和SQL代理作為一個整體,經(jīng)過訪問SQL客戶端建立與數(shù)據(jù)庫的銜接。.三層體系構(gòu)造圖.三層體系構(gòu)造(1) Web效力器:可以解析HTTP協(xié)議。當(dāng)Web效力器接納到一個HTTP懇求,會前往一個HTTP呼應(yīng),例如送回一個HTML頁面。(2) 運用效力器:經(jīng)過各種協(xié)議(可以包括HTTP),提供訪問商業(yè)邏輯的途徑,供客戶端運用程序運用(3) 數(shù)據(jù)庫效力器:運轉(zhuǎn)DBMS并執(zhí)行運用效力器懇求的查詢和更新.三層體系構(gòu)造的解釋假設(shè)他訪問的網(wǎng)頁只需象HTML這種頁面的,用WEB效力器就夠了但是假設(shè)是JSP,也就是含JAVA代碼的HTML,那么就需求JAVA運用效力器了,

42、由于只需JAVA運用效力器才干解析JSP里的JAVA代碼,并將解析結(jié)果以HTML的格式前往。.主要內(nèi)容9.1 編程環(huán)境下的SQL9.2 方式中的存儲過程9.3 SQL 環(huán)境9.4 運用調(diào)用層接口9.5 SQL中的平安機制和用戶認證.授權(quán)ID本節(jié)首先學(xué)習(xí)SQL允許對數(shù)據(jù)庫元素進展哪些授權(quán)、然后學(xué)慣用戶如何獲得授權(quán)( 即授權(quán)ID) 、最后如何授權(quán);SQL假定存在授權(quán)ID,這些ID根本上都是用戶名 SQL有一個特殊的授權(quán)ID,稱作PUBLIC,它包含了一切用戶。授權(quán)ID可以被授予權(quán)限.1. 權(quán)限SQL中定義了九種類型的權(quán)限:SELECT、INSERT、DELETE、UPDATE:運用于關(guān)系的查詢、插

43、入、刪除、更新的權(quán)益;REFERENCE:在完好性約束下援用關(guān)系的權(quán)益。約束可以是第7章引見的斷言、基于屬性或元組的檢查、或援用完好性約束等;USAGE:主要運用在關(guān)系和斷言之外的其他方式元素上,給出了在聲明中運用域等其他方式元素的權(quán)益TRIGGER:定義這個關(guān)系上的觸發(fā)器的權(quán)益EXECUTE:執(zhí)行如PSM過程|函數(shù)之類代碼的權(quán)益UNDER:創(chuàng)建給定類型的子類型的權(quán)益.權(quán)限例如思索以下插入語句所需的權(quán)限擁有關(guān)系Studio的INSERT或INSERT (name)權(quán)限擁有關(guān)系Movie的SELECT或SELECT (studioName)權(quán)限擁有關(guān)系Studio的SELECT或SELECT (

44、name)權(quán)限其他屬性分量上只能接受缺省值或NULL.2. 創(chuàng)建權(quán)限獲得權(quán)限有兩個方面需求明確創(chuàng)建權(quán)限:權(quán)限最初是如何創(chuàng)建的授權(quán):權(quán)限如何從一個用戶傳送到另一個用戶.SQL元素(如方式或模塊)都有一個屬主。屬主擁有其所屬事物的一切權(quán)限。創(chuàng)建權(quán)限的關(guān)鍵在于如何獲得屬主身份。在SQL中建立屬主身份有三種情況:方式創(chuàng)建時,該方式及其一切方式元素的一切權(quán)都屬于其創(chuàng)建者。該用戶擁有方式元素一切能夠權(quán)限會話被CONNECT語句初始化時,可用AUTHORIZATION子句指定用戶。模塊SQL操作代碼創(chuàng)建時,可經(jīng)過AUTHORIZATION子句選擇其屬主例如:CONNECT TO Starfleet-sql-

45、server AS conn1 AUTHORIZATION kirk;用戶kirk創(chuàng)建了一個銜接到名為Starfleet-sql-server的SQL效力器的鏈路conn1 。在SQL的實現(xiàn)中還將驗證用戶名能否有效,例如經(jīng)過訊問密碼。也可將密碼包含在AUTHORIZATION子句中,但這種方式密碼可見。 模塊創(chuàng)建語句中的子句AUTHORIZATION picard;使得用戶picard成為該模塊的屬主。 模塊也可以不指定屬主,這種情況下模塊被公開執(zhí)行,執(zhí)行模塊中的任何操作所必需的權(quán)限必需從別處獲得,例如:在模塊執(zhí)行過程中銜接和會話與用戶的關(guān)聯(lián)。2. 創(chuàng)建權(quán)限.3. 檢查權(quán)限的過程每個模塊、方式

46、和會話有一個相關(guān)用戶(即授權(quán)ID)任何SQL操作有兩部分:操作執(zhí)行涉及的數(shù)據(jù)庫元素產(chǎn)生操作的代理對代理有效的權(quán)限來自當(dāng)前授權(quán)ID,這個ID可以是:模塊授權(quán)ID:假設(shè)代理正在執(zhí)行的模塊有一個授權(quán)ID會話授權(quán)ID只需當(dāng)前授權(quán)ID擁有執(zhí)行操作所涉及的數(shù)據(jù)庫元素所必需的權(quán)限,就可以執(zhí)行這個SQL操作。.例如關(guān)系表Movies和Studio是用戶Janeway創(chuàng)建和擁有的方式MovieSchema的一部分。用戶Janeway擁有這些表和方式MovieSchema的任何其他元素的一切權(quán)限。該插入例如可以有如下幾種執(zhí)行方式:.插入例如執(zhí)行方式1用戶Janeway創(chuàng)建了一個包含AUTHORIZATION Ja

47、neway子句的模塊,這個插入作為該模塊的一部分來執(zhí)行,那么Janeway是模塊授權(quán)ID。假設(shè)有模塊授權(quán)ID,該ID總是變成當(dāng)前授權(quán)ID,于是Janeway成為當(dāng)前授權(quán)ID。那么該模塊及其SQL插入語句擁有與用戶Janeway一樣的權(quán)限,包括表Movies和Studio的一切權(quán)限。.插入例如執(zhí)行方式2插入是模塊的一部分,但是該模塊沒有屬主;用戶Janeway在CONNECT語句中用AUTHORIZATION Janeway子句翻開一個銜接(會話授權(quán)ID) 。于是 Janeway再次成為當(dāng)前授權(quán)ID,該插入擁有了所需的一切權(quán)限。.插入例如執(zhí)行方式3用戶Janeway將表Movies和Studio

48、一切權(quán)限授權(quán)給用戶archer,或是代表“一切用戶的特殊用戶PUBLIC假定插入語句存在于帶有AUTHORIZATION archer子句的模塊中,模塊授權(quán)ID是archer ,因此當(dāng)前授權(quán)ID是archer。而且archer擁有所需的權(quán)限,故插入再次被允許。.插入例如執(zhí)行方式4假定用戶Janeway曾經(jīng)將所需的權(quán)限給了用戶archer。同時又假定插入語句存在于沒有屬主的模塊中,模塊在一個會話中執(zhí)行,該會話的授權(quán)ID由AUTHORIZATION archer子句設(shè)置。會話授權(quán)ID是archer。這樣當(dāng)前授權(quán)ID是archer且這個ID擁有所需的權(quán)限。 .四條準那么擁有數(shù)據(jù)的用戶,其ID就是當(dāng)前

49、授權(quán)ID,那么所需權(quán)限總是可用的。執(zhí)行方法(1)和(2) 假設(shè)用戶的ID是當(dāng)前授權(quán)ID,而且數(shù)據(jù)的屬主曾經(jīng)把所需求的權(quán)限授予了該用戶或授予給用戶PUBLIC,那么這些權(quán)限也是可用的。執(zhí)行方法(3)和(4)執(zhí)行數(shù)據(jù)的擁有者所擁有的模塊或者執(zhí)行對數(shù)據(jù)已有授權(quán)的某個用戶所擁有的模塊,就使得所需求的權(quán)限是可用的。執(zhí)行方法(1)和(3)在會話它的授權(quán)ID是具有所需求權(quán)限的用戶期間執(zhí)行公用模塊是合法執(zhí)行該操作的另一種方法。執(zhí)行方法(2)和(4).4. 授權(quán)SQL提供了GRANT語句,以允許一個用戶將權(quán)限授權(quán)給另一個用戶。第一個用戶仍保管所授予的權(quán)限。授權(quán)選項WITH GRANT OPTION假設(shè)用戶A將帶

50、有授權(quán)選項的某個權(quán)限授權(quán)給用戶B,那么用戶B可以把該權(quán)限再次授權(quán)給別的用戶(帶授權(quán)選項或不帶);假設(shè)用戶A 授予用戶B某個權(quán)限時不帶授權(quán)選項,那么用戶B無法再將該權(quán)限授予別的用戶只需A 可以把該權(quán)限授予別的用戶.授權(quán)語句的語法格式GRANT ON TO WITH GRANT OPTION 典型的是一個關(guān)系(根本表或視圖)。假設(shè)是其他類型的元素,元素名之前應(yīng)有作前綴,如ASSERTION。是一個或多個權(quán)限,如INSERT (name )或 SELECT。關(guān)鍵字ALL PRIVILEGES可根據(jù)需求在此出現(xiàn),表示授權(quán)者對正在討論的數(shù)據(jù)庫元素可合法授予的一切權(quán)限。.授權(quán)語句的執(zhí)行為了合法地執(zhí)行這條授

51、權(quán)語句,執(zhí)行它的用戶必需擁有被授予的權(quán)限,而且這些權(quán)限還必需帶有授權(quán)選項。但授權(quán)者可以擁有比授出的權(quán)限更通用的權(quán)限(帶有授權(quán)選項)。例如,表Studio的INSERT(name)權(quán)限被授出,同時授權(quán)者擁有表Studio的更通用的帶有授權(quán)選項的權(quán)限INSERT。.授權(quán)例如用戶Janeway是MovieSchema方式的屬主,該方式包括 Movies (title, year, length, genre, studioName, producerC#) Studio (name, address, presC#)(1) Janeway將表Studio的INSERT和SELECT權(quán)限以及表Movi

52、es的SELECT權(quán)限授予用戶kirk和picard。而且包括了這些權(quán)限的授權(quán)選項。 GRANT SELECT,INSERT ON Studio TO kirk, picard WITH GRANT OPTION; GRANT SELECT ON Movies TO kirk, picard WITH GRANT OPTION;.授權(quán)例如(續(xù))(2) Picard授予用戶sisko一樣的權(quán)限,但沒有授權(quán)選項 GRANT SELECT,INSERT ON Studio TO Sisko; GRANT SELECT ON Movies TO Sisko;(3) Kirk也授予Sisko 表Stud

53、io的SELECT和INSERT (name) 權(quán)限以及Movies的SELECT權(quán)限 GRANT SELECT,INSERT (name) ON Studio TO Sisko; GRANT SELECT ON Movies TO Sisko;.5. 授權(quán)圖用授權(quán)圖表示授權(quán)。SQL系統(tǒng)維護授權(quán)圖的表示,并跟蹤權(quán)限及其起始點(以防權(quán)限被收回)。授權(quán)圖的節(jié)點對應(yīng)一個用戶和一個權(quán)限。留意:執(zhí)行語句帶或不帶授權(quán)選項是不同的權(quán)限,必需用兩個不同的節(jié)點表示(即使屬于同一用戶也如此)假設(shè)某用戶的一個權(quán)限比另一個權(quán)限更通用(如R上的SELECT與在R(A)上的SELECT),也要用兩個不同的節(jié)點表示。假設(shè)用戶U將權(quán)限P授予用戶V,該授權(quán)是基于U擁有權(quán)限Q ,于是從節(jié)點U/Q到節(jié)點V/P可以畫一條弧 Q可以是帶授權(quán)選項的P,或是P帶有授權(quán)選項的泛化.授權(quán)圖商定節(jié)點的“用戶名權(quán)限后,用一個*表示該權(quán)限帶有授權(quán)選項節(jié)點的“用戶名權(quán)限后,用*闡明了該權(quán)限來自正在討論的數(shù)據(jù)庫元素的一切權(quán)(而不是由別處授予的權(quán)限) 并自動包括了授權(quán)選項。 .授權(quán)圖例如 GRANT SELECT,INSERT ON Studio TO kirk, picard WITH GRANT OPTION;JanawaySELECT on Movie*JanawayINSERT on Studio*JanawayINSERT

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論