数模论坛

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

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

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

</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><!-- 固定文字颜色 -->《高性能的数据库》 第四讲 编程细节(下部分)

第四讲 编程细节(下部分)

  1、触发器
  2、游标
  3、函数
  4、存储过程
  5、事务



    上次得到不少朋友的捧场,信心大增了:),决定趁着五一期间把它写完,反正外面非典厉害,也不好出去玩。这里讲到3、4、5了。

    这里决定把4与3调换一下,先讲解4(存储过程,以下用sp来简称;函数,以下用fn来简称)

4、存储过程。

   存储过程是数据库编程里面最重要的表现方式了。

   呵呵,这里我要提到上次说道的:我拒绝使用触发器。这里我要开始猛批一顿触发器了。

   在SQL 2000里,说实话,我实在找不出触发器可以存在的理由。回忆一下:触发器是一种特殊的存储过程。它在一定的事件(Insert,Update,Delete 等)里自动执行。我建议使用sp和级联来代替触发器。

   在SQL 7 里面,触发器通常用于更新、或删除相关表的数据,以维护数据的完整。SQL 7里面,没有级联删除和级联修改的功能。 只能建立起关系。既然SQL 2000里面提供了级联,那么触发器就没有很好的存在理由。更多的情况下是作为一个向下兼容的技术而存在。

   当然,也有人喜欢把触发器作为处理数据逻辑,甚至是业务逻辑的自动存储过程。 这种方法并不足取。这里列举以下使用触发器的一些坏处:

  a、“地下”运行 。
      触发器没有很好的调试、管理环境。调试一段触发器,要比调试一段sp更耗费时间与精力。

  b、类似于goto语句。(过分自由的另外一个说法是:无政府主义!)
     一个表,可以写入多个触发器,包括同样for Update的10个触发器!同样for Delete的10个触发器。也就是说,你每次要对这个表进行写操作的时候,你要一个一个检查你的触发器,看看他们是做什么的,有没有冲突。
     或许,你会很牛B的对我说:我不会做那么傻B的事情,我记得住我做了些什么!3个月以后呢?10个月以后呢?你还会对我说你记得住么?
  c、嵌套触发器、递归触发器
     你敢说你这么多的触发器中不会存在Table1更新了Table2表,从而触发Table2表更新TAble3,TAble3的触发器再次触发Table1更新Table2…… ??
     或许还会发生这种情况:你的程序更新了Table1.Fd1,触发器立马更新Table1.fd1,再次触发事件,触发器再次更新Table1.fd1……

     当然,SQL Server可以设置和避免应用程序进入死循环,可是,得到的结果,或许就不是你想要的。
  
  ……   
   我想不出触发器更多的坏处了,因为我早就抛弃了它。算了,不批它了,酸是各人爱好把!我建议使用完全存储过程来实现数据逻辑和事务逻辑!

   先讲讲sp的编写格式(我个人的编程习惯)。良好的习惯有助于日后的维护。


    Create Proc spBuyBook(                     --@@存储过程头,包括名字、参数、说明文档
      @iBookID int,      --书的ID              --@@参数
      @iOperatorID int   --操作员ID
    )
    -----------    @@说明文档
    --Name  :  spBuyBook                                       @@名字      
    --func  :  购买一本书的业务逻辑                            @@存储过程的功能                     
    --Return:  0,正确;-1,没找到该书;-2,更新Book表出错;-3.....  @@返回值解释
    --Use   :  spDoSomething,spDoSomething2....                @@引用了那些外部程序,比如sp,fn,vw等
    --User  :  懒虫                                            @@该存储过程的使用者
    --Author:  懒虫 # SapphireStudio (www.chair3.com)          @@作者
    --Date  :  2003-5-4                                        @@最后更新日期
    --Memo  :  临时写写的,给大家作个Sample。没有调试阿。      @@备注
    -----------
    As                                                       --@@程序开始
    begin
      
      Begin Tran                                             --@@激活事务
        Exec spDoSomething                                   --@@调用其他sp
        if @@Error&lt;&gt;0                                        --@@判断是否错误
        begin
          Rollback Tran                                      --@@回滚事务
          RaisError ('SQL SERVER,spBuyBook: 调用spDoSomeThing发生错误。', 16, 1) with Log  --@@记录日志
          Return -1                                          --@@返回错误号
        end  
     
      .... --更多其他代码

      Commit Tran                                            --@@提交事务
    end
               
    妈 的我怎么这么背啊我??什么时候不死机,偏偏在这时!!丢了不少……:(:(
    下面默哀3分钟……

     1……
     2……
     3……
   
    好了,继续!回忆刚才写的内容ing ……

    AA、存储过程的几个要素: a. 参数  b.变量 c.语句 d.返回值 e.管理存储过程
    BB、更高级的编程要素:   a.系统存储过程  b.系统表  c.异常处理 d.临时表 e.动态SQL f.扩展存储过程 g.DBCC命令

    AA.a 参数:  知识要点包括:输入参数,输出参数,参数默认值

      Sample:

        Create Proc spTest(
          @i int =0 ,       --输入参数
          @o int output     --输出参数
        )
        As
          Set @o=@i*2       --对输出参数付值
         
      Use the Sample:

        Declare @o int
        Exec spTest 33,@o output
        Select @o                    --此时@o应该等于33*2=66。

      ----
      以上代码没有测试,顺手写写的。希望不会出错:)  
                                                   

                 
      -----                                             
   AA.b 变量:AA.a中已经有声明变量的例子了,就是Declare @o int
   AA.c 语句:在Sql Server 中,如果仅仅使用标准SQL语句将是不可想象的,通常认为,标准的SQL 语句就那么几条,如:      
               Select, Update, Delete
              因此,我们需要引入更多更强大的功能,那就是T-SQL语句:
   
              赋值语句:Set           
              循环语句:While  
              分支语句:if , Case ( Case语句不能单独使用,与一般高级语言的不同)
              
              一起举个例子吧:
              Sample :
              
              Declare @i int
              Set @i=0

              While @i&lt;100
              begin

                if @i&lt;=20
                begin

                  Select Case Cast(@i As Float)/2 When (@i/2) then Cast(@i As varchar(3)) + '是双数'
                                                  else             Cast(@i As varchar(3)) + '是单数'

                         end

                end

                Set @i=@i+1
              end  
           

              以上代码判断20之内的单数与双数。
     
   AA.d 返回值
        Sample:

          Create Proc spTest2
          As
            Return 22

        Use the Sample
          Declare @i int
          Exec @i=spTest2
          Select @i  

   AA.e 管理存储过程: 创建,修改,删除。
        分别为:
        Create Proc ...  ,  Alter Proc ...  , Drop Proc ...


  BB、更高级的编程要素:   a.系统存储过程  b.系统表  c.异常处理 d.临时表 e.动态SQL f.扩展存储过程 g.DBCC命令

      哈哈,以下课程收费!!(玩笑,实际上打算放到后面去讲了。)

</FONT></TD></TR></TABLE>
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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