函數(shù)游標過稱_第1頁
函數(shù)游標過稱_第2頁
函數(shù)游標過稱_第3頁
函數(shù)游標過稱_第4頁
函數(shù)游標過稱_第5頁
已閱讀5頁,還剩65頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

函數(shù)游標過稱第一頁,共七十頁,2022年,8月28日學習目標:通過本章學習,你能夠?qū)W會:在進行SQLServer程序設(shè)計時涉及的批處理、事務(wù)、局部變量、全局變量的概念及使用方法在進行SQLServer程序設(shè)計時涉及到的程序控制語句的使用方法在進行SQLServer程序設(shè)計時還會用到游標,在本章中還可以學到游標的使用方法在進行SQLServer程序設(shè)計時為使編程簡潔清晰還會用到用戶自定義函數(shù),在本章將會學到用戶如何定義自己的函數(shù)第二頁,共七十頁,2022年,8月28日11.1程序注釋語句

前面介紹的Transact-SQL語句以及一些編程的方法和技巧在處理一些簡單的查詢和實際應(yīng)用時還可以完全勝任,但是,在有些時候,這些工具無法滿足一些特殊要求,例如,要實現(xiàn)與用戶的交互操作等。那么,了解和掌握如何使用Transact-SQL語句進行程序設(shè)計是非常必要的。第三頁,共七十頁,2022年,8月28日在程序設(shè)計的過程中,注釋語句的主要作用是幫助他人了解程序的具體內(nèi)容,同時也便于我們對程序結(jié)構(gòu)有所了解和掌握。試想如果你編了一段100行左右的程序,如果一個月后在來瀏覽,在沒有注釋的情況下,即使記憶力再好的程序員,也得花一番功夫才能把這段程序側(cè)底弄清楚。因此經(jīng)常書寫程序注釋語句是一種非常好的編程習慣。第四頁,共七十頁,2022年,8月28日[實例11.1]下面是一個關(guān)于創(chuàng)建學生表的程序,請大家注意注釋語句的書寫操作步驟:通過開始菜單打開查詢分析器。在查詢分析器的編輯窗口輸入程序設(shè)計語句,如下圖所示第五頁,共七十頁,2022年,8月28日批處理是一個以GO為結(jié)束標志的SQL語句組。批中的所有SQL語句作為一個整體編譯成一個執(zhí)行單元后一次提交給SQLServer服務(wù)器執(zhí)行。有多個批時,系統(tǒng)按批地順序依次執(zhí)行。11.2批處理

第六頁,共七十頁,2022年,8月28日[實例11.2]使用批處理選擇Pubs數(shù)據(jù)庫,然后創(chuàng)建一個視圖,最后使用視圖進行查詢。操作步驟: 通過開始菜單打開查詢分析器。在查詢分析器中輸入如下語句執(zhí)行結(jié)果如圖11.2所示第七頁,共七十頁,2022年,8月28日圖11.2批處理執(zhí)行結(jié)果第八頁,共七十頁,2022年,8月28日由上面的例子可以看出來,所有的批處理命令都使用GO作為結(jié)束標志。當編譯器讀到GO時,它就會把GO前面所有的語句當作一個批處理,而打包成一個數(shù)據(jù)包發(fā)送到服務(wù)器。GO本身并不是Transact-SQL語句組部分,它只是一個用于表示批處理結(jié)束的前端指令。當有多個批時,系統(tǒng)按批地順序依次執(zhí)行,關(guān)于批中有如下幾點需要注意:

(1)一個批處理中若有多個存儲過程,則從第二個存儲過程開始,每個存儲過程的前面都要加關(guān)鍵字EXECUTE或EXEC.(2)一般地,一個CREATE語句必須獨自占用一個批處理,且必須以CREATE語句開始。

