`
bestxiaok
  • 浏览: 453917 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

触发器和游标的一个小例子

阅读更多

1、触发器。

     定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。
     常见的触发器有三种:分别应用于Insert , Update , Delete 事件。(SQL Server 2000定义了新的触发器,这里不提)

     我为什么要使用触发器?比如,这么两个表:

     Create Table Student(             --学生表
       StudentID int primary key,      --学号
       ....
      )

     Create Table BorrowRecord(              --学生借书记录表
       BorrowRecord  int identity(1,1),      --流水号  
       StudentID     int ,                   --学号
       BorrowDate    datetime,               --借出时间
       ReturnDAte    Datetime,               --归还时间
       ...
     )

    用到的功能有:
       1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号);
       2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。
    等等。

    这时候可以用到触发器。对于1,创建一个Update触发器:

    Create Trigger truStudent
      On Student
      for Update
    As
      if Update(StudentID)
      begin

        Update BorrowRecord 
          Set br.StudentID=i.StudentID
          From BorrowRecord br , Deleted  d ,Inserted i 
          Where br.StudentID=d.StudentID

      end       
                
    理解触发器里面的两个临时的表:Deleted , Inserted 。注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。
    一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧的记录到Deleted表,然后删除Student记录并写入新纪录。

 

 

 对于2,创建一个Delete触发器
    Create trigger trdStudent
      On Student
      for Delete

As
      Delete BorrowRecord 
        From BorrowRecord br , Delted d
        Where br.StudentID=d.StudentID

    从这两个例子我们可以看到了触发器的关键:A.2个临时的表;B.触发机制。
    这里我们只讲解最简单的触发器。复杂的容后说明。
    事实上,我不鼓励使用触发器。触发器的初始设计思想,已经被“级联”所替代。


  2.游标
   
    在SQL 2000之前,游标可谓是SQL Server心中的痛: 老牛般的速度(CPU),河马般的胃口(内存)。可你却不能不用他。
    什么叫游标呢?说白了就是像高级语言一样,是存放数据集,并逐条访问的一种机制。
在SQL Server 并没有很好的数据逐条访问机制,如果有,那就是游标。

    还是举例子:

    对于表

     Create Table BorrowRecord(              --学生借书记录表
       BorrowRecord  int identity(1,1),      --流水号  
       StudentID     int ,                   --学号
       StudentFeeID  int ,                   --费用结算号   (外键)
       BorrowDate    datetime,               --借出时间
       ReturnDAte    Datetime,               --归还时间
       Fee           Money                   --借书费用 
       ...
     )

     Create Table StudentFee(                --学生费用结算表
       StudentFeeID  int  primarykey ,       --费用结算号   (主键)
       StudentID int ,                       --学号
       BorrowBookAllFee           Money,     --所有借书总费用   
       ...
     )

     两者关系为多对一的关系,关联字段为StudentFeeID

     由于某种原因StudentFee表的数据遭到了破坏,我想StudentFee循环一遍将“所有借书总费用”重算 。

    -----------------------------------------------------------------------
    -------------------------------------------------------
    --Name:一部分代码
    --func:更新学生借书总费用
    --Use :
    --User:
    --Author:  懒虫 # SapphireStudio (www.chair3.com)
    --Date  :  2003-4-16
    --Memo  :  临时写写的,给大家作个Sample。没有调试阿。
    -------------------------------------------------------

     --声明一个游标
     Declare curStudentFee Cursor
       for 
       Select StudentFeeID From StudentFee      

     --声明两个费用变量
     Declare @mBorrowBookAllFee Money  --总费用
     Declare @iStudentFeeID     Int    --借书结算号

     --初始化  
     Set @mBorrowBookAllFee=0
     Set @iStudentFeeID=0

     --打开游标
     Open curStudentFee  

     --循环并提取记录
     Fetch Next From curStudentFee Into @iStudentFeeID     
     While ( @@Fetch_Status=0 )    
     begin

       --从借书记录中计算某一学生的借书总记录的总费用
       Select @mBorrowBookAllFee=Sum(BorrowBookAllFee)
         From BorrowRecord 
         Where StudentFeeID=@iStudentFeeID     

       --更新到汇总表。
       Update StudentFee Set BorrowBookAllFee=@mBorrowBookAllFee
         Where StudentFeeID=@iStudnetFeeID           

       Fetch Next From curStudentFee Into @mFee
     end

     --关闭游标    
     Close curStudentFee

     --释放游标
     Deallocate curStudentFee 

   -----------------------------------------------------------------------
    关注游标的要点:1、声明、打开、关闭、释放 ; 2、@@Fetch_Status 游标提取状态标志,0表示正确

    这里,我也要提到,我不鼓励使用游标。更多的情况下,在SQL 2000 里面 ,函数已经能够实现绝大部分游标的功能

分享到:
评论

相关推荐

    oracle函数触发器游标等几个小例子

    通过学习这些例子,你将能够更好地理解和应用Oracle中的函数、游标和触发器。实践是掌握这些概念的关键,所以尝试运行这些脚本,观察它们如何影响数据库,并根据需要调整它们以满足自己的需求。在学习过程中,你可能...

    触发器,游标实例

    在上述例子中,定义了一个名为`cur_age`的游标,用于从`t_borrowRecord`表中选取特定学生的所有借书日期(borrowDate)。通过游标,我们可以获取每一条记录并根据需要进行操作,比如更新归还日期(returnDAte)。 ...

    游标与触发器

    个人对游标与触发器的了解做的一个简易课件,希望对大家有所帮助

    触发器的入门例子加注释

    本示例展示了一个名为`tri_addfriends`的触发器,该触发器在`jiveUser`表上被触发,并且仅在进行插入操作时生效。下面是触发器的具体实现细节: #### 三、触发器定义 ```sql CREATE TRIGGER tri_addfriends ON ...

    实验六 游标、存储过程与触发器

    第一个例子是遍历SC表,找出所有及格的选课信息,通过声明变量并定义游标,然后打开、获取数据,使用while循环判断状态,如果成绩大于等于60则输出信息。第二个例子则是展示如何通过游标获取SPJ表中的偶数行,这里...

    navicat中创建存储过程、触发器和使用游标的简单实例(图文)

    这只是一个基础示例,实际存储过程可以包含更复杂的逻辑和条件判断。 2. **触发器**: 触发器是一种数据库对象,它在特定的数据库操作(如INSERT、UPDATE、DELETE)发生时自动执行。在Navicat中,可以通过设计表的...

    PLSQL笔记-从hello word到触发器,包,游标高级应用

    以下是如何使用游标的一个例子: ```sql DECLARE cursor_example CURSOR FOR SELECT id, name, salary FROM employees WHERE department_id = 100; emp_record employee_management.employee_rec; BEGIN OPEN ...

    SQL编程中的游标的使用方法

    接着,定义了一个名为`bCursor`的游标,该游标执行的SQL语句为从表`test1`中选择`a`和`b`两列的值。通过`OPEN`语句打开游标后,使用`FETCH NEXT`从游标中获取下一行数据,并将这些数据存储到`@a`和`@b`变量中。 接...

    PLSQL操作存储过程、函数、游标、触发器、定时任务等实例SQL脚本.zip

    3. **游标**:游标是数据库中的一个重要概念,它允许我们在结果集上进行迭代,一次处理一行数据。在PL/SQL中,游标用于动态地处理查询结果。游标可以用于循环遍历查询结果,执行基于每行数据的操作。实例脚本可能...

    解析数据库中游标的使用方法

    查询语句,一次只能从数据库中提取一行数据,对于这种形式的查询和触发器操作,系统都会使用一个隐式游标。但是如果要提取多行数据,就要由程序员定义一个显式游标,并通过与游标有关的语句进行处理。显式游标对应...

    ORACLE中触发器和存储过程介绍相关代码

    在这个例子中,当尝试在`my_table`上插入新记录且`column_value`为NULL时,触发器会抛出一个自定义错误,阻止插入操作。 接下来,我们讨论存储过程。存储过程是一组SQL和PL/SQL语句的集合,预先编译并存储在数据库...

    存储过程、触发器的例子.doc

    虽然例子中没有提及触发器,但在实际应用中,例如,我们可能会创建一个触发器,在学生分数更新时自动更新其平均分,或者在插入新记录时检查输入的有效性。 总结起来,存储过程和触发器是数据库系统中强大的工具,...

    oracle创建触发器实例

    在这个实例中,我们看到的是一个防止非本地机器执行DDL(Data Definition Language)操作的触发器,比如`TRUNCATE`、`ALTER`或`DROP`等。这个触发器主要目的是为了系统安全和审计目的。 首先,为了创建这个触发器,...

    oracle中plsql的一些小例子,初学者可以看看

    这个文件夹里包含了一些本人收集的plsql里的小例子,比如for循环,IF判断等流程控制,程序包,触发器,游标,数组,异常处理,过程与函数。当你忘记它们的格式时可以翻出来看一看,例子简单易读,很适合初学者。

    sql中的触发器和分页显示

    根据提供的代码示例,我们可以看到一个具体的触发器实现。 #### 代码解析 在给出的代码中,定义了一个名为`TRIG_teacher`的触发器,该触发器在`T_Teacher`表上执行。此触发器响应三种类型的事件:插入(`INSERT`)、...

    oracle存储过程游标

    该触发器定义了在`s_c`表上进行删除操作前的逻辑,即当有记录被删除时,将该记录插入到另一个表`s_c1`中。 #### 四、视图的创建与维护 视图是基于表或其他视图的一种虚拟表,它可以简化数据查询、保护敏感数据等。...

    数据库游标的使用.pdf

    1. **声明游标**:首先需要声明一个游标,指定其名称和关联的SELECT语句。例如: ```sql declare curStudent cursor scroll for select Sno, Sname, Ssex from Student ``` 在这个例子中,`curStudent`是游标名...

    Oracle-PL/SQL教程

    详细讲解了PLSQL的基本语法,以及储存过程、函数、触发器、游标和包。文档中还包括例子和练习。

    Oracle存储过程和触发器实例

    在这里,我们创建了一个名为 `TestPackage` 的包,包含一个游标类型 `mycursor` 和一个返回游标的 `GetRecords` 过程。 ```sql create or replace package TestPackage is type mycursor is ref cursor; ...

Global site tag (gtag.js) - Google Analytics