第6章 SQL程序設(shè)計(jì)與開發(fā)-模板.ppt_第1頁(yè)
第6章 SQL程序設(shè)計(jì)與開發(fā)-模板.ppt_第2頁(yè)
第6章 SQL程序設(shè)計(jì)與開發(fā)-模板.ppt_第3頁(yè)
第6章 SQL程序設(shè)計(jì)與開發(fā)-模板.ppt_第4頁(yè)
第6章 SQL程序設(shè)計(jì)與開發(fā)-模板.ppt_第5頁(yè)
已閱讀5頁(yè),還剩33頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、數(shù)據(jù)庫(kù)原理與設(shè)計(jì),數(shù)據(jù)庫(kù)原理與設(shè)計(jì),第6章 SQL程序設(shè)計(jì)與開發(fā),數(shù)據(jù)庫(kù)原理與設(shè)計(jì),第6章 SQL程序設(shè)計(jì)與開發(fā),批處理與腳本 SQL程序設(shè)計(jì)基礎(chǔ) 流程控制語(yǔ)句 游 標(biāo) SQL程序的調(diào)試與錯(cuò)誤處理 SQL程序?qū)嵗?SQL Server數(shù)據(jù)庫(kù)應(yīng)用中復(fù)雜的業(yè)務(wù)數(shù)據(jù)處理需要編寫一些SQL程序來完成。 SQL程序是面向過程的語(yǔ)言與SQL的結(jié)合,可以進(jìn)行復(fù)雜的數(shù)據(jù)處理。,數(shù)據(jù)庫(kù)原理與設(shè)計(jì),在數(shù)據(jù)庫(kù)應(yīng)用的客戶端適當(dāng)使用批處理具有以下優(yōu)點(diǎn): 減少數(shù)據(jù)庫(kù)服務(wù)器與客戶端之間的數(shù)據(jù)傳輸次數(shù),消除過多的網(wǎng)絡(luò)流量。 減少數(shù)據(jù)庫(kù)服務(wù)器與客戶端之間傳輸?shù)臄?shù)據(jù)量。 縮短完成邏輯任務(wù)或事務(wù)所需的時(shí)間。 較短的事務(wù)不會(huì)長(zhǎng)期占有

2、數(shù)據(jù)庫(kù)資源,能盡快釋放鎖,有效避免死鎖。 增加邏輯任務(wù)處理的模塊化,提高代碼的可復(fù)用度,減少維護(hù)工作量。,批處理與腳本,批處理由一個(gè)或多個(gè)SQL語(yǔ)句組成,應(yīng)用程序?qū)⑦@些語(yǔ)句作為一個(gè)整體單元提交給SQL Server,由SQL Server編譯成一個(gè)執(zhí)行單元,然后作為一個(gè)整體來執(zhí)行。批處理的種類較多,如存儲(chǔ)過程、觸發(fā)器、函數(shù)內(nèi)的所有語(yǔ)句都構(gòu)成了一個(gè)批處理。,數(shù)據(jù)庫(kù)原理與設(shè)計(jì),批處理的執(zhí)行,只要批處理中的語(yǔ)句沒有任何語(yǔ)法錯(cuò)誤,就可以經(jīng)過編譯建立執(zhí)行計(jì)劃。,(1)不能建立執(zhí)行計(jì)劃的批處理 在下面的示例中,批處理中存在語(yǔ)法錯(cuò)誤,不能建立執(zhí)行計(jì)劃,其中Pubs是SQL Server自帶的測(cè)試數(shù)據(jù)庫(kù)。 U

