《关于存储过程》由会员分享,可在线阅读,更多相关《关于存储过程(44页珍藏版)》请在金锄头文库上搜索。
1、职业教育高端品牌 第六章 存储过程、触发器和游标 职业教育高端品牌 课程目标 本章目标: 了解存储过程的优点 掌握如何创建存储过程 (参数、返回值 ) 掌握如何调用存储过程 了解为什么需要触发器 理解触发器的工作原理 掌握如何使用 inserted表和 deleted表 掌握如何创建: INSERT触发器 UPDATE触发器 DELETE触发器 游标的基本更新 理解游标的使用步骤 职业教育高端品牌 什么是存储过程 存储过程( procedure):是一组完成特定功能的 SQL语句集,经编译后存储在数据库中。 用来执行管理任务或应用复杂的业务规则 存储过程可以带参数,也可以返回结果 int su
2、m(int a,int b) int s; s =a+b; return s ; 存储过程相当于 C语言中的函数 职业教育高端品牌 存储过程的优点 允许模块化程序设计 执行速度更快 提高系统安全性 减少网络流通量 职业教育高端品牌 存储过程包括什么 存储过程 - - - 单个 SELECT 语句 SELECT 语句块 SELECT语句与逻辑控制语句 可以包含 存储过程可以包含数据操纵语句 、 变量 、 逻辑 控制语句等 职业教育高端品牌 如何创建存储过程 定义存储过程的语法 CREATE PROCEDURE 存储过程名 参数 1 数据类型 = 默认值 OUTPUT, , 参数 n 数据类型 =
3、 默认值 OUTPUT AS SQL语句 GO 参数可选 参数分为输入参数、输出参数 输入参数允许有默认值 职业教育高端品牌 如何调用存储过程 EXECUTE(执行)语句用来调用存储过程 调用的语法 EXEC 过程名 参数 EXEC proc_stu 职业教育高端品牌 创建不带参数的存储过程 问题: 请创建存储过程,查看本次考试平均分以及未通过考试的学员名单 职业教育高端品牌 带输入参数的存储过程 问题: 修改上例:由于每次考试的难易程度不一样 , 每次 笔试和机试的及格线 可能随时变化 ( 不再是 60分 ) , 这导致考试的评判结果也相应变化 。 分析: 在述存储过程添加 2个输入参数:
4、wriPass 笔试及格线 labPass 机试及格线 职业教育高端品牌 带输入参数的存储过程 EXEC proc_stu 60,55 调用带参数的存储过程 假定本次考试机试偏难 , 机试的及格线定为 55分 , 笔试及格线定为60分 -或这样调用: EXEC proc_stu labPass=55,writtenPass=60 机试及格线降分后, 李斯文( 59分)成为“漏网之鱼”了 职业教育高端品牌 带输入参数的存储过程 带参数的存储过程确实比较方便,调用者可根据试卷的难易度,随时修改每次考试的及格线 问题: 如果试卷的难易程度合适,则调用者还是必须 如此调用: EXEC proc_stu
5、 60,60,比较麻烦 这样调用就比较合理: EXEC proc_stu 55 EXEC proc_stu 笔试及格线 55分,机试及格线默认为 60分 笔试和机试及格线都默认为标准的 60分 职业教育高端品牌 输入参数的默认值 EXEC proc_stu -都采用默认值 EXEC proc_stu 64 -机试采用默认值 EXEC proc_stu 60,55 -都不采用默认值 调用带参数默认值的存储过程 -错误的调用方式:希望笔试采用默认值,机试及格线 55分 EXEC proc_stu ,55 -正确的调用方式: EXEC proc_stu labPass=55 职业教育高端品牌 为什么
6、需要触发器 为什么需要触发器 (TRIGGER)呢 ? 典型的应用就是银行的取款机系统 帐户信息表 bank 交易信息表 transInfo 张三取钱 200 问题: 没有 自动修改 张三的余额 最优的解决方案就是采用 触发器: 它是一种特殊的存储过程 也具备事务的功能 它能在多表之间执行特殊的业务规则 张三开户 1000元 ,李四开户 1元 职业教育高端品牌 什么是触发器 -1 张三 李四 王五 赵六 王三 宋二 刘五 插入 删除 触发器触发 赵六退休 赵六 员工表 退休员工表 职业教育高端品牌 什么是触发器 -2 触发器是在对表进行插入 、 更新或删除操作时 自动执行的存储过程 , 不能直
7、接调用 触发器通常用于强制业务规则 , 优越于检查约束 触发器是一种 高级约束 , 可以定义比用 CHECK 约束更为复杂的约束 可执行复杂的 SQL语句 ( if/while/case) 可引用其它表中的列 职业教育高端品牌 什么是触发器 -3 触发器定义在特定的表上 , 与表相关 自动触发执行 不能直接调用 是一个事务 ( 可回滚 ) 职业教育高端品牌 触发器的类型 DELETE 触发器 INSERT 触发器 UPDATE 触发器 职业教育高端品牌 inserted 和 deleted 表 -1 触发器触发时 : 系统自动在内存中创建 deleted表或 inserted表 只读,不允许修
8、改 ; 触发器执行完成后,自动删除 inserted 表 临时保存了插入或更新后的记录行 可以从 inserted表中检查插入的数据是否满足业务需求 如果不满足,则向用户报告错误消息,并回滚插入操作 deleted 表 临时保存了删除或更新前的记录行 可以从 deleted表中检查被删除的数据是否满足业务需求 如果不满足,则向用户报告错误消息,并回滚插入操作 职业教育高端品牌 inserted 和 deleted 表 -2 修改操作 inserted表 deleted表 增加 (INSERT)记录 存放新增的记录 - 删除 (DELETE)记录 - 存放被删除的记录 修改 (UPDATE)记录
9、 存放更新后的记录 存放更新前的记录 inserted表和 deleted表存放的信息 职业教育高端品牌 如何创建触发器 创建触发器的语法: CREATE TRIGGER trigger_name ON table_name WITH ENCRYPTION FOR DELETE, INSERT, UPDATE AS T-SQL语句 GO WITH ENCRYPTION表示加密触发器定义的 SQL文本 DELETE, INSERT, UPDATE指定触发器的类型 职业教育高端品牌 INSERT触发器 transInfo cardID transType transMoney 1001 0002
10、1001 0002 存入 300 存入 500 inserted cardID transType transMoney 1001 0001 支取 200 1001 0002 存入 存入 500 1001 0001 支取 200 插入记录行 触发 insert触发器。向 inserted表中插入新行的副本 触发器检查 inserted表中插入的新行数据,确定是否需要回滚或执行其他操作 INSERT触发器的工作原理: 职业教育高端品牌 INSERT 触发器示例 问题: 解决上述的银行取款问题:当向交易信息表 (transInfo)中插入一条交易信息时,我们应自动更新对应帐户的余额 。 分析: 在
11、交易信息表上创建 INSERT触发器 从 inserted临时表中获取插入的数据行 根据交易类型 (transType)字段的值是存入 /支取, 增加 /减少对应帐户的余额。 职业教育高端品牌 DELETE触发器 transInfo cardID transType transMoney 1001 0002 1001 0002 存入 300 存入 500 1001 0001 支取 200 transInfo 1001 0002 存入 存入 500 deleted cardID transType transMoney 1001 0001 支取 200 删除记录行 触发 delete触发器向 d
12、eleted表中插入被删除的副本 触发器检查 deleted表中被删除的数据,决定是否需要回滚或执行其他操作 DELETE触发器的工作原理: 职业教育高端品牌 DELETE触发器示例 -1 问题: 当删除交易信息表时,要求自动备份被删除的数据到表backupTable中 。 分析: 在交易信息表上创建 DELETE触发器 被删除的数据可以从 deleted表中获取 职业教育高端品牌 DELETE触发器示例 -2 -关键代码 - CREATE TRIGGER trig_delete_transInfo ON transInfo FOR DELETE AS print 开始备份数据,请稍后 . I
13、F NOT EXISTS(SELECT * FROM sysobjects WHERE name=backupTable) SELECT * INTO backupTable FROM deleted ELSE INSERT INTO backupTable SELECT * FROM deleted print 备份数据成功,备份表中的数据为 : SELECT * FROM backupTable GO 从 deleted表中获取被删除的交易记录 职业教育高端品牌 UPDATE触发器 Deleted(更新前的数据) customerName cardID currentMoney 李四 1000 0002 1 bank customerName cardID currentMoney 张三 10010001 1000 李四 10000002 1 删除记录行 向 deleted表中插入被删除的副本 检查 deleted和 inserted表中的数据,确定是否需要回滚或执行其他操作 UPDATE触发器的工作原理: 李四 10000002 20001 向 inserted表中插入被添加的副本 Inserted(更新后的数据) customerNam