(3)若使用ALTERTABLE語句修改表的結(jié)構(gòu),則不能在同一個批中引用新定義或修改的列。第九頁,共七十頁,2022年,8月28日執(zhí)行一個批時,若其中有一個語句出現(xiàn)編譯錯誤,則SQLServer將取消該批內(nèi)所有語句的執(zhí)行。但若一個批通過了編譯而在運行時出現(xiàn)錯誤,則批內(nèi)發(fā)生錯誤之前的語句將被執(zhí)行,發(fā)生錯誤的語句不被執(zhí)行,發(fā)生錯誤之后的語句視具體情況可能被執(zhí)行或不被執(zhí)行。因此,對于僅執(zhí)行了一部分的批,可能引起整個過程發(fā)生錯誤或產(chǎn)生數(shù)據(jù)垃圾。第十頁,共七十頁,2022年,8月28日為防止這類情況出現(xiàn),可以在SQLServer編程中引入“事務(wù)”(將在下節(jié)講到),將批處理放在一個事務(wù)中,并設(shè)置批處理發(fā)生錯誤時引發(fā)事務(wù)回滾,使所有尚未提交的操作都回滾到發(fā)生錯誤之前的狀態(tài)。第十一頁,共七十頁,2022年,8月28日事務(wù)是SQLServer的一個工作單元,事務(wù)通常以BEGINTRANSACTION開始,以COMMITTRANSACTION結(jié)束。如果在一個事務(wù)模塊中有一個SQL語句執(zhí)行失敗或發(fā)生不該有的結(jié)果,可以通過設(shè)置回滾命令ROLLBACKTRANSACTION取消該語句導致的錯誤操作結(jié)果(例如取消已插入的數(shù)據(jù)或恢復已被修改的數(shù)據(jù)),使數(shù)據(jù)庫恢復到該錯誤語句執(zhí)行前的狀態(tài)。11.3事務(wù)

第十二頁,共七十頁,2022年,8月28日[實例11.3]利用事務(wù)在第4章中的學生庫的學生信息表中插入兩行數(shù)據(jù),在插入第2行數(shù)據(jù)后回滾到兩次插入數(shù)據(jù)之間,然后查詢。步驟:啟動“查詢分析器”,輸入SQL語句:得到如下執(zhí)行結(jié)果如圖11.3所示11.3利用事務(wù)執(zhí)行語句第十三頁,共七十頁,2022年,8月28日然后對“課程”表進行查詢,執(zhí)行結(jié)果如下,如圖11.4所示。圖11.4事務(wù)執(zhí)行后的查詢結(jié)果第十四頁,共七十頁,2022年,8月28日這個例子一共執(zhí)行了兩次插入操作,第一次操作完成后,設(shè)置了一個保存點,第二次插入操作執(zhí)行完后,程序執(zhí)行了事務(wù)回滾,使第二次的插入操作被取消,但是第一次插入操作依然有效,這樣查詢后就只能得到一行插入數(shù)據(jù)。如果不設(shè)置保存點,則默認回滾整個事務(wù),兩次插入操作都將被取消。第十五頁,共七十頁,2022年,8月28日從上面的例子也可以看出,在一個事務(wù)中可以包含多個批處理,當然一個批處理也可以包含多個事務(wù)。兩者的區(qū)別是,批語句的組合發(fā)生在編譯階段,而事務(wù)語句的組合發(fā)生在執(zhí)行階段。一個批若在編譯階段發(fā)生語法錯誤,則在運行階段整個批都不能執(zhí)行。若編譯通過而在運行時發(fā)生錯誤,如違反主鍵惟一性約束等,則有兩種情況:若沒有設(shè)置事物回滾,默認時系統(tǒng)僅回滾發(fā)生錯誤的語句;若設(shè)置了事務(wù)回滾,則系統(tǒng)回滾事務(wù)。第十六頁,共七十頁,2022年,8月28日由上面的例子我們可以看出,建立一個事務(wù)包含四個語句,即開始事務(wù)、設(shè)置保存點、回滾事務(wù)、提交事務(wù)。

