存储过程

    技术2022-05-11  41

    存储过程:

    一、   基本知识       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)