存储过程

存储过程:

一、   基本知识  
    1 存储过程格式  
  CREATE   PROC存储过程名  
      [   参数1数据类型[=默认值],   参数2数据类型[=默认值],   …   参数n数据类型[=默认值]   ]  
  AS  
      [   DECLARE变量1数据类型,   DECLARE变量2数据类型,   …   DECLARE变量n数据类型   ]   
  BEGIN   
  T-SQL语句   
  END  
  GO  
  注:  
    〈1〉方括号内语句根据需要可以有,也可没有。  
    〈2〉T-SQL中自定义之全局变量,前缀为@@,具体有那些全局变量可参阅有关书藉,存储过程自定义之局部变量,前缀为@
    〈3〉基本数据类型种类:  
    numeric(m,n)   浮点数据类型,m:总位数,n:小数位数  
    int     整数数据类型  
    char(m)     字符串数据类型,当m为一时,表示单个字符  
    〈4〉默认值:当调用此存储过程时如未向此参数传递值,则此参数取此默认值,如果默认值为null时,可返回定制的消息  
    2 基本语法、命令  
    IF…ELSE        条件执行语句  
    WHILE            循环执行语句  
    GOTO标号        跳转语句  
    RETURN[返回数]     退出命令  
    PRINT[参数]         输出命令  
    BREAK            退出循环  
    CONTINUE        跳至下一循环  
    RAISERROR          显示自定义错误信息  
    WAITFOR           等待某一事件发生后执行  
    BEGIN…END       将一组SQL语句作为一个语句块  
    GO           发送批命令,必须输在行首  
    欲知详情,请参阅有关书藉。  
    3 游标  
    为处理大量数据,常需使用游标,使用方法如下:  
    〈1〉定义  
    declare   游标名 cursor   for  
       t-sql语句  
    〈2〉打开  
       open 游标名  
    〈3〉使用:    
    fetch 游标名 [into变量1 变量n]  
    〈4〉关闭:  
    close 游标名  
    deallocate   cursor 游标名  

二、   实例

    if   object_id('Change_node') is   not   NULL   /*检查此存储过程是否存在*/  
   drop   proc   Change_node     /*删除此存储过程*/  
   go

 

    create   proc   Change_node  
   as  
   begin  

    //局部变量

    declare   @m_rowid   numeric(10,2), @m_terminal   char(3),  @m_node_no_char(4)  
   declare   another   cursor   for  
       select   rowid,terminal  
      from授权流水表  
      where   node_no=‘行号’  /*此处为各行全国联行行号的后四位* /

         open   another  
       while@@sqlstatus!=2   
       begin  
          fetch   another   into   @m_rowid,@m_terminal  
          select@m_node_no=convert(char(1),0)+@m_terminal    
            print“终端号:%1!节点号:%2!”@m_terminal,@m_node_no  
            update   授权流水表  
         set   node_no=@m_node_no  
         where   rowid=@m_rowid  
        end

    end   
    close   another  
   deallocate   cursor   another  
   end  
   go


2 常用全局变量

   @@CONNECTIONS    
  返回自上次启动以来连接或试图连接的次数。    
   
  @@CURSOR_ROWS    
  返回连接上最后打开的游标中当前存在的合格行的数量。    
   
  @@DATEFIRST    
  返回每周第一天的数字     
   
  @@ERROR    
  返回最后执行的SQL   语句的错误代码。     
   
  @@FETCH_STATUS    
  返回被   FETCH   语句执行的最后游标的状态,而不是任何当前被连接打开的游标的状态。    
   
  @@IDENTITY    
  返回最后插入的标识值    
   
  @@LANGID    
  返回当前所使用语言的本地语言标识符(ID)。    
   
  @@LANGUAGE    
  返回当前使用的语言名。    
   
  @@LOCK_TIMEOUT    
  返回当前会话的当前锁超时设置,单位为毫秒。    
   
  @@PROCID    
  返回当前过程的存储过程标识符   (ID)   。    
   
  @@ROWCOUNT    
  返回受上一语句影响的行数。    
   
  @@SERVERNAME    
  返回运行   的本地服务器名称。    
   
  @@SPID    
  返回当前用户进程的服务器进程标识符   (ID)。    
   
  @@TRANCOUNT    
  返回当前连接的活动事务数。    
   
  @@VERSION    
  返回当前安装的日期、版本和处理器类型

 

3 存储过程好处

    1.存储过程可以使得程序执行效率更高、安全性更好,因为过程建立之后 已经编译并且储存到数据库,直接写sql就需要先分析再执行因此过程效率更高,直接写sql语句会带来安全性问题,如:sql注入 
    2.建立过程不会很耗系统资源,因为过程只是在调用才执行。 

 

    1、预编译,存储过程预先编译好放在数据库内,减少编译语句所花的时间。
    2、缓存,编译好的存储过程会进入缓存,所以对于经常执行的存储过程,除了第一次执行外,其他次执行的速度会有明显提高。
    3、减少网络传输,特别对于处理一些数据的存储过程,不必像直接用sql语句实现那样多次传送数据到客户端。
   4、更好的利用服务器内存,特别对于处理中间数据量不大的情况,存储过程中可以利用存放在内存的表变量。

 

  4 java调用存储过程

     CallableStatement proc = null;
     Connection conn = null;
     try {
       conn = DBUtil.getConn();
       proc = conn.prepareCall("{ ? = call cwnew_pack.addCwform(?) }");
       proc.registerOutParameter(1, Types.CHAR);
       proc.setString(2, 参数);

       proc.execute();
       String str = proc.getString(1);
       return str;

     }

     finally{

       try {
          proc.close();
         }
     }

 

触发器:

  触发器是一种特殊类型的存储过程,触发器可以查询其它表,而且可以包含复杂的 SQL 语句。它们主要用于强制复杂的业务规则或要求

  优点如下:

        触发器是自动的:它们在对表的数据作了任何修改之后立即被激活。 
        触发器可以通过数据库中的相关表进行层叠更改
        触发器可以强制限制,这些限制比用 CHECK 约束所定义的更复杂

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值