博客
关于我
2021-4-19课程——第5章例题【续】触发器+存储过程和函数
阅读量:114 次
发布时间:2019-02-26

本文共 3156 字,大约阅读时间需要 10 分钟。

今日课堂总结:触发器、存储过程与函数

一、触发器

触发器是用户定义在关系表上的由事件驱动的特殊过程。它能够在特定操作发生时自动执行预定义的规则,具备强大的数据控制能力。

1. 定义触发器

触发器又被称为事件-条件-动作规则。当特定事件(如INSERT、UPDATE、DELETE等)发生时,触发器会检查条件,如果条件成立则执行相应的动作。动作通常是一段SQL存储过程。

触发器的基本格式如下:

CREATE TRIGGER [触发器名] { BEFORE | AFTER } [触发事件] ON [表名] REFERENCING NEW | OLD ROW AS [变量] FOR EACH {ROW | STATEMENT} [WHEN [触发条件] ] [触发动作体]

触发事件

触发事件可以是INSERT、DELETE或UPDATE,也可以是这些事件的组合。例如,可以指定触发列(如UPDATE OF列名),以明确触发动作的具体列。

AFTER/BEFORE是触发的时机

  • AFTER:在触发事件操作执行之后激活触发器。
  • BEFORE:在触发事件操作执行之前激活触发器。

触发器类型

  • 行级触发器(FOR EACH ROW):触发动作针对每一行。
  • 语句级触发器(FOR EACH STATEMENT):触发动作仅针对整个语句。

示例:在SC表上创建一个AFTER UPDATE触发器,用于记录成绩修改前的旧值和新值。具体实现如下:

create table SC_U (    Sno char(9),  -- 学号    Cno char(4),  -- 班号    Oldgrade smallint,  -- 修改前的成绩    Newgrade smallint  -- 修改后的成绩);create trigger SC_Tafter update of Grade on SCreferencing oldrow as OldTuple, newrow as NewTuplefor each rowwhen (NewTuple.Grade >= 1.1 * OldTuple.Grade)insert into SC_U (Sno, Cno, Oldgrade, Newgrade)values (OldTuple.Sno, OldTuple.Cno, OldTuple.Grade, NewTuple.Grade);

2. 激活触发器

触发器的执行是由数据库服务器自动完成的,不需要手动激活。执行顺序通常为:

  • 执行BEFORE触发器。
  • 执行触发事件。
  • 执行AFTER触发器。
  • 3. 删除触发器

    删除触发器的语法如下:

    DROP TRIGGER [触发器名] ON [表名];

    二、存储过程与函数

    存储过程和函数是数据库中可以重复调用、持久性存储模块。两者的主要区别在于:

    • 函数必须声明返回类型。
    • 存储过程可以不返回任何值。

    存储过程

    1. 存储过程的优点

    • 高效性:减少客户机-服务器通信量。
    • 可重用性:可以被多次调用。
    • 规则实施:适合定义复杂业务规则。

    2. 创建存储过程

    语法格式:

    CREATE OR REPLACE PROCEDURE [schema_name].[procedure_name] ([参数])AS[过程化SQL块];

    示例:实现转账功能的存储过程。

    -- 创建账户表drop table if exists Account;create table Account (    accountnum char(3) primary key,    total float);insert into Account values ('101', 50), ('102', 100);-- 创建存储过程create or replace procedure Proc_TRANSFER@inAccount int, @outAccount int, @amount floatasbegin    declare @totalDepositOut float, @totalDepositIn float, @inAccountnum int;        -- 检查转出账户的余额    select @totalDepositOut = total from Account where accountnum = @outAccount;    if (@totalDepositOut is null)    begin        print '转出账户不存在或账户中没有存款';        rollback transaction;        return;    end;        -- 检查账户存款是否足够    if (@totalDepositOut < @amount)    begin        print '账户存款不足';        rollback transaction;        return;    end;        -- 检查转入账户是否存在    select @inAccountnum = accountnum from Account where accountnum = @inAccount;    if (@inAccountnum is null)    begin        print '转入账户不存在';        rollback transaction;        return;    end;        -- 执行转账操作    update Account set total = total - @amount where accountnum = @outAccount;    update Account set total = total + @amount where accountnum = @inAccount;    print '转账完成,请取走银行卡';    commit transaction;end;

    3. 执行存储过程

    使用exec语句调用存储过程。

    -- 示例调用exec Proc_TRANSFER @inAccount = 102, @outAccount = 101, @amount = 50;

    4. 修改存储过程

    修改存储过程的语法:

    ALTER PROCEDURE [schema_name].[procedure_name] [修改内容];

    5. 删除存储过程

    删除存储过程的语法:

    DROP PROCEDURE [schema_name].[procedure_name];

    函数

    1. 函数的定义

    语法格式:

    CREATE OR REPLACE FUNCTION [schema_name].[function_name] ([参数]) RETURNS [返回类型]AS[过程化SQL块];

    2. 调用函数

    使用callselect语句调用函数。

    -- 示例调用call AvgAge('男');

    三、课程感悟

    今天的课程让我对触发器、存储过程和函数有了更深入的理解。这三者在数据库开发中起着重要作用,尤其是在需要复杂业务规则或高效数据处理时,触发器和存储过程能够显著提升开发效率。通过实际案例的学习,我不仅掌握了相关语法,还对如何设计和优化这些组件有了初步的认识。虽然学习过程中遇到了一些困难,但通过查阅资料和参考博客,最终还是顺利完成了练习。这章内容的学习为后续的数据库开发打下了坚实的基础。

    转载地址:http://flyk.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现depth first search深度优先搜索算法(附完整源码)
    查看>>
    Objective-C实现des文件加密算法(附完整源码)
    查看>>
    Objective-C实现Diffie-Hellman算法(附完整源码)
    查看>>
    Objective-C实现Dijkstra最小路径算法(附完整源码)
    查看>>
    Objective-C实现dijkstra迪杰斯特拉算法(附完整源码)
    查看>>
    Objective-C实现Dijkstra迪杰斯特拉算法(附完整源码)
    查看>>
    Objective-C实现dijkstra银行家算法(附完整源码)
    查看>>
    Objective-C实现Dinic算法(附完整源码)
    查看>>
    Objective-C实现disjoint set不相交集算法(附完整源码)
    查看>>
    Objective-C实现DisjointSet并查集的算法(附完整源码)
    查看>>
    Objective-C实现djb2哈希算法(附完整源码)
    查看>>
    Objective-C实现DNF排序算法(附完整源码)
    查看>>
    Objective-C实现doomsday末日算法(附完整源码)
    查看>>
    Objective-C实现double factorial iterative双阶乘迭代算法(附完整源码)
    查看>>
    Objective-C实现double factorial recursive双阶乘递归算法(附完整源码)
    查看>>
    Objective-C实现double hash双哈希算法(附完整源码)
    查看>>
    Objective-C实现double linear search recursion双线性搜索递归算法(附完整源码)
    查看>>
    Objective-C实现double linear search 双线性搜索算法(附完整源码)
    查看>>
    Objective-C实现double sort双重排序算法(附完整源码)
    查看>>
    Objective-C实现DoublyLinkedList双链表的算法(附完整源码)
    查看>>