3、SE pubs CREATE TABLE TestBatch (Cola INT PRIMARY KEY, Colb CHAR(3) INSERT INTO TestBatch VALUES (1, aaa) INSERT INTO TestBatch VALUES (2, bbb) INSERT INTO TestBatch VALUSE (3, ccc) /* 語(yǔ)法錯(cuò)誤 ,VALUES 拼寫錯(cuò)誤*/ SELECT * FROM TestBatch GO,數(shù)據(jù)庫(kù)原理與設(shè)計(jì),批處理的執(zhí)行,下面的示例沒有語(yǔ)法錯(cuò)誤,可以建立執(zhí)行計(jì)劃。在執(zhí)行過程中,由于第3個(gè)INSERT語(yǔ)句產(chǎn)生主鍵重復(fù)的錯(cuò)誤,因此

4、該INSERT語(yǔ)句與之后的SELECT語(yǔ)句不能被執(zhí)行。由于前兩個(gè)INSERT語(yǔ)句成功地執(zhí)行并且提交,因此它們?cè)诎l(fā)生運(yùn)行時(shí)錯(cuò)誤之后被保留下來。 USE pubs CREATE TABLE TestBatch (Cola INT PRIMARY KEY, Colb CHAR(3) INSERT INTO TestBatch VALUES (1, aaa) INSERT INTO TestBatch VALUES (2, bbb) INSERT INTO TestBatch VALUES (1, ccc) /* 主鍵重復(fù)*/ SELECT * FROM TestBatch /* 返回行1和2的記錄*

5、/ GO,數(shù)據(jù)庫(kù)原理與設(shè)計(jì),編寫批處理的規(guī)則, 不能在同一個(gè)批處理中更改表,然后引用新列。 不能在刪除一個(gè)對(duì)象之后,立即在同一個(gè)批處理中引用該對(duì)象。 不能在定義一個(gè)CHECK約束后,立即在同一個(gè)批處理中使用該約束。 CREATE DEFAULT、CREATE PROCEDURE、CREATE RULE、CREATE TRIGGER和CREATE VIEW語(yǔ)句,在一個(gè)批處理中只能提交一個(gè)。 如果批處理中的第一句是執(zhí)行某些存儲(chǔ)過程的EXECUTE語(yǔ)句,則EXECUTE關(guān)鍵字可以省略不寫。如果EXECUTE語(yǔ)句不是批處理中的第一條語(yǔ)句,則需要EXECUTE關(guān)鍵字。,數(shù)據(jù)庫(kù)原理與設(shè)計(jì),腳本,Trans

6、act-SQL語(yǔ)句的集合稱為腳本。 Transact-SQL腳本存儲(chǔ)為文件,帶有sql擴(kuò)展名。 把編寫好的SQL語(yǔ)句(例如,創(chuàng)建數(shù)據(jù)庫(kù)對(duì)象、調(diào)試通過的SQL 語(yǔ)句集合)保存起來,以便下一次執(zhí)行同樣(或類似)操作時(shí),調(diào)用這些語(yǔ)句集合。這樣可以省去重新編寫調(diào)試SQL語(yǔ)句的麻煩,提高工作效率。 腳本文件可以調(diào)入查詢分析器查看內(nèi)容或再次被執(zhí)行,也可以通過記事本等瀏覽器查看內(nèi)容。,數(shù)據(jù)庫(kù)原理與設(shè)計(jì),SQL程序設(shè)計(jì)基礎(chǔ),1SQL程序基本成分 2SQL程序編寫規(guī)范,數(shù)據(jù)庫(kù)原理與設(shè)計(jì),變量,Transact-SQL中的變量分為局部變量和全局變量。 局部變量的聲明格式為: DECLARE local_varia

7、ble data_type , local_variable data_type. 如: DECLARE empidvar INT SET empidvar = 1234 SELECT * FROM Employees WHERE Employeeid = empidvar DECLARE pub_id CHAR(4), hire_date DATETIME SET pub_id = 0877 SET hire_date = 1/01/93 SELECT pub_id = 0877, hire_date = 1/01/93 /*使用SELECT賦值也可以*/ SELECT Fname, Lna

8、me FROM Employee WHERE Pub_id = pub_id AND Hire_date = hire_date,數(shù)據(jù)庫(kù)原理與設(shè)計(jì),運(yùn)算符,SQL Server提供賦值運(yùn)算符、算術(shù)運(yùn)算、邏輯運(yùn)算、位運(yùn)算、比較運(yùn)算、字符串連接運(yùn)算符等。 賦值運(yùn)算符“=”用于將表達(dá)式的值賦給某個(gè)變量。 算術(shù)運(yùn)算符在兩個(gè)表達(dá)式上執(zhí)行數(shù)學(xué)運(yùn)算,包括加法(+)、減法()、乘法(*)、除法(/)、取模(%)等運(yùn)算,加減運(yùn)算也可用于datetime和smalldatetime日期類型。 位運(yùn)算符可以在兩個(gè)表達(dá)式之間執(zhí)行位操作,包括按位與( /* 定義變量*/ IF (CubeLength0) AND (Cu

9、beWidth 0) AND (CubeHeight0) SELECT Volume =CubeLength * CubeWidth * CubeHeight ELSE SELECT Volume =-1; /* 條件分支流程*/ RETURN (Volume ) END,數(shù)據(jù)庫(kù)原理與設(shè)計(jì),SQL程序編寫規(guī)范,對(duì)變量和數(shù)據(jù)庫(kù)對(duì)象等標(biāo)識(shí)符采用有意義的命名 編寫代碼時(shí)養(yǎng)成合理的大小寫習(xí)慣 對(duì)存儲(chǔ)過程、游標(biāo)等數(shù)據(jù)庫(kù)對(duì)象命名時(shí),采用適當(dāng)?shù)那熬Y和后綴 代碼采用縮進(jìn)方式 在程序中增加適當(dāng)?shù)淖⑨?數(shù)據(jù)庫(kù)原理與設(shè)計(jì),流程控制語(yǔ)句,數(shù)據(jù)庫(kù)原理與設(shè)計(jì),語(yǔ)句塊:BEGINEND,USE pubs IF (SELEC

10、T COUNT(*) FROM deleted, sales WHERE sales.title_id = deleted.title_id) 0 BEGIN ROLLBACK TRANSACTION PRINT You cant delete a title with sales. END,BEGINEND關(guān)鍵字之間封裝了一系列的 SQL 語(yǔ)句,形成一個(gè)語(yǔ)句塊,代表一組一起執(zhí)行的SQL 語(yǔ)句。BEGINEND的語(yǔ)法結(jié)構(gòu)如下: BEGIN SQL 語(yǔ)句1 SQL 語(yǔ)句2 END,數(shù)據(jù)庫(kù)原理與設(shè)計(jì),條件執(zhí)行:IF.ELSE語(yǔ)句,IF.ELSE語(yǔ)句的語(yǔ)法結(jié)構(gòu)如下: IF 布爾表達(dá)式 SQL 語(yǔ)句|

