SQL研习录(33)——存储过程详解


版权声明

  • 本文原创作者:清风不渡
  • 博客地址:https://blog.csdn.net/WXKKang

一、储存过程

1、基本知识

  (1)什么是存储过程?
  存储过程就相当于Java中的函数,把一堆代码封装起来实现模块化调用,它由存储过程名及存储过程参数组成,可以有返回结果,并且我们前面学习的IF…ELSE、WHILE和INSERT、SELECT等都可以在存储过程里使用
  (2)存储过程的优点
  执行速度更快——存储过程只在创造时进行编译,以后每次执行存储过程都不需要再重新编译,而一般的SQL语句没执行一次就编译一次,所以使用存储过程可提高数据库的执行速度
  允许模块化设计程序——就像Java中方法的复用一样
  提高系统安全性——参数化的存储过程可以防止SQL注入式攻击
  减少网络流量——存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量
  (3)存储过程的缺点
  如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户数量的增多,所有的压力都会由服务器来承担,而用户需求的增加会导致数据结构的变化,接着就是系统相关的问题了,最后如果用户想维护该系统就会很难很难,而且代价相当大

2、系统存储过程与自定义存储过程

(1)系统存储过程

  一般情况下以sp或xp开头的为系统存储过程,
  以SQL Server数据库为例,列出它的一些系统存储过程如下:

-- 列出当前实例上所有的数据库的基本信息
sp_databases;
-- 报告有关指定数据库或所有数据库的信息
sp_helpdb [ [ @dbname= ] 'name' ] 
-- 更改数据库的名称
sp_renamedb [ @dbname = ] 'old_name' , [ @newname = ] 'new_name'
-- 返回当前环境下可查询的对象的列表(当前数据库下所有的表)
sp_tables
-- 返回某个表列的信息
sp_columns [ @table_name = ] object [ , [ @table_owner = ] owner ] [ , [ @table_qualifier = ] qualifier ] [ , [ @column_name = ] column ] [ , [ @ODBCVer = ] ODBCVer ] 
-- 查看某个表的所有信息
sp_help [ [ @objname = ] 'name' ] 
-- 查看某个表的约束
sp_helpconstraint [ @objname = ] 'table' [ , [ @nomsg = ] 'no_message' ]
-- 查看某个表的索引
sp_helpindex [ @objname = ] 'table'
-- 列出当前环境中所有的存储过程
sp_stored_procedures
-- 添加或修改登录账户的密码
sp_password [ [ @old = ] 'old_password' , ] { [ @new =] 'new_password' } [ , [ @loginame = ] 'login' ]  
-- 显示默认值、未加密的存储过程、用户定义的存储过程、触发器或视图的实际文本
sp_helptext [ @objname = ] 'name' [ , [ @columnname = ] computed_column_name ] 
(2)创建自定义存储过程

  如果我们需要创建一个自定义的存储过程,则需要使用CREATE PROCEDURE 语句,接着之后需要补充存储过程的代码,如果存储过程需要接受参数,它们需要被包括在名称之后,基本语法如下:

CREATE PROCEDURE myStoredProcedure AS
...

OR

CREATE PROCEDURE myStoredProcedure @{Parameter Name} {data type} AS
...

  注: 参数是可选的,分为输入参数和输出参数(output),并且参数允许有默认值

(3)调用存储过程

  对于系统存储过程,我们可以直接使用名称调用或在前面加上EXEC来调用,如下:

存储过程名 [参数]
or
EXEC 存储过程名 [参数]

  而对于自定义的存储过程则需使用EXEC来调用,如下:

EXEC 存储过程名 [参数]
(4)带有输出参数的存储过程

  当在储存过程中需要返回多个值的时候,就可以使用输出参数来返回这些值,调用带有输出参数的存储过程的时候,需要定义变量,将变量传递给输出参数,在存储过程中使用输出参数其实就是传递进来的变量
  具体的解释请看下面的示例,这样更便于理解一些

3、示例

  示例一:简单的存储过程
  下面我们来创建一个简单的存储过程用来打印信息,代码如下:

CREATE PROCEDURE user_sp_PrintMessage 
	@message varchar(50)
AS
BEGIN
	PRINT '传入的信息为:'+ @message
END

  调用这个存储过程

扫描二维码关注公众号,回复: 8708375 查看本文章
exec user_sp_PrintMessage '清风不渡'

  执行结果如下:
在这里插入图片描述
  示例二:设置存储过程参数的默认值
  我们对上面创建的存储过程做以修改,为变量@message设置一个默认值,注意:修改时关键字为ALTER,代码如下:

ALTER PROCEDURE user_sp_PrintMessage 
	@message varchar(50) = '没有传入信息'
AS
BEGIN
	PRINT '传入的信息为:'+ @message
END

  现在来调用这个存储过程,调用的时候不要给它传参:

exec user_sp_PrintMessage 

  执行结果如下:
在这里插入图片描述
  示例三:带输出参数的默认参数
  现在我们来创建一个带参数的存储过程用于计算两个数的和,并将结果返回,代码如下

CREATE PROCEDURE user_sp_ReturnSum
	@number1 int,
	@number2 int,
	@returnsum int output   -- 输出参数
AS
BEGIN
	SET @returnsum= @number1+@number2
END

  现在我们来调用这个存储过程来计算100与200的和,代码如下:

DECLARE @sum int
exec user_sp_ReturnSum @number1=100,@number2=200,@returnsum=@sum output
print @sum

  执行结果如下,我们可以看到100与200这两个数先传入存储过程中计算,计算后的结果赋值给了存储过程中的@returnsum变量后将结果返回,而后我们在存储过程外用一个变量@sum来将其结果接收,最后将计算结果打印如下:
在这里插入图片描述

发布了81 篇原创文章 · 获赞 36 · 访问量 3332

猜你喜欢

转载自blog.csdn.net/WXKKang/article/details/104036928
今日推荐