(1)開始(或啟動)一個事務(wù)單元。命令格式:

BEGINTRANSACTION單元名稱

(2)在事務(wù)中設(shè)置一個保存點。保存點的設(shè)置可以使得回滾事務(wù)語句回滾到該保存點,以便取消該事務(wù)中的部分操作對數(shù)據(jù)庫所引起的變動。命令格式:

SAVETRANSACTION保存點名稱第十七頁,共七十頁,2022年,8月28日(3)回滾一個事務(wù)單元。該語句用于取消事務(wù)中的部分或全部操作,使得這些操作對數(shù)據(jù)庫所作的改動恢復為改動前的狀態(tài)。命令格式:

ROLLBACKTRANSACTION單元名稱|保存點名稱

(4)提交(或完成)一個事務(wù)單元。提交一個事物后,在該事物中對數(shù)據(jù)庫所做的變動被保存到數(shù)據(jù)庫中。命令格式:

COMMITTRANSACTION單元名稱第十八頁,共七十頁,2022年,8月28日注意,一旦執(zhí)行了COMMITTRANSACTION語句,則事務(wù)被提交,此時將不再能夠回滾事務(wù)。在一個事務(wù)內(nèi)允許有重復的保存點名稱,但若在ROLLBACKTRANSACTION語句中使用重復的保存點名稱,則事物只回滾到離它最近的使用該保存點名稱的SAVETRANSACTION語句處。第十九頁,共七十頁,2022年,8月28日

Transact-SQL語言中有兩種形式的變量,一種是用戶自己定義的局部變量,另外一種是系統(tǒng)提供的全局變量。在使用方法以及具體意義上,這兩種變量都有著較大的區(qū)別,本節(jié)將分別介紹這兩種變量的使用方法。11.4變量

第二十頁,共七十頁,2022年,8月28日局部變量是在批處理(也可以是存儲過程或觸發(fā)器)內(nèi)由用戶定義并使用的變量。用戶在使用局部變量前必須事先聲明,而它的使用范圍也僅限于聲明它的批處理(也可以是存儲過程或觸發(fā)器)以內(nèi)。[實例11.4]

利用局部變量在數(shù)據(jù)庫學生庫的學生信息表中查詢學生“和平”的年齡。步驟:啟動查詢分析器,輸入如下SQL語句:按“F5”鍵或單擊工具欄“執(zhí)行查詢”圖標執(zhí)行。執(zhí)行結(jié)果如圖11.5所示局部變量

第二十一頁,共七十頁,2022年,8月28日圖11.5使用局部變量查詢的結(jié)果第二十二頁,共七十頁,2022年,8月28日從上面的例子,我們可以看出,通過聲明局部變量可以查詢學生信息表中任意的學生信息,只要修改賦給局部變量的值就可以。在使用局部變量查詢需要做到兩點:一是聲明局部變量,二是給局部變量賦值。第二十三頁,共七十頁,2022年,8月28日(1)聲明局部變量命令格式:

DECLARE(@局部變量名數(shù)據(jù)類型[,….n])

命令說明:DECLARE:該關(guān)鍵字表示將要聲明變量。數(shù)據(jù)類型可以是除text、ntext和image外的數(shù)據(jù)類型或用戶定義的數(shù)據(jù)類型。[,….n]:表示一個DECLARE語句中可以聲明多個局部變量,這些變量用逗號相隔。(2)局部變量的賦值聲明局部變量后,系統(tǒng)自動為變量賦初值NULL。若需要另外賦值,可以使用SET或SELECT語句。賦值語法如下:命令格式:

SELECT@局部變量名=表達式

[FROM表名[,….n]WHEREclause][+·n)