11、 SQL 語(yǔ)句塊 ELSE SQL 語(yǔ)句| SQL 語(yǔ)句塊 IF.ELSE語(yǔ)句允許嵌套,可以在其他IF之后或在ELSE下面,嵌套另一個(gè)IF語(yǔ)句,嵌套層數(shù)沒有限制。,數(shù)據(jù)庫(kù)原理與設(shè)計(jì),條件執(zhí)行:IF.ELSE語(yǔ)句(2),USE pubs IF (SELECT AVG(price) FROM titles WHERE type = mod_cook) $15 BEGIN PRINT the following titles are excellent mod_cook books: PRINT SELECT SUBSTRING(title, 1, 35) AS Title FROM titles

12、WHERE type = mod_cook END ELSE PRINT Average title price is more than $15.,數(shù)據(jù)庫(kù)原理與設(shè)計(jì),條件執(zhí)行:IF.ELSE語(yǔ)句(3),USE pubs IF (SELECT AVG (price) FROM titles WHERE type = mod_cook) $15 BEGIN PRINT The following titles are expensive mod_cook books: PRINT SELECT SUBSTRING (title, 1, 35) AS Title FROM titles WHERE

13、 type = mod_cook END,數(shù)據(jù)庫(kù)原理與設(shè)計(jì),多分支CASE表達(dá)式,簡(jiǎn)單CASE函數(shù)將某個(gè)表達(dá)式與一組簡(jiǎn)單表達(dá)式進(jìn)行比較以確定結(jié)果。 CASE搜索函數(shù)計(jì)算一組布爾表達(dá)式以確定結(jié)果。,簡(jiǎn)單CASE表達(dá)式的語(yǔ)法結(jié)構(gòu)如下: CASE 表達(dá)式 WHEN表達(dá)式THEN表達(dá)式 . . ELSE 表達(dá)式 END CASE 搜索函數(shù)的語(yǔ)法結(jié)構(gòu)如下: CASE WHEN 布爾表達(dá)式 THEN表達(dá)式 . . ELSE表達(dá)式 END,數(shù)據(jù)庫(kù)原理與設(shè)計(jì),多分支CASE表達(dá)式,USE pubs GO SELECT Category = CASE type WHEN popular_comp THEN Po

