第九章_T-SQL編程與應用2_第1頁
第九章_T-SQL編程與應用2_第2頁
第九章_T-SQL編程與應用2_第3頁
第九章_T-SQL編程與應用2_第4頁
第九章_T-SQL編程與應用2_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、數(shù)據(jù)庫實用技術第九章第九章 T-SQLT-SQL編程與應用編程與應用T-SQL概述概述1T-SQL編程基礎編程基礎2流程控制語句流程控制語句3SQL Server 2008批處理批處理4事務事務5游標游標6數(shù)據(jù)庫實用技術9.4 9.4 批處理批處理v 批處理l 批處理是由一個或多個T-SQL語句組成的 。l 批處理結束的符號或標志是GO 。l 注意:uCreate Default、Create Function、Create Procedure、Create Rule、Create Schema、Create Trigger和 Create View語句不能在批處理中與其他語句組合使用。u不能

2、在同一個批處理中更改表,然后引用新列。第九章第九章 T-SQL編程與應用編程與應用SQL Server 2008數(shù)據(jù)庫實用技術vSQL Server服務器對批處理的處理分為四個階段:服務器對批處理的處理分為四個階段: 分析階段,檢查語法,驗證合法性分析階段,檢查語法,驗證合法性; 優(yōu)化階段,確定最有效的方法;優(yōu)化階段,確定最有效的方法; 編譯階段,生成執(zhí)行計劃;編譯階段,生成執(zhí)行計劃; 運行階段,執(zhí)行語句。運行階段,執(zhí)行語句。v批處理最重要的特征就是它作為一個不可分的實體批處理最重要的特征就是它作為一個不可分的實體在服務器上解釋和執(zhí)行。在服務器上解釋和執(zhí)行。數(shù)據(jù)庫實用技術v SQL Serve

3、r有以下幾種指定批處理的方法。有以下幾種指定批處理的方法。l應用程序。應用程序。l存儲過程或觸發(fā)器。存儲過程或觸發(fā)器。l由由EXECUTE語句執(zhí)行的字符串是一個批處理,并編譯語句執(zhí)行的字符串是一個批處理,并編譯為一個執(zhí)行計劃。例如,為一個執(zhí)行計劃。例如,EXEC (SELECT * FROM teachers)l由由sp_executesql系統(tǒng)存儲過程系統(tǒng)存儲過程執(zhí)行的字符串是一個批處執(zhí)行的字符串是一個批處理,并編譯為一個執(zhí)行計劃。理,并編譯為一個執(zhí)行計劃。(執(zhí)行可以多次重復使用或動態(tài)生成的 Transact-SQL 語句或批處理。Transact-SQL 語句或批處理可以包含嵌入?yún)?shù)。運行

4、時編譯語句可能會使應用程序受到惡意攻擊,例如,SQL 注入。)l例如:例如:execute sp_executesql NSELECT * from jxgl.dbo.teachers (1) 批處理的指定數(shù)據(jù)庫實用技術v GO是批處理的結束標志。把GO前面的所有語句當成一個批處理來執(zhí)行。v GO命令和T-SQL語句不可處在同一行上。v 在批處理的第一條語句后執(zhí)行任何存儲過程必須包含EXECUTE關鍵字。v 局部(用戶定義)變量的作用域限制在一個批處理中,不可在GO命令后引用。v RETURN可在任何時候從批處理中退出,而不執(zhí)行位于RETURN之后的語句。(2) 批處理的結束與退出數(shù)據(jù)庫實用技

5、術批處理批處理l (3)批處理執(zhí)行出錯的處理機制:u編譯錯誤(如語法錯誤)可使執(zhí)行計劃無法編譯。u大多數(shù)運行時錯誤將停止執(zhí)行批處理中當前語句和它之后的語句。u某些違反約束時錯誤僅停止執(zhí)行當前語句,而繼續(xù)執(zhí)行批處理中其他所有語句。u在遇到運行時錯誤的語句之前執(zhí)行的語句不受影響。第九章第九章 T-SQL編程與應用編程與應用SQL Server 2008數(shù)據(jù)庫實用技術USE BillingSystem1GO - 批處理結束標志CREATE VIEW customer_infoAS SELECT * FROM CustomerGO- CREATE VIEW語句與其他語句隔離SELECT * FROM

