【java学习】数据库的存储过程总结

在学习JDBC的时候,CallableStatement对象出现了一个数据库存储过程,对这一律念不是很了解。因此就查阅相关资料,总结一下html

什么是存储过程?

根据百度百科的解释,存储过程是Store Procedure,是在大型数据库系统中,一组为了完成特定功能的SQL语句集,它存储在数据库中,通过一次编译后再次调用就不须要编译了。sql

笔者认为能够把它认为是一个语言的方法,它也有存储过程名、存储过程参数、返回值。数据库

咱们经过指定存储过程的名字并给出参数(若是带的话)来执行它。缓存

存储过程的设计规则

首先,咱们已经知道了,存储过程是一系列sql语句的集合。咱们能够经过存储过程来建立其余数据库对象。同时也能够在存储过程当中建立本地临时表,或者引用本地临时表。若是在存储过程内来建立本地临时表的话,临时表仅为存储过程而存在,退出该存储过程后,临时表将消失。服务器

存储过程还能够调用另外一个存储过程,被调用的存储过程能够访问访问性能

存储过程当中的参数的最大数目为 2100。学习

存储过程当中的局部变量的最大数目仅受可用内存的限制。大数据

根据可用内存的不一样,存储过程最大可达 128 MB加密

实现存储过程

CREATE PROCEDURE Procedure_Name  

    --Procedure_Name为存储过程名(不能以阿拉伯数字开头),在一个数据库中触发器名是惟一的。名字的长度不能超过个字。PROCEDURE能够简写为PROC。
     
    @Param1 Datatype,@Param2 Datatype 
    
    --@Param1和@Param2为存储过程的参数,Datatype为参数类型,多个参数用逗号隔开,最多容许个参数。
    
AS --存储过程要执行的操做 

BEGIN
    
    --BEGIN跟END组成一个代码块,能够写也能够不写,若是存储过程当中执行的SQL语句比较复杂,用BEGIN和END会让代码更加整齐,更容易理解。

    
    
END
GO --GO就表明结操做完毕  



exec Procedure_Name [参数名] --调用存储过程Procedure_Name。

drop procedure Procedure_Name --删除存储过程Procedure_Name,不能在一个存储过程当中删除另外一个存储过程,只能调用另外一个存储过程

show procedure status --显示数据库中全部存储的存储过程基本信息,包括所属数据库,存储过程名称,建立时间等

show create procedure Procedure_Name --显示存储过程Procedure_Name的详细信息

exec sp_helptext Procedure_Name --显示你这个Procedure_Name这个对象建立文本

更加详细的内容咱们看下面:spa

CREATE PROC [ EDURE ] procedure_name [ ; number ]
    [ { @parameter data_type }
        [ VARYING ] [ = default ] [ OUTPUT ]
    ] [ ,...n ]

[ WITH
    { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]

[ FOR REPLICATION ]

AS sql_statement [ ...n ]

详细说明参数

  1. procedure_name:存储过程的名称,前面加#为局部存储过程,加##全局存储过程。
  2. number:可选的参数,用来对同名的过程分组,以便用一条DROP PROCEDURE语句便可将同组的过程一块儿去除。

如:名为orders的应用程序使用的过程能够名为orderproc;1orderproc;2.使用DROP PROCEDURE orderproc语句将去除整个组。

  1. @parameter:存储过程的参数。能够有一个或者多个。用户必须在执行过程当中提供每一个所声明参数的值(除非定义了该参数的默认值)。存储过程最多有2100个参数。

对于参数命名的规则:要用@符号做为第一个字符,参数名必须符合标识符的规则。

  1. data_type:参数的数据类型。全部数据类型(包括text、ntext、image)都可以用做存储过程的参数。不过cursor数据类型只能用于OUTPU参数。若是指定数据类型为cursor,同事也必须指定VARYING和OUTPUT关键字。

5.VARYING:指定做为输出参数支持的结果集(由存储过程动态构造,内容能够变化)。仅适用于游标cursor参数

  1. default:参数的默认值。若是定义了默认值,没必要指定该参数的值就能够执行过程。默认值必须为常量或者是NULL。若是过程将该参数使用LIKE关键字,那么默认值中能够包含通配符(%、_ 、[]和[^])。
  2. OUTPUT:代表参数是返回参数。该选项的值能够返回给EXEC[UTE]。使用OUTPUT参数能够将信息返回给调用过程。Text、ntext和image参数能够用做OUTPUT参数。
  3. RECOMPILE:代表SQL Server不会缓存该过程的计划,该过程将在运行时从新编译,在使用非典型值或者临时值而不但愿缓存在内存中执行计划时,请使用RECOMPILE 选项
  4. ENCRYPTION:表示SQL Server 加密syscomments表中包含CREATE PROCEDURE语句文本的条目。使用ENCRYPTION能够防止将过程做为SQL Server赋值的一部分发布。说明在升级过程当中,Sql Server利用存储在syscomments中的加密注释来从新建立加密过程。
  5. FOR REPLICATION:指定不能在订阅服务器上执行为复制建立的存储过程。使用FOR REPLICATION选项建立的存储过程可用做存储过程筛选。
  6. AS:指定过程要执行的操做
  7. sql_statement:过程当中要包含的任意数目和类型的Transact-SQL语句。但有一些限制。

实例操做

现有一个Student表。
clipboard.png

下面是无参存储过程:
选出Student表中全部的信息:

create proc StuProc
as //此处as可省略不写
begin//begin和end是一对,不能够只写一个
select S#,Sname,Sage,Ssex from student
end
go

有参数的存储过程:

create proc StuProc
@sname varchar(100)
as
begin
select S#,Sname,Sage,Ssex from student where sname = @sname
end
go

exec StuProc '赵雷' //执行语句

上面是在外部给变量赋值,也能够直接在内部设置默认值

create proc StuProc
@sname varchar(100) = '赵雷'
as
begin
select S#,Sname,Ssex from student where sname = @sname
end
go

exec StuProc

也能够把变量的内容输出,使用output

create proc StuProc
@sname varchar(100),
@IsRight int output//传出参数
as
if exists(select s#,Sname,Sage,Ssex from student wheere sname = @sname)
set @IsRight = 1
else
set @IsRight = 0
go

declare @IsRight int
exec StuProc '赵雷',@IsRight output
select @IsRight

几个问题

问:存储过程在实际项目中用的多吗?
答:凡事都有利有弊,存储过程也是同样。在商业数据库应用中,例如金融、企业、政府等等,存储过程的使用很是普遍,有多方面的缘由,例如:存储过程一旦调试完成经过后就能稳定运行,这与各个业务在一段时间内是相对稳定和肯定是匹配的;存储过程大大地减小了业务系统与数据库的交互,必定程度下降了业务系统与数据库的耦合,例如即便业务系统与应用系统不在同一城市,对性能的影响也可控(100条SQL语句交互一次,即便延时由同城1ms增长到异地50ms,也只是增长49ms,若是交互100次,则增长4900ms)。在互联网行业,存储过程不多使用,一个重要的缘由是MySQL的普遍使用,而MySQL的存储过程的功能很弱(跟商业数据库相比);另外也跟互联网行业变化快有必定的关系。
问:存储过程到底有什么用?
答:优势是大数据量的状况下提升计算效率,缺点是存储过程与系统代码分离,有时可能随手一动存储过程,形成与代码的不一致,很差进行版本控制。

参考资料

何时用存储过程---存储过程的好处
详细全面解析sql存储过程

相关文章
相关标签/搜索