一文搞定實現存儲過程的解法(入門)

摘要:全網【三橋君
網上資料一大堆,但是基本都是照本宣科。如果有會的人講解或者會了以後去看,那麼能夠理解。但是對於初學者來說,很費解,甚至完全沒明白什麼意思,即使看了之後也實踐不了。我們初學時,最主要的是入門!入門!入門!能讓我們理解這個知識點和能夠操作定義存儲過程,纔是最重要的,哪怕是定義最基礎的題目。針對這個現象,我用自己總結的最簡單明瞭的方式來去解釋這個知識點,我不按套路出牌,爭取同學們一看就明白了。

一、什麼是存儲過程

1、存儲過程的概念看這篇:第9章 數據庫完整性與安全—2
2、存儲過程的在軟件中的解釋看這篇:sql server 創建存儲過程
存儲過程在SQL Server軟件中可以查看到:
在這裏插入圖片描述

二、如何編寫存儲過程的代碼

我總結的定義存儲過程最基礎的代碼方式,這是存儲過程代碼的框架

CREATE PROC [存儲表名]
@[虛擬列名] [數據類型],
@[虛擬列名] [數據類型] OUTPUT
AS
[T-SQL 語句]

(提示:中括號“[ ]”這個代碼位置該填什麼內容,具體內容括號裏說明了。)

我把這框架分爲3部分,只要填滿了3部分,就能實現存儲過程的功能!
在這裏插入圖片描述
已實現存儲過程代碼樣式:

--定義存儲過程proCourseAvg
CREATE PROC proCourseAvg

@CouName VARCHAR(20),
@CouNum INT OUTPUT,
@AVG INT OUTPUT

AS

	SELECT @CouNum=COUNT(xsgl_course.course_no),@AVG=AVG(score_score)
	FROM xsgl_course,xsgl_score
	WHERE xsgl_course.course_no=xsgl_score.course_no
		AND xsgl_course.course_name=@CouName
	GROUP BY xsgl_course.course_no

這樣的存儲過程代碼框架,你看明白了嗎?


那麼,關於這存儲過程的代碼的編寫,有幾個地方還是要強調下。

1、定義存儲過程時,先把CREATE PROC [存儲表名] ...AS這個框架寫好。

2、虛擬表名題目沒要求的話可以自己定義,不影響的。

3、數據類型跟創建基本表一樣,用VARCHAR、INT等。

4、爲什麼有的數據類型後面有OUTPUT,有的沒有?
有OUTPUT,意思是題目要求需要輸出什麼數據,然後我們先定義一個虛擬列名來當作它,到時要用它來輸出,所以要OUTPUT。
沒有OUTPUT,意思是題目要求需要輸入什麼數據,然後我們先定義一個虛擬列名來當作它,到時要用它來輸入,但是不需要輸出,所以不用OUTPUT。
通常來說,一個輸入,多個輸出。

5、第二部分的逗號需要注意下,當有兩行時,第一行後面加逗號即可,以此類推。

6、第三部分的SQL語句查詢怎麼寫?
之前SQL語句查詢規則怎麼寫,這裏就怎麼寫,邏輯規則一樣的。區別就是,要跟第二部分的虛擬列名相結合。


經過這裏,相信大家對數據庫的存儲過程是什麼鬼東西能夠有了簡單的理解。那麼,該如何實現存儲過程呢?

三、如何實現存儲過程

(這裏我用一個完整的例題來分析。)

1、題目

(這裏介紹下題目和表的數據)
已知學生管理系統數據庫xsgl,有5個數據表xsgl_user,xsgl_major,xsgl_student,xsgl_course和xsgl_score,分別存儲用戶、專業、學生、課程和成績數據,如下圖所示。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
用SQL語言實現以下:
定義存儲過程proCourseAvg,該存儲過程的功能是根據輸入的課程名稱,統計該課程的選課人數和平均分,並返回統計結果。

2、實現過程

(1)我們先把存儲過程框架寫出來

CREATE PROC 

AS

(2)題目是定義存儲過程proCourseAvg,所以

CREATE PROC proCourseAvg

AS