6、customer_infoGO補例 創(chuàng)建一個視圖,使用GO命令將CREATE VIEW語句與批處理中的其他語句(如USE、SELECT語句等)隔離。去掉go?數(shù)據(jù)庫實用技術為什么需要事務銀行轉賬銀行轉賬 v例如,銀行轉賬問題: 假定資金從賬戶A轉到賬戶B,至少需要兩步: 賬戶A的資金減少 然后賬戶B的資金相應增加 賬戶賬戶A賬戶賬戶B數(shù)據(jù)庫實用技術v假定張三的賬戶直接轉賬1000元到李四的賬戶為什么需要事務CREATE TABLE bank( customerName CHAR(10), -顧客姓名顧客姓名 currentMoney MONEY -當前余額當前余額)GOALTER TABLE

7、bank ADD CONSTRAINT CK_currentMoney CHECK(currentMoney=1)GOINSERT INTO bank(customerName,currentMoney) VALUES(張三張三,1000)INSERT INTO bank(customerName,currentMoney) VALUES(李四李四,1)創(chuàng)建賬戶表,存放用戶的賬戶信息創(chuàng)建賬戶表,存放用戶的賬戶信息添加約束:根據(jù)銀行規(guī)定,賬戶添加約束:根據(jù)銀行規(guī)定,賬戶余額不能少于余額不能少于1元,否則視為銷元,否則視為銷戶戶 張三開戶,開戶金額為張三開戶,開戶金額為1000元元 ;李四開戶,開

8、戶金額;李四開戶,開戶金額1元元 數(shù)據(jù)庫實用技術為什么需要事務v目前兩個賬戶的余額總和為:1000+1=1001元 數(shù)據(jù)庫實用技術為什么需要事務v模擬實現(xiàn)轉賬 : 從張三的賬戶轉賬1000元到李四的賬戶/*-轉賬測試:張三轉賬轉賬測試:張三轉賬1000元給李四元給李四-*/-我們可能會這樣這樣編寫語句我們可能會這樣這樣編寫語句-張三的賬戶少張三的賬戶少1000元,李四的賬戶多元,李四的賬戶多1000元元UPDATE bank SET currentMoney=currentMoney-1000 WHERE customerName=張三張三UPDATE bank SET currentMone

9、y=currentMoney+1000 WHERE customerName=李四李四GO-再次查看轉賬后的結果。再次查看轉賬后的結果。 SELECT * FROM bankGO請問:請問:執(zhí)行轉賬語句后,張三、李四的賬戶執(zhí)行轉賬語句后,張三、李四的賬戶余額為多少?余額為多少?張三的賬戶沒有減少張三的賬戶沒有減少 但李四的賬戶卻多了但李四的賬戶卻多了1000元元 100010012001元元 總額多出了總額多出了1000元!元!數(shù)據(jù)庫實用技術為什么需要事務-張三的賬戶減少張三的賬戶減少1000元,李四的賬戶增加元,李四的賬戶增加1000元元UPDATE bank SET currentMone

10、y=currentMoney-1000 WHERE customerName=張三張三UPDATE bank SET currentMoney=currentMoney+1000 WHERE customerName=李四李四GOv錯誤原因分析:UPDATE語句違反約束:語句違反約束:余額余額=1元元執(zhí)行失敗,所以張三還是執(zhí)行失敗,所以張三還是1000元元繼續(xù)往下執(zhí)行:執(zhí)行成功,所以李四變?yōu)槔^續(xù)往下執(zhí)行:執(zhí)行成功,所以李四變?yōu)?001元元如何解決呢?使用如何解決呢?使用事務事務數(shù)據(jù)庫實用技術v 例如,企業(yè)取消了倉儲部,需要將“倉儲部”從department表中刪除,而employee表中的部門

11、編號與倉儲部相對應的員工也應刪除。 假設倉儲部編號為D004,第一條DELETE語句修改department表為:DELETE FROM department WHERE department_id = D004 第二條DELETE語句修改employee表為:DELETE FROM employee WHERE department_id = D004v 因此,必須保證這兩條DELETE語句同時執(zhí)行,或都不執(zhí)行。這時可以使用數(shù)據(jù)庫中的事務(Transaction)技術來實現(xiàn)。數(shù)據(jù)庫實用技術 為了解決這種類似的情況,數(shù)據(jù)庫管理系統(tǒng)提出了事務的概念:v 將一組相關操作綁定在一個事務中,為了使事務

12、成功,必須成功完成該事務中的所有操作。v 事務對上面轉賬問題的解決方法是:把轉出和轉入作為一個整體,形成一個操作集合,這個集合中的操作要么都不執(zhí)行,要么都執(zhí)行。SQL Server 2008數(shù)據(jù)庫實用技術9.5 9.5 事務事務v 9.5.1 事務(Transaction)概念l 事務是完成一個應用處理的最小單元,由一個或多個對數(shù)據(jù)庫操作的語句序列組成。l 事務是一個不可分割的工作單位。要么所有的操作都順序完成,要么一個也不要做,絕不能只完成了部分操作,還有一些操作沒有完成。v 任何對數(shù)據(jù)的修改都是在事務環(huán)境中進行的。v 在關系數(shù)據(jù)庫中,一個事務可以是一條SQL語句,一組SQL語句或整個程序。

13、v 例如,使用DELETE 命令或UPDATE 命令對數(shù)據(jù)庫進行更新時一次只能操作一個表,這會帶來數(shù)據(jù)庫的數(shù)據(jù)不一致的問題。 第九章第九章 T-SQL編程與應用編程與應用SQL Server 2008數(shù)據(jù)庫實用技術事務的四特征(ACID)或四原則l 原子性(Atomicity):事務是數(shù)據(jù)庫的邏輯工作單位,事務中的操作要么都做,要么都不做。 l 一致性(Consistency):事務執(zhí)行的結果必須是使數(shù)據(jù)庫從一個一致性狀態(tài)變到另一個一致性狀態(tài)。l 隔離性(Isolation):一事務的執(zhí)行不能被其它事務干擾。 l 持續(xù)性(永久性) (Durability) :指事務一旦提交,則其對數(shù)據(jù)庫中數(shù)據(jù)

14、的改變就應該是永久的 。 事務四原則保證了一個事務或者成功提交,或者失敗滾回,二者必居其一,因此它對數(shù)據(jù)的修改具有可恢復性。即當事務失敗時,它對數(shù)據(jù)的修改都會恢復到該事務執(zhí)行前的狀態(tài)。數(shù)據(jù)庫實用技術事務事務v 9.5.2 事務分類l 按事務的啟動和執(zhí)行方式分:u自動提交事務:SQL Server 將一切操作作為事務處理,它不會在事務以外更改數(shù)據(jù)。如果沒有用戶定義事務,SQL Server會自己定義事務,稱為自動提交事務。每條單獨的語句都是一個事務。是SQL Server的默認事務管理模式。每個T-SQL語句如果成功地完成,則提交該語句;如果遇到錯誤,則回滾該語句。只要自動提交模式?jīng)]有被顯式或隱

15、性事務替代,SQL Server連接就以該默認模式進行操作。u顯式事務:用戶顯示定義了事務的啟動和結束。事務以BEGIN TRANSACTION語句顯式開始,以COMMIT或ROLLBACK語句顯式結束。 u隱性事務:在當前事務完成提交或回滾后,新事務自動啟動。隱性事務不需要使用BEGIN TRANSACTION語句標識事務的開始,但需要以COMMIT或ROLLBACK語句來提交或回滾事務。使用SET IMPLICIT_TRANSACTIONS ON / OFF語句可以啟動/關閉隱式事務模式。SET IMPLICIT_TRANSACTIONS OFF是關閉隱性設置,返回自動提交模式。 第九章第

