在学习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 ]
DROP PROCEDURE
语句便可将同组的过程一块儿去除。如:名为orders的应用程序使用的过程能够名为orderproc;1
和 orderproc;2
.使用DROP PROCEDURE orderproc
语句将去除整个组。
对于参数命名的规则:要用@符号做为第一个字符,参数名必须符合标识符的规则。
5.VARYING:指定做为输出参数支持的结果集(由存储过程动态构造,内容能够变化)。仅适用于游标cursor参数
现有一个Student表。
下面是无参存储过程:
选出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的存储过程的功能很弱(跟商业数据库相比);另外也跟互联网行业变化快有必定的关系。
问:存储过程到底有什么用?
答:优势是大数据量的状况下提升计算效率,缺点是存储过程与系统代码分离,有时可能随手一动存储过程,形成与代码的不一致,很差进行版本控制。