一文搞定实现存储过程的解法(入门)

摘要:全网【三桥君
网上资料一大堆,但是基本都是照本宣科。如果有会的人讲解或者会了以后去看,那么能够理解。但是对于初学者来说,很费解,甚至完全没明白什么意思,即使看了之后也实践不了。我们初学时,最主要的是入门!入门!入门!能让我们理解这个知识点和能够操作定义存储过程,才是最重要的,哪怕是定义最基础的题目。针对这个现象,我用自己总结的最简单明了的方式来去解释这个知识点,我不按套路出牌,争取同学们一看就明白了。

一、什么是存储过程

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

在这里插入图片描述
全篇阐述至此,希望能让初学者对存储过程有个初步的了解,并且能够入门实践,做一些基础的存储过程。

本题所举例的题目和答案都有代码,我把它整理好了。
因为博客上传代码会被自动变成收费的,所以我把它放到公众号【三桥君】可以免费领取,回复【存储过程】。
如果想跟着本文练习可以先用题目代码试试,如果直接要答案就打开答案的代码。

祝大家学习进步!


文章整理不易,有帮助请点赞关注支持,谢谢!微信搜索【三桥君 】,回复【关注】有我准备的一份资源大礼包,后续持续更新~

猜你喜欢

转载自blog.csdn.net/weixin_46218781/article/details/106725759