16、九章 T-SQL編程與應用編程與應用數(shù)據(jù)庫實用技術事務事務v 9.5.3 事務語句l 一個顯示事務可以由三個語句來描述,分別為:u開始事務u提交事務u回滾事務第九章第九章 T-SQL編程與應用編程與應用SQL Server 2008數(shù)據(jù)庫實用技術事務事務l 1.開始事務:u顯式地指明一個事務的開始。u其語法格式為:BEGIN TRANSACTION 事務名|事務變量名l 2.提交事務:u標志一個事務的結束。u其語法格式為:COMMIT TRANSACTION 事務名|事務變量名第九章第九章 T-SQL編程與應用編程與應用SQL Server 2008數(shù)據(jù)庫實用技術事務事務l 3.事務回滾:u使

17、得事務回滾到起點或指定的保存點處,標志一個事務的結束。u其語法格式為:ROLLBACK TRANSACTION 事務名|事務變量名|保存點名|保存點變量名l 4.設置事務內保存點:u設置事務回滾的保存點。u其語法格式為: SAVE TRANSACTION 保存點名|保存點變量名第九章第九章 T-SQL編程與應用編程與應用SQL Server 2008數(shù)據(jù)庫實用技術事務事務l 5.錯誤處理語句:uTryCatch語句捕獲系統(tǒng)錯誤。u具體語法格式如下:BEGIN TRY END TRYBEGIN CATCH END CATCH第九章第九章 T-SQL編程與應用編程與應用SQL Server 200

18、8數(shù)據(jù)庫實用技術事務事務uTryCatch語句說明: Try塊后必須緊跟相關聯(lián)的 Catch塊。在 End Try和 Begin Catch語句之間不能有任何其他語句。 如果Try塊所包含的代碼中沒有錯誤,則當Try塊中最后一個語句完成運行后,將執(zhí)行 End Catch語句之后的語句。 如果 Try塊所包含的代碼中有錯誤,則跳轉到BEGIN CATCH后,執(zhí)行Catch塊語句。 如果End Catch語句是存儲過程或觸發(fā)器的最后一個語句,程序控制將回到調用該存儲過程或運行該觸發(fā)器的語句。 由Catch塊捕獲的錯誤不會返回到調用應用程序。 TryCatch構造可以嵌套。第九章第九章 T-SQL編

19、程與應用編程與應用SQL Server 2008數(shù)據(jù)庫實用技術事務事務【例9-11】在計費系統(tǒng)中,將客戶“新大白賓館”的客戶ID(CID)改為“20100146”?!痉治觥吭谟嬞M系統(tǒng)中,有四個表中含有CID字段:客戶信息表、產品表、帳單信息表和支付信息表。為了保證數(shù)據(jù)修改的一致性,修改CID應該在一事務中進行。第九章第九章 T-SQL編程與應用編程與應用SQL Server 2008數(shù)據(jù)庫實用技術事務事務【例9-11】代碼如下:USE BillingSystem1GODECLARE Cust_ID intSELECT Cust_ID=CID FROM Customer WHERE CName=

20、新大白賓館SELECT * FROM Customer WHERE CName=新大白賓館BEGIN TRANSACTION- 啟動事務BEGIN TRY UPDATE Customer SET CID=20100147 WHERE CID=Cust_ID UPDATE EProduct SET CID=20100147 WHERE CID=Cust_ID UPDATE Bills SET CID=20100147 WHERE CID=Cust_ID UPDATE Payment SET CID=20100147 WHERE CID=Cust_IDEND TRYBEGIN CATCH SELE

