【正文】
dept FROM student$OPEN c3FETCH NEXT FROM c3 into @deptWHILE @@fetch_status=0BEGINPRINT @deptDECLARE c4 CURSOR FOR SELECT sname,dept FROM student$WHERE dept=@deptOPEN c4FETCH NEXT FROM c4 INTO @sname,@deptWHILE @@fetch_status=0BEGINPRINT @sname+@deptFETCH NEXT FROM c4 INTO @sname,@dept ENDCLOSE c4DEALLOCATE c4PRINT39。=====================39。FETCH NEXT FROM c3 INTO @deptENDCLOSE c3DEALLOCATE c3圖1120 游標(biāo)(3)的顯示樣式(4),用游標(biāo)對(duì)Job表數(shù)據(jù)進(jìn)行如下修改:將工作級(jí)別相同的工作只保留工作編號(hào)較小的一項(xiàng)工作,同時(shí),將這些工作的工作描述拼接為一個(gè)工作描述,中間用逗號(hào)分隔。修改后的數(shù)據(jù)示意如表113所示。表113 改造后的Job表數(shù)據(jù)JobidDescLevelJ01軟件開(kāi)發(fā),軟件測(cè)試10J02硬件開(kāi)發(fā),硬件測(cè)試12J04硬件維護(hù)8DECLARE cur_Job CURSOR FOR SELECT * FROM Job。DECLARE @ojdesc VARCHAR(40)DECLARE @jobno CHAR(4),@jdesc VARCHAR(40),@level TINYINTOPEN cur_JobFETCH NEXT FROM cur_Job INTO @jobno,@jdesc,@levelWHILE @@FETCH_STATUS = 0BEGIN SET @ojdesc = @jdesc DECLARE @injobno CHAR(4),@injdesc VARCHAR(40) DECLARE incur_Job CURSOR FOR SELECT jobid,decs FROM Job WHERE lvl=@level and jobid != @jobno OPEN incur_Job FETCH NEXT FROM incur_Job INTO @injobno,@injdesc WHILE @@FETCH_STATUS = 0 BEGIN SET @ojdesc = @ojdesc + 39。,39。 + @injdesc print @ojdesc DELETE FROM Job WHERE Jobid = @injobno FETCH NEXT FROM incur_Job INTO @injobno,@injdesc END PRINT @ojdesc CLOSE incur_Job DEALLOCATE incur_Job UPDATE Job SET decs=@ojdesc WHERE Jobid = @jobno SET @ojdesc = 39。39。 FETCH NEXT FROM cur_Job INTO @jobno,@jdesc,@levelENDCLOSE cur_JobDEALLOCATE cur_Job(5),實(shí)現(xiàn)按日統(tǒng)計(jì)每日的累計(jì)訂單總額,處理后結(jié)果如圖1121所示。圖1121 具有日累計(jì)訂單金額信息的數(shù)據(jù)declare @sum decimal(18,2),@orderamt decimal(18,2),@orderdate date,@orderdate_old datedeclare cur_sum cursor for select orderamt from [order]declare cur_date cursor for select orderdate from [order] open cur_sumopen cur_datefetch next from cur_sum into @orderamtfetch next from cur_date into @orderdateset @sum=0while @@FETCH_STATUS=0begin if (@orderdate!=@orderdate_old) set @sum=0 set @orderdate_old=@orderdate set @sum=@sum+@orderamt update [order] set [runningtotal] =@sum where current of cur_sum fetch next from cur_sum into @orderamt fetch next from cur_date into @orderdateendclose cur_sumclose cur_datedeallocate cur_sumdeallocate cur_dateselect * from [order]。五. 實(shí)驗(yàn)總結(jié)本次試驗(yàn)學(xué)習(xí)了索引,存儲(chǔ)過(guò)程,存儲(chǔ)過(guò)程、觸發(fā)器、用戶(hù)自定義函數(shù)與游標(biāo)。通過(guò)對(duì)索引的學(xué)習(xí),知道了索引的作用是加快數(shù)據(jù)的查詢(xún)效率。因?yàn)榻⑺饕梢愿淖償?shù)據(jù)的搜索結(jié)構(gòu),索引多數(shù)情況下是建立在基本表上的,但可以建立在視圖上,經(jīng)過(guò)與不建立索引對(duì)比,其效率提高不少。其中存儲(chǔ)過(guò)程類(lèi)似于C語(yǔ)言中的函數(shù),把查詢(xún)語(yǔ)句封裝成一個(gè)函數(shù),可以傳如變量,但是注意的是,變量只能存一個(gè)數(shù)值,只能用循環(huán)方法顯示變量,使其顯示一組數(shù)據(jù)。存儲(chǔ)過(guò)程保存在數(shù)據(jù)庫(kù)中,可以隨時(shí)修改,并加密。對(duì)于觸發(fā)器,具有不同觸發(fā)性,要分清時(shí)候用前觸發(fā)還是后觸發(fā),一般與判斷語(yǔ)句結(jié)合,判斷是否回滾。 用戶(hù)自定義函數(shù)有兩種,一個(gè)是標(biāo)量函數(shù),一個(gè)是內(nèi)聯(lián)表值函數(shù),感覺(jué)內(nèi)聯(lián)表值函數(shù)很好用,可以直接打印出多組數(shù)據(jù),相應(yīng)標(biāo)量函數(shù)輸出結(jié)果比較單一。 編寫(xiě)游標(biāo)應(yīng)注意前后游標(biāo)的開(kāi)關(guān),移動(dòng),相對(duì)來(lái)說(shuō)嵌套游標(biāo)復(fù)雜些,應(yīng)找好對(duì)應(yīng)關(guān)系。雖然寫(xiě)報(bào)告過(guò)程中遇到好多問(wèn)題,還好及時(shí)與同學(xué)共同討論并加以解決。