或SET@局部變量名=表達式第二十四頁,共七十頁,2022年,8月28日命令說明:表達式可以是一個具體的數(shù)據(jù)如數(shù)字、字符串等,也可以是一個表達式或另一個局部變量或全局變量,還可以是從一個查詢語句中查詢出來的數(shù)據(jù)。FROM子句用于向變量所賦的值源于由一個表中查詢所得數(shù)據(jù)的情形。一個SELECT語句可以為多個變量賦值,但一個SET語句僅能為一個變量賦值。若使用SELECT語句為變量賦值,則不能與其查詢功能同時使用。若使用SELECT語句從表中取數(shù)為變量賦值,則其返回的數(shù)據(jù)必須惟一,否則僅將最后一個數(shù)據(jù)賦給變量。第二十五頁,共七十頁,2022年,8月28日下面的例子是使用SELECT語句進行賦值,從表格中查詢出一條數(shù)據(jù)賦值給已經(jīng)聲明的變量:

USEpubsGODECLARE@authorvarchar(20)SELECT@author=au_idFROMauthorsWHEREstate=’MI’GO第二十六頁,共七十頁,2022年,8月28日11.4.2全局變量

在SQLServer中全局變量作為一種特殊函數(shù)由系統(tǒng)預(yù)先定義,因此有的教材把全局變量放到函數(shù)部分介紹,稱為SQLServer的內(nèi)置函數(shù)。常用的全局變量有三十多個,用于記錄數(shù)據(jù)庫服務(wù)器的工作信息及性能數(shù)據(jù)。全局變量的作用范圍是整個系統(tǒng),通常利用全局變量來檢測系統(tǒng)的設(shè)置值或執(zhí)行查詢命令后的狀態(tài)值。第二十七頁,共七十頁,2022年,8月28日[實例11.5]

使用全局變量來查詢SQLServer實例當前使用的語言和當前所使用語言的標識符。第二十八頁,共七十頁,2022年,8月28日

由上例可以看出全局變量以@@開頭,無需定義直接使用即可。除了上面的全局變量外,還有如@@CONNECTIONS返回自上次啟動SQLServer數(shù)據(jù)庫服務(wù)器以來連接或試圖連接的次數(shù),@@ERROR返回最近一次執(zhí)行T-SQL語句的錯誤代碼,@@version表示SQLServer的版本號等等,其他全局變量可參見幫助。第二十九頁,共七十頁,2022年,8月28日

SQLServer支持結(jié)構(gòu)化的編程方法,可以進行順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)的編程。本節(jié)結(jié)合例題介紹SQLServer2000的程序控制語句。

11.5程序控制語句

第三十頁,共七十頁,2022年,8月28日11.5.1BEGIN…END語句

BEGIN…END語句相當于其他計算機語言中的大括號或復合語句,它將多條T-SQL語句封裝成為一個整體的語句塊,T-SQL中允許使用嵌套的BEGIN…END語句。通常把BEGIN…END語句放在語句IF…ELSE或者WHILE中,使其中的語句作為一個整體來執(zhí)行。第三十一頁,共七十頁,2022年,8月28日[實例11.6]在學生成績表期中成績中檢查全體學生某門課程(課程編號為1001)的期中成績。如果某個學生的成績低于60分,則顯示文本:“1001科目的分數(shù)低于60分”,并顯示所有未及格學生的學號、姓名與期中成績分數(shù)。第三十二頁,共七十頁,2022年,8月28日命令格式:

BEGINT-SQL語句塊

END

命令說明:BEGIN、END分別表示語句塊的開始和結(jié)束。T-SQL語句塊可以是一條或一條以上的T-SQL語句。第三十三頁,共七十頁,2022年,8月28日11.5.2IF…ELSE語句

若希望在滿足某種條件的情況下執(zhí)行一些語句,而在該條件不滿足的情況下執(zhí)行另外一些語句。在這種情況下,我們就需要使用條件語句來在執(zhí)行T-SQL語句時強加條件,來控制語句執(zhí)行的順序。第三十四頁,共七十頁,2022年,8月28日[實例11.7]在學生信息表中統(tǒng)計學生的平均年齡,如果平均年齡小于20則輸出年齡組合正常,否則輸出大于平均年齡的學生的信息。第三十五頁,共七十頁,2022年,8月28日由上例我們可歸納出IF...ELSE語句的命令格式:

