龙空技术网

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

三桥君 197

前言:

如今看官们对“存储过程是什么”大约比较关怀,小伙伴们都想要知道一些“存储过程是什么”的相关知识。那么小编同时在网络上汇集了一些关于“存储过程是什么””的相关文章,希望姐妹们能喜欢,大家快快来学习一下吧!

摘要:全网【三桥君】

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

一、什么是存储过程

1、存储过程的概念看这篇:第9章 数据库完整性与安全—2

2、存储过程的在软件中的解释看这篇:sql server 创建存储过程

存储过程在SQL Server软件中可以查看到:

二、如何编写存储过程的代码

我总结的定义存储过程最基础的代码方式,这是存储过程代码的框架。

CREATE PROC [存储表名]@[虚拟列名] [数据类型],@[虚拟列名] [数据类型] OUTPUTAS[T-SQL 语句]

(提示:中括号“[ ]”这个代码位置该填什么内容,具体内容括号里说明了。)

我把这框架分为3部分,只要填满了3部分,就能实现存储过程的功能!

已实现存储过程代码样式:

--定义存储过程proCourseAvgCREATE PROC proCourseAvg@CouName VARCHAR(20),@CouNum INT OUTPUT,@AVG INT OUTPUTAS	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 proCourseAvgAS

(3)根据题目要求可知:

输入:课程名称;

输出:选课人数和平均分;

一个输入,两个输出。

所以,@3个虚拟列名,分别对应课程名称,选课人数和平均分,后面的数据类型也要对应一致。如果是输出的,需要加上OUTPUT,如果是输入就不用。还有@后面的虚拟列名可以自己随便写,方便记就好了。

CREATE PROC proCourseAvg@CouName VARCHAR(20),@CouNum INT OUTPUT,@AVG INT OUTPUTAS

(4)接下来就是写带有功能的查询语句了。

题目要求是:根据输入的课程名称,统计该课程的选课人数和平均分,并返回统计结果。

这题目单独拿出来就相当于之前学的SQL语句查询那章节的内容了。

我们这里先直接当作SQL语句查询来写。

SELECT COUNT(course_no)AS选课人数,AVG(score_score)AS 平均分FROM xsgl_course,xsgl_scoreWHERE 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)完整的存储过程

--定义存储过程proCourseAvgCREATE PROC proCourseAvg@CouName VARCHAR(20),@CouNum INT OUTPUT,@AVG INT OUTPUTAS	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,@[虚拟列名] OUTPUTPRINT @[虚拟列名]PRINT @[虚拟列名]

[] 部分都是可以替换的,如果有多个输出,那么对应的DECLARE、EXEC、PRINT后面继续按规律添加即可。

根据本题要求,验证语句为这样:

DECLARE @StuName VARCHAR(20),@AVG INTEXEC proStudentAvg '101',@StuName OUTPUT,@AVG OUTPUTPRINT @StuNamePRINT @AVG

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

本题所举例的题目和答案都有代码,我把它整理好了。如果想跟着本文练习可以先用题目代码试试,如果直接要答案就打开答案的代码。

我把它放到公众号【三桥君】,回复【存储过程】领取。

祝大家学习进步!

标签: #存储过程是什么