存储过程

存储过程(stored procedure)是SQL语句或流程控制语句的集合。
    存储过程在第一次执行时被编译,并被保存到数据库中。下次执行将会更加高效,因为它是预编译的。
这与普通的SQL和批处理不同。可以将常用的功能,写成存储过程,以提高执行效率。
adaptive server提供很多系统存储过程,它们主要在sybsystemprocs和master数据库中,并以sp_开头,可以用来
插入、更新、删除和查看系统表。
1、创建存储过程
     create procedure proc_name
     as
     sql statement    

2、执行存储过程
   只执行存储过程或存储过程是批处理的第一条语句时,直接输入过程名    
  
proc_name    

   存储过程不是批处理的第一条语句时,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中授予系统存储过程的执行权限,就可以在全部数据库中执行系统存储过程(有点危险),
即使是数据库所有者,也不能从内部直接控制存储过程的权限。 
 
 

你可能感兴趣的:(存储过程,职场,休闲)