21、CT ERROR_LINE() AS ERRORLINE,- 返回發(fā)生錯誤的行號 ERROR_MESSAGE() AS ERRORMESSAGE- 返回錯誤信息 IF TRANCOUNT0 ROLLBACK TRANSACTION- 回滾事務END CATCHIF TRANCOUNT0 COMMIT TRANSACTION- 提交事務SELECT * FROM Customer WHERE CName=新大白賓館GOSQL Server 2008ERROR_LINE() ERROR_LINE() 數(shù)據(jù)庫實用技術【補例9-1】定義一個事務,向customer表添加一條記錄,并設置保存點。然后再刪

22、除該記錄,并滾回到事務的保存點,提交該事務。USE BillingSystem1GOBEGIN TRANSACTIONINSERT INTO Customer(CID, RID,CName,Cpassword, CRegistrationDate,CType,CStatus)VALUES(20134178,3104178,賴大金,615792,2013/5/22,流動,1)select * from CustomerWHERE CID =20134178SAVE TRANSACTION SAVEPOINT_1DELETE FROM CustomerWHERE CID =20134178ROLL

23、BACK TRANSACTION SAVEPOINT_1COMMIT TRANSACTIONGOselect * from CustomerWHERE CID =20134178數(shù)據(jù)庫實用技術【例9-2】定義一個事務,向course_score表中添加記錄。如果添加成功,則給該位同學加5分,否則不操作。BEGIN TRANSACTIONINSERT INTO course_score (stu_id,cour_id,score)VALUES(200712110111,1210022,58)IF ERROR=0BEGIN PRINT 添加成功UPDATE course_score SET sco

24、re=score+5 WHERE stu_id=200712110111COMMIT TRANSACTIONENDELSEBEGIN PRINT 添加失敗ROLLBACK TRANSACTIONEND數(shù)據(jù)庫實用技術使用事務時的考慮v1. 事務應該盡可能短。v2. 避免事務嵌套 數(shù)據(jù)庫實用技術9.6 9.6 游標游標v 9.6.1 游標概念l 游標(Cursor) :u游標是一種處理數(shù)據(jù)的方法,游標使得SQL Server語言可以逐行處理結果集中的數(shù)據(jù);u主要用在存儲過程、觸發(fā)器和 T-SQL腳本中。 u可以把游標看成一種指針,可以指向結果集中的任意位置,它允許用戶對指定位置的數(shù)據(jù)進行處理,可以

25、把結果集中的數(shù)據(jù)放在數(shù)組、應用程序中或其它地方。u游標把作為面向集合的數(shù)據(jù)庫管理系統(tǒng)和面向行的程序設計兩者聯(lián)系起來,才使兩個數(shù)據(jù)處理方式能夠進行溝通。第九章第九章 T-SQL編程與應用編程與應用SQL Server 2008數(shù)據(jù)庫實用技術9.6 9.6 游標游標l 游標包括以下兩個部分u游標結果集(Cursor Result Set)由定義該游標的SELECT語句返回的行的集合。u游標位置(Cursor Position)指向這個集合中某一行的指針。第九章第九章 T-SQL編程與應用編程與應用SQL Server 2008數(shù)據(jù)庫實用技術游標游標l 游標具有以下優(yōu)點u允許定位在結果集的特定行。u

26、從結果集的當前位置檢索一行或多行。u支持對結果集中當前位置的行進行數(shù)據(jù)修改。u為由其他用戶對顯示在結果集中的數(shù)據(jù)庫數(shù)據(jù)所做的更改提供不同級別的可見性支持。u提供腳本、存儲過程和觸發(fā)器中使用的訪問結果集中的數(shù)據(jù)的T-SQL語句。l SQL Server 2008支持以下兩種請求游標的方法uT-SQL:使用T-SQL語句定義的游標。u數(shù)據(jù)庫應用程序編程接口(Application Programming Interface,API)游標函數(shù)。第九章第九章 T-SQL編程與應用編程與應用SQL Server 2008數(shù)據(jù)庫實用技術9.6.2 使用游標使用游標(CURSOR)的步驟如下。聲明游標。在使