14、pular Computing WHEN mod_cook THEN Modern Cooking WHEN business THEN Business WHEN psychology THEN Psychology WHEN trad_cook THEN Traditional Cooking ELSE Not yet categorized END, CAST (title AS varchar(25) AS Shortened Title, price AS Price FROM titles WHERE price IS NOT NULL ORDER BY type, price C

15、OMPUTE AVG(price) BY type - CAST函數(shù)的功能是將某種數(shù)據(jù)類型的表達(dá)式顯式轉(zhuǎn)換為另一種數(shù)據(jù)類型,數(shù)據(jù)庫(kù)原理與設(shè)計(jì),循環(huán):WHILE語(yǔ)句,WHILE語(yǔ)句的語(yǔ)法結(jié)構(gòu)如下: WHILE布爾表達(dá)式 SQL 語(yǔ)句| SQL 語(yǔ)句塊 BREAK SQL 語(yǔ)句| SQL 語(yǔ)句塊 CONTINUE WHILE語(yǔ)句也允許嵌套。 BREAK語(yǔ)句使程序從最內(nèi)層的WHILE循環(huán)中退出。 CONTINUE語(yǔ)句使WHILE循環(huán)重新開始執(zhí)行,忽略CONTINUE關(guān)鍵字后的語(yǔ)句。,數(shù)據(jù)庫(kù)原理與設(shè)計(jì),循環(huán):WHILE語(yǔ)句(2),USE pubs GO WHILE (SELECT AVG(price)

16、 FROM titles) $50 BREAK ELSE CONTINUE END PRINT Too much for the market to bear,數(shù)據(jù)庫(kù)原理與設(shè)計(jì),循環(huán):WHILE語(yǔ)句(3),DECLARE counter smallint SET counter = 1 WHILE counter 5 BEGIN SELECT RAND(counter) Random_Number SET NOCOUNT ON SET counter = counter + 1 SET NOCOUNT OFF END GO,數(shù)據(jù)庫(kù)原理與設(shè)計(jì),非條件執(zhí)行:GOTO 語(yǔ)句,GOTO語(yǔ)句的語(yǔ)法結(jié)構(gòu)如

17、下: 標(biāo)簽 : -定義標(biāo)簽 GOTO 標(biāo)簽-改變執(zhí)行,USE pubs GO DECLARE tablename sysname SET tablename = Nauthors table_loop: -定義標(biāo)簽 IF (FETCH_STATUS -2) BEGIN SELECT tablename = RTRIM(UPPER(tablename) EXEC (SELECT + tablename + = COUNT(*) FROM + tablename ) PRINT END FETCH NEXT FROM tnames_cursor INTO tablename IF (FETCH_S

18、TATUS -1) GOTO table_loop -改變執(zhí)行 GO,數(shù)據(jù)庫(kù)原理與設(shè)計(jì),調(diào)度執(zhí)行:WAITFOR,BEGIN WAITFOR TIME 22:20 EXECUTE update_all_stats END。,語(yǔ)法結(jié)構(gòu)如下: WAITFOR DELAY 時(shí)間 | TIME 時(shí)間 其中DELAY指定等待的時(shí)間間隔,最長(zhǎng)可達(dá) 24 小時(shí);TIME指定等待到的時(shí)間點(diǎn),即觸發(fā)的具體時(shí)間;時(shí)間可以是datetime 數(shù)據(jù)類型,格式為hh:mm:ss,不指定日期。,在晚上 10:20 執(zhí)行存儲(chǔ)過程 update_all_stats。,數(shù)據(jù)庫(kù)原理與設(shè)計(jì),游標(biāo),SELECT語(yǔ)句返回所有滿足條件的

19、完整記錄集,在數(shù)據(jù)庫(kù)應(yīng)用程序中常常需要處理結(jié)果集的一行或多行。游標(biāo)(CURSOR)是結(jié)果集的邏輯擴(kuò)展,可以看作是指向結(jié)果集的一個(gè)指針,通過使用游標(biāo),應(yīng)用程序可以逐行訪問并處理結(jié)果集。 使用游標(biāo)時(shí),應(yīng)先聲明,然后打開,接著使用;使用完后關(guān)閉、釋放資源。,數(shù)據(jù)庫(kù)原理與設(shè)計(jì),游標(biāo),聲明游標(biāo):DECLARE CURSOR語(yǔ)句 打開游標(biāo):OPEN語(yǔ)句 讀取數(shù)據(jù):FETCH語(yǔ)句 關(guān)閉游標(biāo):CLOSE語(yǔ)句 釋放游標(biāo):DEALLOCATE語(yǔ)句,數(shù)據(jù)庫(kù)原理與設(shè)計(jì),游標(biāo)使用實(shí)例,USE MS BEGIN DECLARE Cno VARCHAR(5) -變量:課程編號(hào) DECLARE Clname VARCHAR

20、(30) -變量:班級(jí)名稱 DECLARE clno VARCHAR (6) -變量:班級(jí)編號(hào) DECLARE avgscore NUMERIC(10,2) -變量:平均成績(jī) DECLARE Cterm INT -變量:學(xué)期 DECLARE class_cursor CURSOR FOR SELECT clname,clno,dbo.termConvert(2005-2006/2 ,clno) FROM class -聲明班級(jí)游標(biāo) /*其中termConvert函數(shù)是自定義函數(shù),可以將如“2006-2007/2”的學(xué)期表述的字符串方式轉(zhuǎn)換為如1、2、3等表述的數(shù)字方式。如2005年入學(xué)的同學(xué)的

21、“2006-2007/2”學(xué)期是其在校的第4學(xué)期 */ OPEN class_cursor -打開班級(jí)游標(biāo) FETCH NEXT FROM class_cursor INTO CLname,clno, Cterm -讀取游標(biāo)數(shù)據(jù) WHILE FETCH_STATUS = 0 -檢測(cè)游標(biāo)數(shù)據(jù)是否讀取完,如果還有數(shù)據(jù),繼續(xù)循環(huán) BEGIN SET avgscore=(SELECT ISNULL(avg(score) ,0) FROM sc a ,student b ,class c,course d WHERE a.sno=b.sno AND b.clno=c.clno AND b.clno=cl

22、no AND o=o AND d.Cterm=Cterm),數(shù)據(jù)庫(kù)原理與設(shè)計(jì),游標(biāo)使用實(shí)例(2),IF avgscore0 /* 根據(jù)班級(jí)平均成績(jī)是否為0判斷,該班的成績(jī)是否登記,如果為0,表明沒有登記該班的在2005-2006/2學(xué)期的成績(jī) */ BEGIN PRINT 2005-2006/2+學(xué)期 +CLname+ 各門課總平均成績(jī)?yōu)?str(avgscore,5,1) -每個(gè)學(xué)生的平均成績(jī)和獲得的學(xué)分 PRINT 該班每個(gè)學(xué)生的平均成績(jī)?nèi)缦拢?SELECT e.sname ,d.avgscore ,totalCredit FROM (SELECT a.sno,AVG(score) avg

23、score,SUM(dbo.CreditConvert(score,CCredits) totalCredit FROM student a ,sc b,course c WHERE a.sno=b.sno AND o=o AND c.cterm=Cterm GROUP BY a.sno) d ,student e,class f WHERE e.sno=d.sno AND e.clno=f.clno AND f.clno=clno END ELSE PRINT 2005-2006/2+學(xué)期 +CLname+ 成績(jī)沒有登記 FETCH NEXT FROM class_cursor INTO C

24、Lname,clno, Cterm END CLOSE class_cursor DEALLOCATE class_cursor END,數(shù)據(jù)庫(kù)原理與設(shè)計(jì),SQL程序的錯(cuò)誤類型,語(yǔ)法錯(cuò)誤是指不符合Transact-SQL規(guī)范的錯(cuò)誤,這類錯(cuò)誤會(huì)導(dǎo)致SQL語(yǔ)句不能編譯。不熟悉語(yǔ)法規(guī)范經(jīng)常會(huì)導(dǎo)致這類錯(cuò)誤的發(fā)生。 還有一些錯(cuò)誤雖然沒有語(yǔ)法錯(cuò)誤,也不會(huì)使SQL語(yǔ)句執(zhí)行失敗,但確實(shí)不能實(shí)現(xiàn)預(yù)設(shè)的功能,這是一種邏輯錯(cuò)誤。邏輯錯(cuò)誤不僅會(huì)發(fā)生在程序開發(fā)階段,也常常會(huì)出現(xiàn)在程序?qū)嶋H運(yùn)行階段。只有非常清楚程序需要實(shí)現(xiàn)的功能,才能避免此類錯(cuò)誤。如果發(fā)生了邏輯錯(cuò)誤,可以跟蹤程序的執(zhí)行流程,逐行、逐段地檢查程序執(zhí)行結(jié)果,

