數據庫可編程性示例

一、定義變量、順序、選擇、循環結構的應用

在查詢分析器中可以編寫代碼實現求1-100數中所有奇數之和,代碼如下:

declare @i int
declare @num int
 
set @num = 0
set @i = 1
 
while(@i<=100)
begin
       if(@i%2=0)
       begin
              set@i = @i + 1
              continue
       end
       set @num =@num + @i
       set @i =@i + 1
end
 
print @num

根據上述題目,同學們試圖在查詢分析器中編程序求出所有的水仙花數(所謂水仙花數是一個三位數,其個位、十位、百位數字的三次方之和如果等於該數,則該數爲水仙花數,例如153=13+53+33

二、觸發器的構建及使用

在使用觸發器之前,我們先建立一個關於學生基本信息及成績的數據庫,其邏輯結構如下所示:

 

問題說明:在插入一個學生的某一門課程的成績後、當刪除一個學生的成績信息後、在修改一個學生的某門課的成績後,都要在在班級表中更新該班級的總成績,這就需要在“學生選課表中建立“insert”、“delete”以及“update”觸發器,其代碼如下所示:

//delete型觸發器
CREATE TRIGGER [TRI_delete_sc] ON[dbo].[SC]
FOR Delete
AS
 
declare @sno varchar(8)
declare @CLANO varchar(8)
declare @grade dec(5,1)
 
select @sno = sno,@grade = grade fromdeleted
select @clano = clano from stu_info wheresno = @sno
update class set sumgrade = sumgrade -@grade where clano = @clano
//insert型觸發器
CREATE TRIGGER [TRI_insert_sc] ON[dbo].[SC]
FOR INSERT
AS
 
declare @sno varchar(8)
declare @CLANO varchar(8)
declare @grade dec(5,1)
 
select @sno = sno,@grade = grade frominserted
select @clano = clano from stu_info wheresno = @sno
update class set sumgrade = sumgrade +@grade where clano = @clano
//update型觸發器
CREATE TRIGGER [TRI_update_sc] ON[dbo].[SC]
FOR update
AS
 
declare @sno varchar(8)
declare @CLANO varchar(8)
declare @grade_ins dec(5,1)
declare @grade_del dec(5,1)
 
select @sno = sno,@grade_del = grade fromdeleted
select @grade_ins = grade from inserted
select @clano = clano from stu_info wheresno = @sno
set @grade_ins = @grade_ins - @grade_del
update class set sumgrade = sumgrade +@grade_ins where clano = @clano

根據以上代碼,請同學們自行編寫stu_info表的三種觸發器,實現class表中snum(學生人數)的自動更新。

三、存儲過程的構建及使用

存儲過程類似於函數,其作用爲實現一定的功能。例如,構建一個求兩個時間的時間差的存儲過程,代碼如下:

CREATE PROCEDURE CRT_DATE_DIFF @bgn_dt datetime,@end_dt datetime
--該存儲過程擁有兩個參數,即所謂的開始時間和結束時間
AS
 
select datediff(minute,@bgn_dt,@end_dt)
GO

在新建查詢中對存儲過程的調用採用如下方法:

execute 或exec

代碼如下:

declare @bgn_dt datetime
declare @end_dt datetime
 
set @bgn_dt = getdate()
set @end_dt = '2008-4-2 21:12:35.235'
 
exec CRT_DATE_DIFF @bgn_dt,@end_dt

顯示結果如下:

206

 

再例如,建立一個存儲過程,掃描學生選課表中某同學的成績,如果該學生的成績小於60分,則把該同學的成績加10分。所建立的存儲過程如下:

CREATE PROCEDURE Pro_update_grade  @sno varchar(8)
AS
 
declare @grade dec(5,1)
declare @cno varchar(5)
 
declare cur_grade cursor for
      selectgrade,cno from sc where sno = @sno
open cur_grade
fetch cur_grade into @grade,@cno
while @@fetch_status = 0
begin
      if @grade< 60
      begin
             updateSC set grade  = @grade + 10 where sno =@sno and cno = @cno
             fetchcur_grade into @grade,@cno
      end
end
close cur_grade
deallocate cur_grade
GO

在新建查詢中執行該存儲過程代碼如下:

exec Pro_update_grade '20002'

基於以上代碼,請同學們在學生選課表中尋找性別爲“女”的同學並把該同學的成績加10分。

注意:在本指導中的存儲過程其實用一條sql語句即可實現其功能,但爲了讓大家熟悉存儲過程以及遊標的使用方法,希望在實現上述功能時採用存儲過程和遊標的方法實現。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章