IF返回布爾表達式{T-SQL語句|BEGIN…END語句塊}[ELSE{T-SQL語句|BEGIN…END語句塊}]命令說明:返回“真”(TRUE)或“偽”(FALSE)的布爾表達式。如果布爾表達式中含有SELECT語句,則必須用圓括號將SELECT語句括起來。T-SQL語句|BEGIN…END語句塊:只能是一條。第三十六頁,共七十頁,2022年,8月28日11.5.3CASE語句

當有多個選擇方案時,如果使用IF…ELSE語句進行選擇判斷,則由于需要層層嵌套而非常不便,此時可以在SELECT語句中采用CASE結(jié)構(gòu)。CASE語句有兩種格式:簡單CASE函數(shù)與CASE搜索函數(shù)。前者將某個表達式與一組簡單表達式進行比較以確定結(jié)果;后者則需計算一組布爾表達式以確定結(jié)果。下面用實例加以說明。第三十七頁,共七十頁,2022年,8月28日[實例11.8]在pubs數(shù)據(jù)庫中根據(jù)作者來自的州的名字,打印出作者的姓名和州的全名第三十八頁,共七十頁,2022年,8月28日命令格式:CASE輸入表達式

WHEN比較的表達式THEN結(jié)果表達式[…n][ELSE返回結(jié)果表達式]END

命令說明;CASE后面的輸入表達式,用于進行比較。WHEN后面給出用于進行比較的表達式的數(shù)據(jù)類型必須相同,或者能夠隱性轉(zhuǎn)換。[…n)表示可以有多個WHEN…THEN結(jié)構(gòu)。第三十九頁,共七十頁,2022年,8月28日[實例11.9]

顯示學生成績中的期中成績分數(shù)。第四十頁,共七十頁,2022年,8月28日由上例可見,CASE搜索函數(shù)的WHEN后表達式是布爾表達式,這是與簡單CASE函數(shù)不同之處。命令格式;CASEWHEN邏輯表達式THEN[ELSE結(jié)果表達式]END第四十一頁,共七十頁,2022年,8月28日11.5.4WHILE語句

WHILE語句是一種條件循環(huán)語句,在滿足條件時執(zhí)行循環(huán)體,不滿足條件時跳出循環(huán)結(jié)構(gòu)。WHILE語句可以嵌套執(zhí)行,嵌套時首先運行內(nèi)層循環(huán),內(nèi)層循環(huán)結(jié)束之后再運行外層循環(huán)。第四十二頁,共七十頁,2022年,8月28日[實例11.10]在pubs數(shù)據(jù)庫中,將書價小于$30的書提高50%,如果提高后的書價超過$50,則輸出書價太貴。第四十三頁,共七十頁,2022年,8月28日由此,我們可給出命令格式:

WHILE邏輯表達式BEGIN

表達式

[BREAK][CONTINUE]END

命令說明:當邏輯表達式為真時,服務(wù)器將重復執(zhí)行SQL語句組。BREAK的作用是在某些情況發(fā)生時,立即無條件地跳出循環(huán),并開始執(zhí)行緊接在END后面的語句。CONTINUE的作用是在某些情況發(fā)生時,跳出本次循環(huán),開始執(zhí)行下一次循環(huán)。第四十四頁,共七十頁,2022年,8月28日11.5.5RETURN語句

RETURN語句用于從當前過程、批處理或語句塊中無條件退出,并不再執(zhí)行位于RETURN之后的語句。命令格式:

RETURN整型表達式命令說明:RETURN一般用于從存儲過程給調(diào)用過程或應(yīng)用程序返回整型值。除非特別指明,所有系統(tǒng)存儲過程返回0值表示成功,返回非0值則表示失敗。第四十五頁,共七十頁,2022年,8月28日11.6游標