27、用游標之前,首先需要聲明游標。打開游標。打開一個游標意味著在游標中輸入了相關的記錄信息。獲取記錄信息。首先將游標當前指向的記錄保存到一個局部變量中,然后游標將自動移向下一條記錄。將一條記錄讀入某個局部變量后,就可以根據(jù)需要對其進行處理了。關閉游標。釋放游標鎖定的記錄集。釋放游標。釋放游標自身所占用的資源。數(shù)據(jù)庫實用技術游標游標l 1.聲明游標u游標在使用之前,必須先聲明。u聲明游標語句語法格式如下:DECLARE CURSOR INSENSITIVESCROLL CURSORFOR SELECT語句FOR READ ONLY|UPDATE OF 列名1,nu參數(shù)說明: INSENSITIVE:

28、在TempDB中建立創(chuàng)建由該游標使用數(shù)據(jù)的臨時表,并對其進行任何操作。 SCROLL:FIRST、LAST、PRIOR、NEXT(默認)、RELATIVE、ABSOLUTE。 SELECT語句:定義游標結果集的標準SELECT語句。 READ ONLY:定義只讀游標,不能修改數(shù)據(jù)。 UPDATE OF 列名1,n:定義游標中可更新的列。第九章第九章 T-SQL編程與應用編程與應用SQL Server 2008數(shù)據(jù)庫實用技術表1 Declare1 Declare命令中SCROLLSCROLL的取值SCROLL選項選項含義含義FIRST提取游標中的第一行數(shù)據(jù)提取游標中的第一行數(shù)據(jù)LAST提取游標中

29、的最后一行數(shù)據(jù)提取游標中的最后一行數(shù)據(jù)PRIOR提取游標當前位置的上一行數(shù)據(jù)提取游標當前位置的上一行數(shù)據(jù)NEXT提取游標當前位置的下一行數(shù)據(jù)提取游標當前位置的下一行數(shù)據(jù)RELATIVE n提取游標當前位置之前或之后的第提取游標當前位置之前或之后的第n行行數(shù)據(jù)數(shù)據(jù)(n正,往下,正,往下,n負,往上負,往上)ABSULUTE n提取游標中的第提取游標中的第n行數(shù)據(jù)行數(shù)據(jù)數(shù)據(jù)庫實用技術游標游標l 2.打開游標u打開游標使用OPEN語句,其語法格式如下:OPEN GLOBAL |u參數(shù)說明: GLOBAL選項是指定其后的游標為全局游標。u注意:u使用OPEN語句打開游標后,游標位置位于查詢結果集的第一

30、行。u只能打開已經(jīng)聲明但尚未打開的游標。第九章第九章 T-SQL編程與應用編程與應用SQL Server 2008數(shù)據(jù)庫實用技術游標游標l 3.提取數(shù)據(jù)u在打開游標后,利用FETCH語句從查詢結果集中提取數(shù)據(jù)。u使用FETCH語句一次可以提取一條記錄。uFETCH語句的語法格式如下:FETCH NEXT|PRIOR|FIRST|LAST|ABSOLUTE n|nvar|RELATIVE n|nvarFROMGLOBAL |INTO 變量名,n第九章第九章 T-SQL編程與應用編程與應用SQL Server 2008數(shù)據(jù)庫實用技術游標游標uFETCH語句參數(shù)說明: NEXT:提取緊跟當前行之后的

31、結果行,并且將當前行向后移一行。 PRIOR:提取緊臨當前行前面的一行,并且將當前行向前移一行。 FIRST:提取游標中的第一行并將其設置為當前行。 LAST:提取游標中的最后一行并將其設置為當前行。 ABSOLUTE n|nvar:如果n或nvar為正(負)數(shù),提取從游標頭開始(尾之前)的第n行,并將返回的行變成新的當前行;如果n或nvar為0,則沒有行返回。n或nvar必須為整型常量。 RELATIVE n|nvar:如果n或nvar為正(負)數(shù),提取當前行之后(前)的第n行,并將返回的行變成新的當前行;如果n或nvar為0,提取當前行。 GLOBAL:指定其后的游標是全局游標。 INTO

