SQL存儲過程總結 - sql server 2012數據庫基礎-存儲過程及應用-實驗報告

這是我大三第一學期《數據庫基礎》這門課的實驗報告,總共15個實驗,我挑了幾個比較重要的放在博客上,方便查看和複習,尤其是最近SSM後端開發,希望對大家,以及將來的我有所幫助!

本文是存儲過程,通過書本和網上的參考代碼和講解,大致把存儲過程理解爲一個自定義函數,在多次重複使用某一個功能的時候,可以把這個功能寫成一個自定義函數(存儲過程),這樣使代碼可讀性增加,逼格也更高......


實驗要求

在實驗5數據庫設計的基礎上補充設計存儲過程,並基於實驗5建立的表和實驗6插入的數據完成實驗;

1. 按要求設計完成如下功能的存儲過程;

        ①查詢平均分數在x到y範圍內的學生信息。說明:該存儲過程有兩個參數;要求查詢的學生信息包括學號、姓名、院系名稱和平均分數。

         ②更新操作,以學號、課程編號和考試成績作參數更新指定學生和課程的考試成績,並返回該學生的平均成績。

2. 自行再分別設計一個完成查詢和完成操作功能的存儲過程(在實驗報告中要準確描述功能需求);

3. 在客戶端以存儲過程和輸入SQL語句的方式分別執行相同的查詢或操作,比較使用和不使用存儲過程的區別;


全部總結鏈接

SQL基礎   (數據庫、表、數據的增刪改查、視圖相關,以及所有實驗報告源代碼)

遊標 (類似C++ 的 指針)

存儲過程(類似 C++ 的自定義函數)

觸發器 (類似 自定義的陷阱,或者說是監聽器,滿足某個條件了執行某個方法)

用戶權限及權限管理 (類似Windows的多用戶管理)

併發控制 (瞭解多個用戶同時對數據造成錯誤的情況 和 解決方法)

數據恢復(當數據庫數據丟失,相應的解決方法)


實驗過程

第一大題

1.1查詢平均分數在x到y範圍內的學生信息

令x = 80 , y = 88

代碼:

create procedure aaa         //創建存儲過程 名字爲aaa

@s smallint, @e smallint     //傳入兩個參數@s(最低),@e(最高)

As

    select 學生.學號,學生.姓名,院系.名稱 as 院系名稱,avg(選課.成績) as 平均成績 from 學生,選課,院系

        where 學生.學號 = 選課.學號 and 學生.院系 = 院系.編號   //以上查詢每個學生的學號、姓名、院系名稱、平均成績

        group by 學生.學號,學生.姓名,院系.名稱      //對學號進行分組 

        having avg(選課.成績) between @s and @e;     //篩選平均分條件

        go   //暫停作用


exec aaa 80,88; //執行


drop procedure aaa  // 刪除

注:存儲過程可以理解爲C++中的自定義函數,先定義,然後通過主函數調用

 

圖 1 查詢平均分數在80到88範圍內的學生信息


1.2更新操作,以學號、課程編號和考試成績作參數更新指定學生和課程的考試成績,並返回該學生的平均成績。

代碼:

Create  procedure  new_data    //創建存儲過程 名字爲new_data

@sno char(8), @cno char(8), @grade smallint  //傳入三個參數 學號、課程號、成績

as

    if(@sno is not null and @cno is not null)  //如果學號和課程號不爲空

    begin

        update 選課 set 成績 = @grade   //更新這個學生這門課的成績

        where 選課.學號 = @sno and 選課.課程編號 = @cno;


        select 選課.學號,avg(選課.成績) as 平均成績

        from 選課        //然後在查詢這個學生的平均分

        where 選課.學號 = @sno

        group by 選課.學號;

    end

    go

exec new_data '2000278','1156',99;  //執行

drop procedure new_data  //刪除

 

注:爲了不給後續實驗造成干擾,所以我手動插入了這一個數據

 

圖 2   第1.2題更新前 成績爲80分

然後執行代碼,因爲這個學生只有這一門課,所以平均分就是99分

 

圖 3  更新成績 輸出平均分

 

圖 4  第1.2題更新後  成績爲99分


第二大題

自行再分別設計一個完成查詢和完成操作功能的存儲過程

2.1完成查詢功能

功能:輸入一個學生的學號,輸出其學號、姓名、性別、生源、院系名稱和狀態

代碼:

create  procedure  new_find //創建存儲過程 名字爲new_find

@sno char(8)    //參數

as

    if(@sno is not null)    //如果主鍵不爲空

    begin

        select 學生.學號,學生.姓名,學生.性別,學生.生源,院系.名稱,學生.狀態

        from 學生,院系

        where 學生.院系 = 院系.編號 and 學生.學號 = @sno

    end

go

exec new_find '2000012'    //執行

drop procedure new_find    //刪除

 

圖 5  查詢學號爲2000012的學生信息


2.2完成操作功能

功能:新增一門課程,插入到課程表

代碼:

create  procedure  new_class   //創建名爲new_class的存儲過程

@cno char(8), @cname char(20), @ctea char(8), @time smallint, @xz char(10)  //參數

as

    if(@cno is not null)   //如果主鍵不爲空

    begin

        insert 課程 values('1000','不知名的高級課程','100001',2,'專業基礎');  //插入

    end

go

exec new_class '1000','不知名的高級課程','100001',2,'專業基礎'   //執行

drop procedure new_class   //刪除

 

圖 6 更新前的課程

 

圖 7 運行截圖

 

圖 8 更新後 多了一門插入的課


第三大題

注:把2.2題的代碼拿來用,發現存儲過程的代碼就像是C++中的自定義函數,可以接受若干個參數,來實現需要的功能。那種多次執行某一個功能的時候,收益最大。

 

圖 9 存儲過程 代碼

 

圖 10  普通查詢代碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章