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  普通查詢代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM