数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
查看: 2464|回复: 0

[转帖]:《高性能的数据库》 第四讲 编程细节(下部分)2

[复制链接]
发表于 2004-5-7 18:09:30 | 显示全部楼层 |阅读模式
<b>《高性能的数据库》 第四讲 编程细节(下部分)2

</b>
<TABLE cellSpacing=0 cellPadding=0 border=0>

<TR>
<TD width=14><b><IMG src="http://www.beincity.net/stu/cdb/zba/top_l.gif"></b></TD>
<TD background=zba/top_c.gif><b></b></TD>
<TD width=16><b><IMG src="http://www.beincity.net/stu/cdb/zba/top_r.gif"></b></TD></TR>
<TR>
<TD vAlign=top width=14 background=zba/center_l.gif><b></b></TD>
<TD  bgColor=#fffff1>
<FONT size=+0><!-- 固定文字颜色 -->3、函数。

   函数是SQL 2000的新功能。一般的编程语言都有函数,我就不用解释函数是什么东东了。:)
   或许不少朋友会问:我用存储过程不就可以了么,我为什么要使用函数?

   这里特别指出的一点:fn可以嵌套在Select语句中使用,而sp不可以。

   这里不打算大批特批一番游标了,当然,在我的程序里面,基本抛弃了游标(这里特别说明,是“基本”!因为还是有很多地方费用导游表不可的。),转而采用了fn。游标太消耗资源了。受不了……我快要感动得要流泪了…
   
   fn其实要比sp要简单得多。因为它的不确定性,从而也使他受到了不少的限制。
   举个函数的小粒子:

       Create Function fnTest ( @i int )
         Returns bit
       As
       begin
         Declare @b bit
         if (Cast(@i As Float)/2)=(@i/2)
           Set @b= 1
         else
           Set @b= 0

         Return @b  
           
       end

         
              以上代码判断@i是单数还是双数。
                                


      Use the Sample:


          Create Table #TT( fd1 int)
          Declare @i int
          Set @i=0
          While @i&lt;=20
          begin
            Insert Into #tt &#118alues(@i)
            Set @i=@i+1
          end

          Select fd1,
                 '是否双数'=dbo.fnTest(fd1)    --在这里调用了函数,注意哈:函数之前一定要加上他的owner.
          From #tt

          Drop Table #tt



              以上代码虚拟一段数据,然后判断数据表中是单数还是双数。
                                                      
       有了sp的编程基础,写fn也就不是什么很难的事情了。刚才我提到了,fn受到限制颇多,这里稍稍列举:

          chair1. 只能调用确定性函数,不可以调用不确定函数。 比如,不可以调用GetDate(),以及自己定义的不确定性函数。
          chair2. 不可以使用动态SQL 。如:Execute, sp_ExecuteSQL (这是我最痛苦的事情了,痛哭中……)
          chair3. 不可以调用扩展存储过程
          chair4. 不可以调用Update语句对表进行更新
          chair5. 不可以在函数内部创建表(Create TAble ),修改表(Alter TAble)

          等等……头脑发昏中……反正稍微一些不可预测后果,无法返回后果的都不能用。


   5.事务

      什么叫事务? 这些就是数据库特有的术语了。懒虫在这里口头解释:就是把多件事情当做一件事情来处理。也就是大家同在一条船上,要活一起活,要over一起over !

      我为什么要使用事务? 俺这里再举个很俗很俗的例子:

          俺到银行存钱,于是有这么几个步骤:
             1、把钱交给工作人员;2、工作人员填单;3、将单子给我签字;4、工作人员确认并输入电脑。

      要是,要是我把钱交给工作人员之后,进行到3我签字了。那哥们突然心脏病发作,over掉了,那,我的钱还没有输入电脑,但我却交了钱又签字确认了,而并没有其他任何记录。我岂不是要亏死了???我的血汗钱啊!赶紧退给我!!

      于是,在数据库里产生了这么一个术语:事务(Transaction),也就是要么成功,要么失败,并恢复原状。
     
      还是写程序把:

      Create Proc sp我去存款(@M Money , @iOperator Int)
      As
      Begin
        Declare @i int

        Begin Tran                      --激活事务
          Exec @i=sp交钱 @m,@iOperator
          if @i&lt;&gt;0                      --这里一般用系统错误号 @@Error。 我这里为了举例子没有用到。需要根据实际情况。
          begin
            Rollback Tran                                      --回滚事务
            RaisError ('银行的窗口太少了,我懒得排队,不交了!:( ', 16, 1) with Log  --记录日志
            Return -1                                          --返回错误号
          end

          Exec @i=sp填单 @m,@iOperator
          if @i&lt;&gt;0
          begin
            Rollback Tran                                      --回滚事务
            RaisError ('银行的哥们打印机出了点毛病,打印不出单子来,把钱退回来给我吧??', 16, 1) with Log
            Return -2                                          
          end

          Exec @i=sp签字 @m
          if @i&lt;&gt;0
          begin
            Rollback Tran                                      --回滚事务
            RaisError ('我 靠?什么烂银行,换了3支笔都写不出水来!!老子不存了!!不签!', 16, 1) with Log  
            Return -3                                          
          end

          Exec @i=sp输入电脑 @m,@iOperator
          if @i&lt;&gt;0
          begin
            Rollback Tran                                      --回滚事务
            RaisError ('什么意思?磁盘空间已满?好了好了,把钱给我,我到旁边的这家银行!', 16, 1) with Log  
            Return -4                                          
          end
  
        Commit Tran               --提交事务
        Return 0
    End
   

  
              以上是伪代码,模拟我去存款的过程。

            

   事务的几个要点 Begin Tran , @@Error(我这里没有用到,见上面的注释) , Rollback Tran , Commit Tran。
   另:事务可以嵌套使用。这个时候需要命名
</FONT></TD></TR></TABLE>
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2024-11-27 06:17 , Processed in 0.045803 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表