數(shù)據(jù)庫的游標是類似于C語言指針一樣的語言結(jié)構(gòu)。SELECT語句是針對數(shù)據(jù)庫中表的所有數(shù)據(jù)進行處理的,如果需要對某一行數(shù)據(jù)進行處理,使用SELECT語句就顯得力不從心。游標正好彌補了這一缺陷,它類似于一個指針,可以定位于SELECT語句結(jié)果集合中的某指定行,從而對該行的數(shù)據(jù)進行操作。游標的使用過程依次為:聲明游標、打開游標、使用游標、關(guān)閉游標、釋放游標。第四十六頁,共七十頁,2022年,8月28日聲明游標

[實例11.11]

定義游標,打開學生信息表。第四十七頁,共七十頁,2022年,8月28日上面的例子首先通過DECLARE關(guān)鍵字來定義游標,然后選擇一個表,打開游標,就可以查詢到當前表中記錄的個數(shù)。其中@@cursor_row表示當前游標記錄數(shù)目是一個全局變量。由此,我們給出打開游標的命令格式:

DECLARE游標名稱[INSENSITIVE][SCROLL]CURSORFORSELECT語句

[FORREADONLY|UPDATE[OF列名1,列名2,列名3…]]第四十八頁,共七十頁,2022年,8月28日命令說明:游標名:為聲明游標所起的名字。INSENSITIVE:使用INSENSITIVE定義的游標,把提取出來的數(shù)據(jù)放入一個在tempdb數(shù)據(jù)庫里創(chuàng)建的臨時表里。任何通過這個游標進行的操作,都在這個臨時表里進行。所以所有對基本表的改動都不會在用游標進行的操作中體現(xiàn)出來。SCROLL:使用SCROLL關(guān)鍵字定義的游標,具有包括如下所示的所有取數(shù)功能:FIRST:取第一行數(shù)據(jù);LAST:取最后一行數(shù)據(jù);PRIOR:取前一行數(shù)據(jù);NEXT:取最后一行數(shù)據(jù);RELATIVE:按相對位置取數(shù)據(jù);ABSOLUTE:按絕對位置取數(shù)據(jù)。如果沒有在聲明時使用SCROLL關(guān)鍵字,那么所聲明的游標只具有默認的NEXT功能。第四十九頁,共七十頁,2022年,8月28日SELECT語句:一些標準的SELECT語句,主要用來定義游標所要進行處理的結(jié)果集。在聲明游標的SELECT語句中,不允許使用如COMPUTE,COMPUTEBY和INTO等關(guān)鍵字。FORREADONLY:聲明只讀光標。不允許通過只讀光標進行數(shù)據(jù)的更新。UPDATE[OF列名1,列名2,列名3…]:定義在這個游標里可以更新的列。如果定義了[OF列名1,列名2,列名3…],那么只有列在表中的列可以被更新;如果沒有定義[OF列名1,列名2,列名3…],那么游標里的所有列都可以被更新。第五十頁,共七十頁,2022年,8月28日打開游標

在可以使用游標之前,必須首先打開游標。開游標的語法如下:

OPENcursor_name使用關(guān)鍵字OPEN來打開游標,cursor_name為打開游標的名字。具體例子可參考[實例11.11]第五十一頁,共七十頁,2022年,8月28日11.6.3關(guān)閉與釋放游標

在打開游標后,SQLServer服務(wù)器會專門為游標開辟一定的內(nèi)存空間存放游標操作的數(shù)據(jù)結(jié)果集,同時游標的使用也會根據(jù)具體情況對某些數(shù)據(jù)進行封鎖。所以,在不使用游標的時候,一定要關(guān)閉游標,以通知服務(wù)器釋放游標所占用的資源。關(guān)閉游標的語法:

CLOSEcursor_name第五十二頁,共七十頁,2022年,8月28日關(guān)閉游標后可以再次打開游標,在一個批處理中也可以多次打開和關(guān)閉游標。而游標本身也會占用一定的計算機資源,所以在使用完游標后,為了回收被游標占用的資源,應(yīng)該將游標釋放。釋放游標的語法是:

DEALLOCATEcursor_name

當釋放完游標后,如果要重新使用這個游標必須重新執(zhí)行聲明游標的語句。第五十三頁,共七十頁,2022年,8月28日11.6.4使用游標

在打開游標以后,就可以打開游標通過FETCH語句提取數(shù)據(jù)了。[實例11.12]根據(jù)例11.11使用絕對位置以及相對位置來提取信息。第五十四頁,共七十頁,2022年,8月28日

FETCH語句的目的是從T-SQL服務(wù)器游標中檢索特定的記錄。使用游標提取數(shù)據(jù)的語法如下:

FETCH[[NEXT∣PRIOR∣FIRST∣LAST∣ABSOLUTE{n∣@nvar}∣IRELATIVE{n∣@nvar}FROM]{{游標名稱INTO變量第五十五頁,共七十頁,2022年,8月28日命令說明:NEXT:從當前記錄立即返回結(jié)果集合以及對返回的記錄增加當前記錄。如果FETCINEXT是通過游標第一次提取,返回結(jié)果集合的第一條記錄。NEXT是提取游標選項的默認選項。在處理當前記錄之前立即返回記錄以及減少返回記錄的當前記錄數(shù)目。PRIOR:讀取當前游標指針所指向行的上一行數(shù)據(jù),并將游標指向該上一行。如果FETCHPRIOR是通過游標第一次提取,沒有記錄返回并且光標停留在第一行。FIRST:返回第一條記錄并且作為當前記錄。LAST:返回最后一條記錄并作為當前記錄。ABSOLUTE{n∣@nva}:如果n或者@nva正數(shù),返回從前面游標起的第n記錄,并將其作為當前記錄;如果為負數(shù),那么返回當前游標前面的第n條記錄;如果是0,則沒有記錄返回。RELATIVE{n∣@nvar}:相對當前游標位置。第五十六頁,共七十頁,2022年,8月28日[實例11.13]

修改第5行的班級內(nèi)容:第五十七頁,共七十頁,2022年,8月28日11.7用戶自定義函數(shù)

在SQLServer2000中,為了使邏輯編程更為簡潔清晰,設(shè)計了函數(shù)的功能。有兩類函數(shù),系統(tǒng)內(nèi)置函數(shù)和用戶自定義函數(shù)。系統(tǒng)內(nèi)置函數(shù)包括數(shù)學函數(shù)(如max、min、count等)、字符串函數(shù)(如len、left等)、日期函數(shù)(如year、getdate等)、系統(tǒng)函數(shù)(如user),這些系統(tǒng)內(nèi)置函數(shù)。第五十八頁,共七十頁,2022年,8月28日除了可以使用系統(tǒng)提供的內(nèi)置函數(shù)外,用戶可以定義自己的函數(shù),來補充和擴展系統(tǒng)支持的內(nèi)置函數(shù)。用戶自定義函數(shù)可以像系統(tǒng)函數(shù)一樣在查詢或存儲過程中使用,也可以想存儲過程一樣通過EXECUTE命令來執(zhí)行。第五十九頁,共七十頁,2022年,8月28日11.7.1創(chuàng)建和調(diào)用用戶自定義函數(shù)

[實例11.14]創(chuàng)建一個函數(shù),根據(jù)是否為團員返回不同的數(shù)據(jù),如果輸入為1,即為團員則返回該團員的信息,否則返回非團員的信息。第六十頁,共七十頁,2022年,8月28日語句如下:

CREATEFUNCTIONee(@yongBIT)RETURNS@infoTABLE/*定義返回的表結(jié)構(gòu)*/(學號char(7),

姓名char(8),

期末成績int)ASBEGINIF@yong=1INSERT@info/*返回數(shù)據(jù)*/SELECT學生信息.學號,姓名,期末成績

FROM學生信息,學生成績

WHERE是否團員=1and學生信息.學號=學生成績.學號ELSEINSERT@info/*返回數(shù)據(jù)*/SELECT學生信息.學號,姓名,期末成績

FROM學生信息,學生成績

WHERE是否團員=0and學生信息.學號=學生成績.學號RETURNENDGOUSE學生庫SELECT*FROMdbo.ee(1)GO第六十一頁,共七十頁,2022年,8月28日我們可以給出創(chuàng)建函數(shù)的命令格式:

CREATEFUNCTION[所有者]函數(shù)的名稱

([{自定義函數(shù)的參數(shù)[AS]定義函數(shù)參數(shù)的數(shù)據(jù)類型])<function_option>:RETURNS函數(shù)返回值的數(shù)據(jù)類型

[WITH<函數(shù)選項>[[,]...n]][AS]BEGIN

函數(shù)體

RETURN標量值表達式

END:={ENCRYPTION|SCHEMABINDING}第六十二頁,共七十頁,2022年,8月28日11.7.2修改和刪除用戶自定義函數(shù)

刪除用戶自定義的函數(shù)的語法是:

DROPFUNCTION{[owner_name.]function_name}[,...n]命令說明:

(1)DROPFUNCTION:刪除函數(shù)命令的關(guān)鍵字。

(2)owner_name:刪除表的權(quán)力僅屬于表的擁有者,且不能轉(zhuǎn)移。

(3)function_name:函數(shù)的名稱。第六十三頁,共七十頁,2022年,8月28日[實例11.15]將對前面定義的ee函數(shù)進行修改,修改為如果為團員則輸出期末成績大于80的學生的信息。語句如下:ALTERFUNCTIONee(@yongBIT)/*修改函數(shù)ee*/RETURNS@infoTABLE/*定義返回的表結(jié)構(gòu)*/(學號char(7),

姓名char(8),

期末成績int)AS第六十四頁,共七十頁,2022年,8月28日BEGINIF@yong=1INSERT@info/*返回數(shù)據(jù)*/SELECT學生信息.學號,姓名,期末成績

FROM學生信息,學生成績

WHERE是否團員=1and學生信息.學號=學生成績.學號and期末成績>80ELSEINSERT@info/*返回數(shù)據(jù)*/SELECT學生信息.學號,姓名,期末成績

FROM學生信息,學生成績

WHERE是否團員=0and學生信息.學號=學生成績.學號RETURNENDGO第六十五頁,共七十頁,2022年,8月28日11.8本章總結(jié)

SQLServer支持結(jié)構(gòu)化的編程方法,可以進行邏輯編程,處理各種結(jié)構(gòu)的編程,從而完成較為復雜的作業(yè)。在本章中主要講述了批處理、事務(wù)、變量等概念,目的是讓大家在進行程序設(shè)計時使用這些SQLServer本身特有的方法以達到進行復雜程序設(shè)計的目的。另外還介紹了5種程序控制語句,游標的使用方法以及用戶自定義函數(shù)。大家應(yīng)該對SQLServer的編程邏輯有清楚的認識,能夠勝任復雜的數(shù)據(jù)查詢和修改工作。第六十六頁,共七十頁,2022年,8月28日11.9思考與實訓練習

思考題1.什么叫批處理,什么叫事務(wù),它們之間的關(guān)系是什么?2.執(zhí)行一個批處理時,如果批處理內(nèi)有一個語句錯誤,那么批內(nèi)的其他語句是否還執(zhí)行?3.執(zhí)行一個事務(wù)時,如果其內(nèi)部發(fā)生錯誤,但又沒與設(shè)置回滾,是否這些錯誤會被提交?4.SQLServe

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論