1.概述
一般的SQL语句需要先编译后执行,而存储过程是一组为了完成特定功能的SQL语句,编译好了过后存放在数据库中,用户可以通过给定所需要的参数去调用它。
2.优点
(1).增强SQL语言的功能和灵活性:存储过程可以用控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
(2).组件式编程:存储过程被创建后,可以在程序中被多次调用。而且可以随时对存储过程进行修改,对应用程序源代码毫无影响。
(3).较快的执行速度:存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。
(4).减少网络流量:在调用存储过程时,网络中传送的只是该调用语句,从而大大减少网络流量并降低了网络负载。
(5).作为一种安全机制来充分利用:通过对执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。
3.创建方法(SQL Server)
CREATE PROC [ EDURE ] procedure_name [ ; number ]
[ { @parameter data_type }
[ VARYING ] [ = default ] [ OUTPUT ]
] [ ,...n ]
[ WITH
{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
[ FOR REPLICATION ]
AS
[ begin ]
T-SQL 语句
[ end ]
create procedure p1
as
begin
select * from student #sql
end
go
execute p1
create procedure p40
@sno char(8) ,
@out char(8) output
as
begin
set @out=@sno
select * from student where SNO=@sno
return 20
end
go
declare @a char(8)
declare @b char(8)
execute @a=p40 '20000013',@b output
select @a,@b
4.Java调用
jdbc 的CallableStatement类调用存储过程
CallableStatement proc = conn.prepareCall("{ call procedureName(?,?) }");#构造
proc.setString(int parameterIndex,String x)#设置参数 注意参数类型对应。第一个参数为存储过程参数下标或者参数名字,第二个参数为存储过程参数的值
proc.execute();#执行存储过程 返回true 成功
proc.executeQuery()#执行存储过程并返回结果集
proc.getString(int parameterIndex or String parameterName);#拿到存储过程执行后的返回值参数为返回值下标或者返回值的名字。
proc.registerOutParameter(parameterIndex, sqlType);#拿到存储过程执行后的返回参数。第一个参数可以是存储过程返回参数的下标或者名字,第二个参数可以是sql类型或者Types.type
5.总结
(1)可以把存储过程看成一个编译好了的函数,这个函数也有参数,也有返回值。比函数多的就是有结果集、返回参数。
(2)定义一个同类型的参数并用存储过程的调用赋值可以拿到返回值。
declare @a [type]
execute @a=procedure [arg]
(3)定义一个参数,并作为参数传入存储过程的调用可以得到返回参数
declare @b [type]
execute p40 [arg...],@b output