存储过程(stored procedure)是SQL语句或流程控制语句的集合。
存储过程在第一次执行时被编译,并被保存到数据库中。下次执行将会更加高效,因为它是预编译的。
这与普通的SQL和批处理不同。可以将常用的功能,写成存储过程,以提高执行效率。
adaptive server提供很多系统存储过程,它们主要在sybsystemprocs和master数据库中,并以sp_开头,可以用来
插入、更新、删除和查看系统表。
1、创建存储过程
create procedure proc_name
as
sql statement
2、执行存储过程
只执行存储过程或存储过程是批处理的第一条语句时,直接输入过程名
存储过程不是批处理的第一条语句时,exec 或 execute 后接过程名
exec proc_name / execute proc_name
3、查看存储过程定义
第一次执行过程(编译后),过程名存储在sysobjects表中(存储过程是数据库对象),过程定义存在syscomments中。
可以使用sp_helptext proce_name 查看过程定义,也使用此方法查看DEFAULT、RULE的定义
4、重编译存储过程
在数据库发生变时,可重新编译存储过程,以保证其性能。方法为
sp_recompile member // 在下次执行时重编译member表的存程过程和触发器
5、参数化存储过程
可以在定义存储过程时定义参数,并在执行过程时,通过提供参数值,给予一定的灵活性。
create procedure test_procedure
@fname varchar(15), // 声明参数 @arg_name arg_type
@lname varchar(15)
as
select * from user
where fname = @fname and lname = @lname
exec test_procedure mo,shijin // 以这种方式提供参数时,参数的顺序要与定义参数时一致
exec test_procedure @lname = shijin,@fname = mo //以此方式提供参数时,参数顺序没有要求
提供的参数值,如果有标点符号或空白字符,则需要用引号(双引号或单引号)将参数值括起来.
缺省参数值:没有指定参数值时,程序会使用缺省参数值,调用存储过程
定义缺省参数值:@default_arg_value = 'default values' //即在定义参数时,给其赋值
6、存储过程组
可以将同一应用程序中经常使用的过程,组成一个程序组。
如a;1,a;2等程序,组成了程序组a。程序组使用同一个过程名加分号再加子程序的序号。
不能单独删除一个子程序组,要整个删除程序组。
由配置参数'allow procedure grouping'控制是否可使用程序组,默认值为1,即可以使用程序组。
7、延时执行存储程序
begin
waitfor delay '0:10' --延时10分钟才执行下面语句
exec proc_name
end
8、存储过程的返回状态
过程执行完之后,会返回一个状态值,报告是否执行成功。
status_value = 0 表示执行成功
status_value = -1到-99表示执行失败
这些都是系统定义的返回值,可以在这些值之外,自定义返回状态值。
用局部变量捕获返回状态值
declare @status int
exec @status = sp_help
select @status
如果执行时有多个错误,则返回绝对值最大的返回状态值。如出现-1,-4错误,则只返回-4状态值
自定义返回状态值
create procedure test_return
@input int
as
if @input = 1
return 1
else
return 2
9、检查当前用户是否属于某角色
select proc_role(role_name) 如果当前用户属于role_name,则返回1
select proc_role( 'sa_role')
可从sysusers查询到可用的角色名,sysusers存储用户名、组、角色信息
10、使用存储过程返回参数
当create procedure 和 execute语句都包含output选项的参数时,过程将值返回给调用者。
create procedure test_return_arg
@input1 varchar(10),
@input2 varchar(10),
@result varchar(20) output //定义参数,并加output参数,表明为返回参数
as
select @result = @input1 + ' ' +@input2
declare @result varchar(20)
exec test_return_arg 'this is', 'a test',@result output
执行时,先定义返回值变量,在exec中返回参数写在最后,并加上output选项
不管返回参数的值是否改变,返回参数的值还是输出。
output选项可写成out
11、存储过程的重命名
sp_rename obj_name,new_name //重命名用户定义的对象或类型
sp_rename test_return_arg,return_arg
sp_renamedb old_name,new_name //重命名数据库
sp_renamedb 需将'single user'设为true,再从master数据库中执行sp_renamedb
renamedb, rename 与 sp_helpdb ,sp_help 有着类似的层级关系。
12、删除存储过程
drop procedure proc1,proc2 //可删除多个存储过程
13、系统存储过程
多数情况下,系统表只通过系统存储过程进行更新。通过修改配置变量并执行reconfigurewithoverride命令,
管理员可以直接修改系统表。
实验:将配置选项'allow updates to system tables'设为1,即可更新系统表。
试过update用户数据库的sysusers表的Name字段,成功。sp_configure可列出所有配置选项
可在任何数据库中运行存储过程。
如果在sybsystemprocs外,使用的存储过程引用系统表,会映射到当前数据库的系统表。
14、系统存诸过程的权限
因为系统存储过程是存储在sybsystemprocs数据库中,(master也有以sp_开头的系统过程)所以其权限的管理也要在此数据库操作。
是否可以推广到存储过程在哪个数据库,其权限的管理就在哪个数据库做呢?(我想是的)
一旦在sybsystemprocs中授予系统存储过程的执行权限,就可以在全部数据库中执行系统存储过程(有点危险),
即使是数据库所有者,也不能从内部直接控制存储过程的权限。