数据库中的存储过程

时间:2021-11-24 13:57:08

文章的下半部分有一些实例

 一.存储过程的特点和类型

 存储过程可以提高应用程序的设计效率和系统的安全性。存储过程是一个可重用的代码模块,可以高效的地完成指定的操作。

 使用Transact-SQL语言编写存储过程

 使用Transact-SQL语言编写存储过程而不是用存储在客户端的计算机上的Transact-SQL语言有许多优点:

 1.存储过程已经在服务器上注册,这样可以提高执行的效率

 2.存储过程具有安全特性和所有权链接,可以执行所有的权限管理。这样的话,用户只用被赋予对存储过程的执行权限而不用对存储过程中引用的对象的执行权限

 3.存储过程可以强制应用程序的安全性,防止SQL嵌入式攻击

 4.存储过程允许模块化的程序设计,大大提高程序的设计效率

 5.存储过程是一组命令代码,允许延迟绑定。简单的说就是,存储过程中可以引用当前不存在的对象,不过在存储过程运行时,这个对象应该是存在的 存储过程可以大大减少网络通信的流量

二.存储过程类型

用户自定义存储过程是主要的存储过程类型,是封装了可重用代码的模块或例程。用户自定义的存储过程可以接收参数、像、向客户端返回表格或标量结果和消息、调用数据定义语言、数据操纵语言语句,然后返回参数。

 扩展存储过程是指使用某种编程语言创建的外部例程,是在Microsoft SQL Server实例中动态家在和运行的DLL

三. 创建存储过程的规则

在设计和创建存储过程时,应该满足一些约束和规则。只有满足了这些约束和规则,才可以创建有效的存储过程。

虽然说CREATE PROCEDURE语句中可以包含任意数量和类型的Transact-SQL语句,但是某些特殊的语句是不能包含在存储过程的定义中的。不能包含的特殊语句如下:

  CREATE AGGREGATE

  CREATE DEFAULT

  CREATE FUNCTION

  CREATE PROCEDURE

  CREATE RULE

  CREATE SCHEMA

  CREATE TRIGGER

  CREATE VIEW

  CREATE PARSEONLY

  SET SHOWPLAN_TEXT

  SET SHOWPLAN_ALL

  SET SHOWPLAN_XML

  USE database_name

除了上述的create语句以外,其他的数据库对象都可以在储存过程中创建,只要引用时,该对象已经创建就可以。也可以在存储过程中引用临时表。如果存储过程创建本地临时表,那么该临时表只存在与该存储过程内。退出该存储过程之后,相应的临时表也就消失了。如果正在执行的存储过程调用了另一个存储过程,被调用的存储过程可以访问由第一个存储过程创建的所有的对象,包括临时表在内。存储过程可以带有参数,但是参数的最大数量不能超过2100.

四. 使用CREATE PROCEDURE语句创建存储过程

使用create procedure语句创建存储过程,不过呢,需要强调的是,必须具备CREATE PROCEDURE权限才能创建存储过程,存储过程是架构作用域中的对象,只能在本地数据库中创建存储过程。在创建过程中,应该指定所有的输入参数、执行数据库操作的编程语句、返回值调用过程或批处理表明成功或失败的状态值、捕捉和处理潜在的错误的错误处理语句。

CREATE PROCEDURE语句创建存储过程的基本语句形式

 CREATEPROCEDURE  存储过程名称

 @参数参数类型,

 @参数2参数类型

 ………………………………..(当然可以有参数,也可以无参数)

 AS

 SQL编程

 

举个例子来看吧:

现在数据库中定义一个测试表,我的表名:ware

例一:没有参数

数据库中的存储过程

create procedurewareshow

as

select * from ware

go

可以使用EXECUTE语句执行存储过程,EXECUTE语句可以简写为EXEC所以,想要执行上面的存储过程这样写就行啦:

  数据库中的存储过程

     execwareshow

go

例二:有参数,无返回值

   createprocedurewareshow

@wareid int

as

select *

from ware

where wareid=@wareid

执行上述存储过程需要传入参数

(一).直接实例化的实际值

 execwareshow

4(你可以根据自己的存储过程,用合适的参数)

Go

(二).当然这里传的参数也可以是自定义的参数传值

   DEclare@aint

  Set@a=4;

exec wareshow

@a

Go

例三:有返回值的

  这次我定义一个返回两个数值之和的存储过程

数据库中的存储过程

 createprocedureComputePlus

@compute1 DECIMAL(10,2),

@compute2 DECIMAL(10,2),

@compute3 DECIMAL(10,2)OUTPUT--(有返回值的,--必须用OUTPUT注明返回值)

AS

SET @compute3=@compute1+@compute2

go

创建以后就可以执行这个存储过程了,这种有返回值的存储过程执行时与前两种有所不同

执行语句:

数据库中的存储过程

declare @Compute1 int

declare @Compute2 int

declare @Compute3 int

set @Compute1=10;

set @Compute2=20;

EXEC ComputePlus

@Compute1,@Compute2,@Compute3OutPut

print @Compute3--(这里只是在输出返回值)

GO

u 存储过程的修改与删除

存储过程可以根据自己的需求进行修改和删除

修改语句是:以上面第三个有返回值的为例,修改时需要用的是

ALTER PROCEDURE语句

 ALTERprocedure[dbo].[ComputePlus]

@compute1 DECIMAL(10,2),

@compute2 DECIMAL(10,2),

@compute3 DECIMAL(10,2)OUTPUT

AS

set  @compute3=@compute1+@compute2

go

删除语句

DROP PROCEDURE就行啦

 例:DROPPROCEDUREwareshow

go

存储过程的执行过程

存储过程创建之后,在第一次执行时余姚经过语法分析阶段、解析阶段、编译阶段和执行阶段,具体的细节在网上这些都能找到,名词解释。这个就不多说啦