25、發(fā)現(xiàn)產(chǎn)生問題的原因。 運(yùn)行時(shí)錯(cuò)誤是指SQL程序在執(zhí)行過程中出現(xiàn)的意想不到的錯(cuò)誤,如由于鎖表影響對(duì)數(shù)據(jù)表的更改、修改數(shù)據(jù)庫(kù)對(duì)象時(shí)違反數(shù)據(jù)完整性與一致性的約束等。這類錯(cuò)誤導(dǎo)致了一些SQL語(yǔ)句執(zhí)行失敗。采取必要的邊界處理和錯(cuò)誤處理,可以減少此類錯(cuò)誤的發(fā)生次數(shù)。,數(shù)據(jù)庫(kù)原理與設(shè)計(jì),SQL程序的錯(cuò)誤處理,1定位錯(cuò)誤發(fā)生的位置 2判定錯(cuò)誤原因 3簡(jiǎn)化程序以便調(diào)試,數(shù)據(jù)庫(kù)原理與設(shè)計(jì),學(xué)分轉(zhuǎn)換函數(shù), 功能要求:將學(xué)生考試成績(jī)轉(zhuǎn)換成學(xué)分的功能。如果考試通過獲得該課程的學(xué)分,否則獲得學(xué)分為0。 入口參數(shù):成績(jī)和課程學(xué)分, 返回:返回應(yīng)得學(xué)分。 CREATE FUNCTION CreditConvert( scor

26、e NUMERIC(3,1),CCredits NUMERIC (3,1) -score:考試成績(jī) -CCredits:課程規(guī)定學(xué)分 RETURNS NUMERIC (5,2) -應(yīng)得學(xué)分 AS BEGIN RETURN CASE SIGN(score-60) WHEN 1 THEN CCredits WHEN 0 then CCredits WHEN -1 then 0 END END,數(shù)據(jù)庫(kù)原理與設(shè)計(jì),學(xué)期轉(zhuǎn)換函數(shù), 入口參數(shù):學(xué)年和入學(xué)年份 返回:數(shù)字表示的學(xué)期。 -termConvert 功能:學(xué)期轉(zhuǎn)換 CREATE function termConvert( trem CHAR(11

27、),clno CHAR (6) -trem 學(xué)年,格式如:2006-2007/2 - clno 班級(jí)編號(hào),格式如:020001,前2位代表入學(xué)年份 RETURNS INT - 在校第幾學(xué)期 AS BEGIN RETURN CONVERT(NUMERIC,SUBSTRING(trem,1,4)-CONVERT(NUMERIC,20+ SUBSTRING(clno,1,2)*2+CONVERT(NUMERIC,SUBSTRING(trem,11,1) ) END,數(shù)據(jù)庫(kù)原理與設(shè)計(jì),統(tǒng)計(jì)平均成績(jī),CREATE PROCEDURE p_AverageScore term varchar(11)-入口參

28、數(shù):學(xué)期 -學(xué)期的格式為:XXXX-XXXX/X。 -前9位標(biāo)別學(xué)年,最后一位表示本學(xué)年的第幾學(xué)期。如2005-2006/2表示2005-2006學(xué)年的第2學(xué)期。 AS BEGIN DECLARE Cno VARCHAR(5) -變量:課程編號(hào) DECLARE Clname VARCHAR (30) -變量:班級(jí)名稱 DECLARE clno VARCHAR (6) -變量:班級(jí)編號(hào) DECLARE avgscore NUMERIC(10,2) -變量:平均成績(jī) DECLARE Cterm INT -變量:學(xué)期 DECLARE class_cursor CURSOR FOR SELECT CL

29、name,CLno,dbo.termConvert(term ,clno) FROM class -聲明班級(jí)游標(biāo) /*其中termConvert函數(shù)是自定義函數(shù),可以將如“2006-2007/2”的學(xué)期表述的字符串方式轉(zhuǎn)換為如1、2、3等表述的數(shù)字方式。如2005年入學(xué)的同學(xué)的“2006-2007/2”學(xué)期是其在校的第4學(xué)期 */,數(shù)據(jù)庫(kù)原理與設(shè)計(jì),統(tǒng)計(jì)平均成績(jī),OPEN class_cursor -打開班級(jí)游標(biāo) FETCH NEXT FROM class_cursor INTO CLname,clno, Cterm -讀取游標(biāo)數(shù)據(jù) WHILE FETCH_STATUS = 0 -檢測(cè)游標(biāo)數(shù)據(jù)

30、是否讀取完,如果還有數(shù)據(jù),繼續(xù)循環(huán) BEGIN SET avgscore=(SELECT ISNULL(avg(Score) ,0) FROM SC a ,Student b ,Class c,Course d WHERE a.SNo=b.SNo AND b.CLno=c.CLno AND b.CLno=clno AND a.CNo=d.CNo AND d.Cterm=Cterm) IF avgscore0 /* 根據(jù)班級(jí)平均成績(jī)是否為0判斷該班的成績(jī)是否登記,如果為0,表明沒有登記該班的在本學(xué)期的成績(jī) */ BEGIN PRINT term +學(xué)期 +CLname+ 各門課總平均成績(jī)?yōu)?st

31、r(avgscore,5,1) -每個(gè)學(xué)生的平均成績(jī)和獲得的學(xué)分 PRINT 該班每個(gè)學(xué)生的平均成績(jī)?nèi)缦拢?SELECT e.SName ,d.avgscore ,totalCredit FROM (SELECT a.SNo,AVG(score) avgscore,SUM(dbo.CreditConvert(score,CCredits) totalCredit FROM Student a, SCb, Course c WHERE a.SNo=b.SNo AND b.CNo=c.CNo AND c.Cterm=Cterm GROUP BY a.SNo) d ,Student e,Class

32、f WHERE e.SNo=d.SNo AND e.CLno=f.CLno AND f.CLno=clno END ELSE PRINT term +學(xué)期 +CLname+ 成績(jī)沒有登記 FETCH NEXT FROM class_cursor INTO CLname,clno, Cterm END CLOSE class_cursor DEALLOCATE class_cursor END,數(shù)據(jù)庫(kù)原理與設(shè)計(jì),統(tǒng)計(jì)不同分?jǐn)?shù)段的人數(shù)和平均成績(jī),CREATE PROCEDURE p_SatSore cno CHAR(5) -入口參數(shù):班級(jí)編號(hào) clno CHAR (6) -入口參數(shù):課程編號(hào) AS

33、 BEGIN DECLARE socre1 INT -待統(tǒng)計(jì)分?jǐn)?shù)段上限 DECLARE socre2 INT -待統(tǒng)計(jì)分?jǐn)?shù)段下限 DECLARE num INT -待統(tǒng)計(jì)分?jǐn)?shù)段人數(shù) DECLARE CLNAME VARCHAR(30) -班級(jí)名稱 DECLARE CNAME VARCHAR(50) -課程名稱 -查詢課程名稱和班級(jí)名稱 SET CLNAME=(SELECT CLNAME FROM CLASS WHERE CLNO=clno) SET CNAME=(SELECT CNAME FROM COURSE WHERE CNO=cno) PRINT CLNAME+ + 考試成績(jī) 按照分?jǐn)?shù)段統(tǒng)計(jì)情況 -設(shè)置被統(tǒng)計(jì)分?jǐn)?shù)段的初值 SET socre1=100 SET socre2=90 WHILE (socre1=60) BEGIN SET num=(SELECT count(*) FROM SC a, Class b,Student c WHERE b.CLno=c.CLno AND a.SNo=c.SNo AND b.CLno=clno AND a.Cno=cno AND score BETWEEN socre2 AND socre1

溫馨提示

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

評(píng)論

0/150

提交評(píng)論