前言:
如今看官们对“存储过程是什么”大约比较关怀,小伙伴们都想要知道一些“存储过程是什么”的相关知识。那么小编同时在网络上汇集了一些关于“存储过程是什么””的相关文章,希望姐妹们能喜欢,大家快快来学习一下吧!摘要:全网【三桥君】
网上资料一大堆,但是基本都是照本宣科。如果有会的人讲解或者会了以后去看,那么能够理解。但是对于初学者来说,很费解,甚至完全没明白什么意思,即使看了之后也实践不了。我们初学时,最主要的是入门!入门!入门!能让我们理解这个知识点和能够操作定义存储过程,才是最重要的,哪怕是定义最基础的题目。针对这个现象,我用自己总结的最简单明了的方式来去解释这个知识点,我不按套路出牌,争取同学们一看就明白了。
一、什么是存储过程
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_no3、验证功能
当我们写好并执行成功这个存储过程语句时,要怎么验证能否符合我们要求呢?
验证语句:
DECLARE @[虚拟列名] [数据类型],@[虚拟列名] [数据类型] EXEC proCourseAvg '[课程名]',@[虚拟列名] OUTPUT,@[虚拟列名] OUTPUTPRINT @[虚拟列名]PRINT @[虚拟列名]
[] 部分都是可以替换的,如果有多个输出,那么对应的DECLARE、EXEC、PRINT后面继续按规律添加即可。
根据本题要求,验证语句为这样:
DECLARE @StuName VARCHAR(20),@AVG INTEXEC proStudentAvg '101',@StuName OUTPUT,@AVG OUTPUTPRINT @StuNamePRINT @AVG
全篇阐述至此,希望能让初学者对存储过程有个初步的了解,并且能够入门实践,做一些基础的存储过程。
本题所举例的题目和答案都有代码,我把它整理好了。如果想跟着本文练习可以先用题目代码试试,如果直接要答案就打开答案的代码。
我把它放到公众号【三桥君】,回复【存储过程】领取。
祝大家学习进步!
标签: #存储过程是什么