(3)根據題目要求可知:
輸入:課程名稱;
輸出:選課人數和平均分;
一個輸入,兩個輸出。
所以,@3個虛擬列名,分別對應課程名稱,選課人數和平均分,後面的數據類型也要對應一致。如果是輸出的,需要加上OUTPUT,如果是輸入就不用。還有@後面的虛擬列名可以自己隨便寫,方便記就好了。

CREATE PROC proCourseAvg

@CouName VARCHAR(20),
@CouNum INT OUTPUT,
@AVG INT OUTPUT

AS

(4)接下來就是寫帶有功能的查詢語句了。
題目要求是:根據輸入的課程名稱,統計該課程的選課人數和平均分,並返回統計結果。
這題目單獨拿出來就相當於之前學的SQL語句查詢那章節的內容了。
我們這裏先直接當作SQL語句查詢來寫。

SELECT COUNT(course_no)AS選課人數,AVG(score_score)AS 平均分
FROM xsgl_course,xsgl_score
WHERE xsgl_course.course_no=xsgl_score.course_no
	AND xsgl_course.course_name=[課程名稱]
GROUP BY xsgl_course.course_no

(這裏的 [課程名稱] 意思是可以根據題目要求整個替換成課程表裏的實際課程名)

(5)SQL的查詢語句寫好了,但是不能直接放進去前面的存儲過程裏面,還需要修改下才行。
因爲SELECT是後面跟着的是查詢結果的,所以直接把輸出的虛擬列名等號進去,然後把AS什麼選課人數都去掉。

SELECT @CouNum=COUNT(xsgl_course.course_no),@AVG=AVG(score_score)

還有前面說了 [課程名稱] 這裏就直接替換成輸入的虛擬列名。

AND xsgl_course.course_name=@CouName

經過這樣的修改,查詢語句就變成了這樣,前後對比下。

SELECT @CouNum=COUNT(xsgl_course.course_no),@AVG=AVG(score_score)
	FROM xsgl_course,xsgl_score
	WHERE xsgl_course.course_no=xsgl_score.course_no
		AND xsgl_course.course_name=@CouName
	GROUP BY xsgl_course.course_no

(6)完整的存儲過程

--定義存儲過程proCourseAvg
CREATE PROC proCourseAvg

@CouName VARCHAR(20),
@CouNum INT OUTPUT,
@AVG INT OUTPUT

AS

	SELECT @CouNum=COUNT(xsgl_course.course_no),@AVG=AVG(score_score)
	FROM xsgl_course,xsgl_score
	WHERE xsgl_course.course_no=xsgl_score.course_no
		AND xsgl_course.course_name=@CouName
	GROUP BY xsgl_course.course_no

3、驗證功能

當我們寫好並執行成功這個存儲過程語句時,要怎麼驗證能否符合我們要求呢?
驗證語句:

DECLARE @[虛擬列名] [數據類型],@[虛擬列名] [數據類型]	
EXEC proCourseAvg '[課程名]',@[虛擬列名] OUTPUT,@[虛擬列名] OUTPUT
PRINT @[虛擬列名]
PRINT @[虛擬列名]

[] 部分都是可以替換的,如果有多個輸出,那麼對應的DECLARE、EXEC、PRINT後面繼續按規律添加即可。

根據本題要求,驗證語句爲這樣:

DECLARE @StuName VARCHAR(20),@AVG INT
EXEC proStudentAvg '101',@StuName OUTPUT,@AVG OUTPUT
PRINT @StuName
PRINT @AVG

在這裏插入圖片描述
全篇闡述至此,希望能讓初學者對存儲過程有個初步的瞭解,並且能夠入門實踐,做一些基礎的存儲過程。

本題所舉例的題目和答案都有代碼,我把它整理好了。
因爲博客上傳代碼會被自動變成收費的,所以我把它放到公衆號【三橋君】可以免費領取,回覆【存儲過程】。
如果想跟着本文練習可以先用題目代碼試試,如果直接要答案就打開答案的代碼。

祝大家學習進步!


文章整理不易,有幫助請點贊關注支持,謝謝!微信搜索【三橋君 】,回覆【關注】有我準備的一份資源大禮包,後續持續更新~

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