32、 變量名列表:允許將提取的列數(shù)據(jù)保存到局部變量中。第九章第九章 T-SQL編程與應用編程與應用SQL Server 2008數(shù)據(jù)庫實用技術游標游標l 4.關閉游標u關閉游標使用CLOSE語句,其語法格式如下:CLOSE GLOBAL |作用:關閉已打開的游標,之后不能對游標進行讀取等操作,但可以使用OPEN語句再次打開該游標。l 5.釋放游標u其語法格式如下: DEALLOCATE GLOBAL | 作用: 刪除游標與游標名或游標變量之間的聯(lián)系,并且釋放游標占 用的所有系統(tǒng)資源。 刪除后不可再用,必須重新聲明方可。第九章第九章 T-SQL編程與應用編程與應用SQL Server 2008數(shù)據(jù)庫

33、實用技術表2 fetch_status變量返回值返回值描描 述述0FETCH命令已成功執(zhí)行命令已成功執(zhí)行-1FETCH命令失敗或者行數(shù)據(jù)己超出了結果命令失敗或者行數(shù)據(jù)己超出了結果集集-2所讀取的數(shù)據(jù)已經(jīng)不存在。所讀取的數(shù)據(jù)已經(jīng)不存在。注意:游標位置決定了結果集中哪一行的數(shù)據(jù)可以被提取,如果游標方式為FOR UPDATE,則可決定哪一行數(shù)據(jù)庫可以更新或者刪除。FETCH_STATUS變量報告上一個FETCH語句的狀態(tài),其取值和含義如下:數(shù)據(jù)庫實用技術游標游標【例9-12】利用游標生成商業(yè)客戶的聯(lián)系人及聯(lián)系電話信息表?!痉治觥坑捎贔ETCH語句一次可以從結果集中取出一條記錄,但是商業(yè)客戶可能不止一

34、個。所以,要設計一個循環(huán),將FETCH語句放在循環(huán)體內,直到將結果集中的商業(yè)客戶的聯(lián)系人信息全部提取完,才跳出循環(huán)。第九章第九章 T-SQL編程與應用編程與應用SQL Server 2008數(shù)據(jù)庫實用技術【例9-12】代碼如下:DECLARE Cust_id int,Cust_RID int,Cust_name varchar(60),relationer_name varchar(20),relationer_tel char(11)PRINT - 商業(yè)客戶聯(lián)系人信息-DECLARE customer_cursor Cursor - 聲明游標customer_cursor FOR SELEC

35、T CID,RID,CName FROM Customer WHERE CType=商業(yè)OPEN customer_cursor- 打開游標customer_cursorFETCH NEXT FROM customer_cursor INTO Cust_id,Cust_RID,Cust_nameWHILE Fetch_Status=0BEGIN PRINT CONVERT(char(8),Cust_id)+ +Cust_name+聯(lián)系人: DECLARE relationer_cursor Cursor - 聲明游標relationer_cursor FOR SELECT RName,RTel

36、ephone FROM Relationer WHERE RID=Cust_RIDOPEN relationer_cursor FETCH NEXT FROM relationer_cursor INTO relationer_name,relationer_tel數(shù)據(jù)庫實用技術IF Fetch_Status0 PRINT 無聯(lián)系人ELSEBEGINWHILE Fetch_Status=0 BEGIN PRINT +relationer_name+,電話:+relationer_telFETCH NEXT FROM relationer_cursor INTO relationer_name,

37、relationer_tel END CLOSE relationer_cursor DEALLOCATE relationer_cursor FETCH NEXT FROM customer_cursor INTO Cust_id, Cust_RID,Cust_name ENDENDCLOSE customer_cursorDEALLOCATE customer_cursor數(shù)據(jù)庫實用技術DECLARE s int,n int,t int,c intSET S=0SET n=1WHILE n=10 BEGIN SET c=1 SET t=1 WHILE c=n BEGIN SET t=t*c SET c=c+1 END SET s=s+t SET n=n+1 ENDSELECT s as 10 階乘之和階乘之和,n

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論