第7章 存储过程和触发器
MySQL中的触发器和存储过程的区别与用途
MySQL中的触发器和存储过程的区别与用途MySQL是一种常用的关系型数据库管理系统,广泛应用于各种互联网应用中。
在MySQL中,触发器(Trigger)和存储过程(Stored Procedure)是两种常见的编程方式,用于实现数据库操作的自动化和业务逻辑的封装。
本文将探讨MySQL中的触发器和存储过程的区别和用途。
一、触发器触发器是MySQL中一种特殊的数据库对象,它和数据库表关联,并在表中的指定事件发生时自动执行特定的操作。
触发器是基于事件驱动的,它可以在数据插入、更新或删除时触发执行相应的操作。
1. 触发器的创建在MySQL中,创建触发器需要使用CREATE TRIGGER语句,并指定触发时机、触发事件、触发操作和触发操作所执行的SQL语句。
例如,我们可以创建一个在数据插入前触发的触发器如下所示:```CREATE TRIGGER before_insert_triggerBEFORE INSERT ON table_nameFOR EACH ROWBEGIN-- 触发操作所执行的SQL语句...END;```2. 触发器的用途触发器可以用于各种场景,例如数据自动更新、数据约束、数据一致性等。
下面以一个实例来说明触发器的用途。
假设我们有一个订单表和一个库存表,每当有订单数据插入时,我们希望自动更新库存表中对应商品的库存数量。
这时,就可以使用触发器实现该功能。
```CREATE TRIGGER update_inventoryAFTER INSERT ON ordersFOR EACH ROWBEGINUPDATE inventorySET quantity = quantity - NEW.amountWHERE product_id = NEW.product_id;END;```在上述示例中,我们创建了一个名为update_inventory的触发器,它在订单表插入数据后触发,然后执行更新库存表的操作。
存储过程和触发器实验心得
存储过程和触发器实验心得1、PLSQL创建储存过程编译出错不会给出错误提示,导致调用时提示储存过程处于无效状态。
解决方案:使用SQLPLUS,不过SQLPLUS只会提示编译错误,不会提示具体原因,还可以使用Navicat工具,Navicat会给出更加详细的错误原因。
2、创建储存过程时,设置变量参数类型时,指定了字符长度导致创建失败。
解决方案:直接设置变量数据类型,不设置其字符长度。
3、使用TO_DATE(SYSDATE,‘YYYY/MM/DD’)获取当前日期作为借阅日期导致调用借书储存过程失败,提示参数类型错误。
解决方案:因为TO_DATE()函数是将字符类型转换成日期类型,而SYSDATE本来就是日期类型,所以导致调用失败,使用TO_DATE(TO_CHAR(SYSDATE,‘YYYY/MM/DD’),‘YYYY/MM/DD ’)将SYSDATE转换成字符类型再转换成日期类型。
4、使用DBMS_OUTPUT.PUT_LINE()函数输出提示,没有反应。
解决方案:在SQLPLUS中需要先使用SET SERVEROUTPUT ON;打开输出模式才能看见输出,而在PLSQL中输出的内容在另一个Output窗口中,而不是没有反应。
5、创建自动递增借阅流水号的触发器时,使用NEW关键字改变借阅流水号,导致创建触发器失败,解决方案:使用NEW关键字时,需要在前面加一个“:”号,如“:NEW.借阅流水号”。
6、调用修改后的借书储存过程时,发送错误,提示违反唯一约束条件以及COMMIT;不能再触发器中使用。
解决方案:删除在触发器中的COMMIT;,然后删除序列“借阅流水号序列”,重新创建序列“借阅流水号序列”,并且设置初始值为8,因为借阅表中已经有借阅流水号1到7的数据了,然后创建序列时未指定初始值,序列默认从1开始,导致违反唯一约束条件,从而导致调用储存过程失败。
四、实验心得体会通过本次实验,学会了储存过程以及触发器和序列的使用方法,对存储过程有了一个直观的认识,对触发器的工作原理和作用有了更加深刻的认识,使用触发器可以在修改数据前后规范数据,使数据规范化和标准化。
存储过程与触发器
9.1.3
创建、执行、修改、删除简单存储过程
简单存储过程即不带参数的存储过程,下面介绍简单存储过程 的创建及使用。
1. 创建简单存储过程
在SQL Server中通常可以使用两种方法创建存储过程:一 种是使用企业管理器创建存储过程。另一种是使用查询分 析器执行SQL语句创建存储过程。创建存储过程时,需要注 意下列事项:
图9-1 创建存储过程的界面
(2)使用SQL语句创建存储过程。在查询分析器中,用SQL语 句创建存储过程的语法格式如下: CREATE PROC [EDURE] procedure_name [;number] [{@parameter data_type} [VARYING] [=default] [OUTPUT] ][,…n] [WITH {RECOMPLE|ENCRYPTION|RECOMPLE,ENCRYPTION}] [FOR REPLICATION] AS sql_statement [,…n] 其中: ● procedure_name是新建存储过程的名称,其名称必须遵 守标识符命名规则,且对于数据库及其所有者必须唯一。 ● number是可选的整数,用来对同名的过程分组,以便用一 条DROP PROCEDURE语句即可将同组的过程一起删除。例如, 名为order的应用程序使用的过程可以命名为orderproc1、 orderproc2、orderproc3。DROP PROCEDURE orderproc语句 将删除整个组。如果名称中包含定界标识符,则数字不应该包含 在标识符中,只应在存储过程名前后使用适当的定界符。
【例9.3】在查询分析器中执行ST_PRO_BJ。 代码如下: USE student EXECUTE ST_PRO_BJ GO 其执行结果如图9-2所示。
触发器获奖课件
END IF; END trigger_emp;
❖ SQL> UPDATE employees SET salary=1000;
12
7.2.2 语句级触发器
❖ 使用触发器谓词
假如触发器响应多种DML事件,而且需要根据事 件旳不同进行不同旳操作,则能够在触发器体中 使用谓词判断是哪个触发事件触动了触发器。
❖ 【例7-6】创建一种带限制条件旳UPDATE 触发器,修改雇员旳工资时,只输出80号部 门雇员修改前工资旳值与改后旳工资旳值。
❖ 见书94页【例7-6】
22
7.2.3 行级触发器
❖ 【 例 7-7】 创 建 一 种 行 级 触 发 器 , 当 向 departments表中插入数据时,将插入后旳 值 写 入 到 deptlog 日 志 表 中 , 当 删 除 departments数据时,将被删除前旳值写入 到日志表中,当对departments表中某一列 进行更新时,将更新前和更新后旳值写入到 日志表中。
17
7.2.3 行级触发器
❖ 【例7-4】创建一种行级旳DELETE触发器。 CREATE OR REPLACE TRIGGER tg_delete AFTER DELETE ON departments FOR EACH ROW BEGIN DBMS_OUTPUT.PUT_LINE (‘您执行了删除操作…’); END tg_delete;
❖ SQL> INSERT INTO departments VALUES(220,‘edu’,103,2500);
11
7.2.2 语句级触发器
❖ 【例7-2】创建一种 BEFORE型语句级触发器。禁止周六、周 日对employees表进行DML操作,假如在周六、周日对 employees表进行了任何操作,则中断操作,并提醒顾客不允 许在此时间对employees表进行操作。
存储过程和触发器(实验报告)
WITH ENCRYPTION AS
SELECT*
FROM student_info
WHERE性别='男'
EXEC stu_en
DROP PROCEDURE stu_en
4.使用grade表。
(1)创建一个存储过程stu_g_r,当输入一个学生的学号时,通过返回输出参数获取该学生各门课程的平均成绩。
CREATE PROC stu_g_r @stu_no varchar(8)=NULL,
@stu_score real OUTPUT
AS
SELECT@stu_score=AVG(分数)
FROM grade
WHERE (学号=@stu_no)
(2)执行存储过程stu_g_r,输入学号0002。
DECLARE @score real
WHERE (a.姓名=@stu_name)
EXEC stu_g_p ‘刘卫平’
sp_helptext stu_g_p
3.使用student_info表。
(1)创建一个加密的存储过程stu_en,查询所有男学生的信息。
(2)执行存储过程stu_en,查看返回学生的情况。
(3)使用Transact-SQL语句DROP PROCEDURE删除存储过程stu_en。
(3)掌握通过SQL Server管理平台和Transact-SQL语句Alter procedure修改存储过程的方法;
(4)掌握通过SQL Server管理平台和Transact-SQL语句Drop procedure删除存储过程的方法;
(5)掌握通过SQL Server管理平台和Transact-SQL语句Create trigger创建触发器的方法和步骤;
第07章存储过程和触发器
山东工商学院
陈章良
7.1.2 用户存储过程的创建与执行
(2)存储过程的执行 语 法 格 式
[ EXEC [ UTE ] ] { [ @return_status = ] { procedure_name [ ;number ] | @procedure_name_var } [ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] } [ ,...n ] [ WITH RECOMPILE ] }
山东工商学院
陈章良
7.1.4 用户存储过程的删除
语法格式
DROP PROCEDURE { procedure } [ ,...n ]
【例7.10】删除 PXSCJ数据库中的student_info1 存储过程。 USE PXSCJ GO DROP PROCEDURE student_info1
山东工商学院
CREATE PROCEDURE student_info AS SELECT a.xh,xm,kcm,cj,xf FROM XSB a JOIN CJB b ON a.xh=b.xh JOIN KCB t ON b.kch= t.kch GO
山东工商学院
陈章良
7.1.2 用户存储过程的创建与执行
3) 使用带OUTPUT参数的存储过程
山东工商学院
陈章良
7.1.2 用户存储过程的创建与执行
(3)举例 1) 设计简单的存储过程
【例7.1】从XSCJ USE PXSCJ 数据库的三个表中查 /*检查是否已存在同名的存储过程,若有,删除*/ 询,返回学生学号、 IF EXISTS (SELECT name FROM sysobjects WHERE name = 'student_info' AND type='P') 姓名、课程名、成绩、 DROP PROCEDURE student_info 学分。该存储过程不 GO 使用任何参数。 /*创建存储过程*/
实验七 存储过程与触发器
实验七存储过程与触发器实验七存储过程与触发器一、创建一个名为“proc_1”的存储过程,用于查看学生表的所有信息。
然后调用该存储过程。
二、创建一个名为“proc_2”的存储过程,用于向学生表的所有字段添加一条记录,记录内容由调用时决定。
然后调用该存储过程。
三、创建一个名为“proc_3”的存储过程,用于删除学生表中指定学号的记录,具体学号由调用时决定。
然后调用该存储过程。
四、修改存储过程“proc_3”,用于查询不小于指定成绩的学生的基本信息,具体成绩由调用时决定。
五、选做题:创建一个名为“proc_4”的存储过程,用于求一个3位整数的反序数。
例如123的反序数为321。
create proc proc_4 @a int asdeclare @b int,@c int,@t int,@s int beginset @t=@a % 10select @b=@a/10,@b=@b % 10 set @c=@a/100set @s=@t*100+@b*10+@c select @s end goexec proc_4 123六、创建一个名为“trig_1”的触发器,当向学生表添加记录时,该触发器自动显示学生表的所有信息。
七、修改名为“trig_1”触发器,当试图向学生表添加、修改或删除记录时,该触发器自动显示如下信息:“对不起,你无权进行更新操作!”。
八、修改“trig_1”的触发器,当向学生表修改记录时,该触发器自动显示修改前(deleted)和修改后(inserted)的记录。
九、选做题:创建一个名为“trig_4”的触发器,当向成绩表添加记录时,该触发器自动显示与该记录相关的学生的学号、姓名和班级。
(本题要求创建之前先判断该触发器是否存在) if exists(select name from sysobjects where name=' trig_4' and type='TR') drop trigger trig_4 gocreate trigger trig_4 on 成绩表 for insert asselect 学号,姓名,班级from 学生表where 学号 in (select 学号 from inserted) goinsert 成绩表values(“0012”,“02”,80)2、截取图片,填写如下实验过程记录表实验过程记录(注意:标注题号) 1.2.3.4.。
第7章 数据库高级对象的使用
3、视图的优点
1.视点集中 用户只关心它感兴趣的某些特定数据和他们所负责的特定任务。
2.简化操作 视图大大简化了用户对数据的操作。因为在定义视图时,若视图本身就 是一个复杂查询的结果集,这样在每一次执行相同的查询时,不必重新 写这些复杂的查询语句,只要一条简单的查询视图语句即可。可见视图 向用户隐藏了表与表之间的复杂的连接操作。
SCHEMABINDING | VIEW_METADATA }
2、用SQL语句定义视图
【例7-1】已知学生表的数据如图7-1所示。
创建一个视图,视图中只包含信安152班的数据,SQL语 句如下: CREATE VIEW VW_信安152 AS SELECT * FROM 学生 WHERE 班级='信安152' 通过Select语句查询视图中的数据,语句如下: SELECT * FROM VW_信安152
运行程序过程: EXEC prcShopper '000002' /*返回ID号为000002的购物者所购买的 玩具及数量。*/
提示:存储过程可以带多个输入参数,之间用逗号格开。
二、存储过程
RETURN语句从一个存储过程返回值
【例7-8】带输入参数的存储过程,并且报告执行的结果,根据输入的购物者的ID号, 返回购物者的名字、所订购的玩具的名字和订购数量。 CREATE PROCEDURE prcShopper1 @ShopperId CHAR(6) AS BEGIN
JOIN Toys ON OrderDetail.cToyId = Toys.cToyId END
调用该存储过程方法是:
EXEC prcOrders
/*运行(调用)存储过程*/
二、存储过程
触发器与存储过程
触发器与存储过程触发器(Trigger)是数据库中的一种特殊对象,它与一些特定的数据库事件相关联,并且当这个事件发生时,触发器可以在自动执行的过程中被触发。
而存储过程(Stored Procedure)则是一段预先编译好的SQL 语句的集合,它可以被保存在数据库服务器端,通过调用来执行。
触发器和存储过程都是数据库中的重要组件,它们都可以用于实现数据的自动化处理和一些复杂的业务逻辑。
但是它们在功能和使用方法上有一些不同之处。
首先,触发器的触发条件是事先设置好的,当该条件满足时才会被触发执行,而存储过程是主动调用执行的。
触发器通常与数据库中的表相关联,并且在表上的插入、更新或删除等事件发生时触发。
存储过程可以在任何时候被调用执行,无论是否有其他数据库事件发生。
其次,触发器通常用于实现数据的自动化处理,比如在插入新纪录时通过触发器自动计算一些字段的值,或者在删除记录时触发器做一些相关操作。
而存储过程则更倾向于实现业务逻辑的封装和复用,比如在一个库存管理系统中,可以使用存储过程来实现添加商品、修改商品信息、删除商品等操作。
此外,触发器由数据库引擎直接管理,它是与数据库表密切相关的一种对象,所以当表被删除或者修改时,相关联的触发器也会相应地被删除或修改。
而存储过程则是作为独立于表的对象存在,当数据库表被删除或修改时,存储过程不受影响。
在使用上,触发器和存储过程都可以用于实现一些相同的功能,但触发器更适合于在特定的数据库事件发生时执行自动化的操作,而存储过程更适合于实现复杂的业务逻辑和一些需要主动调用的场景。
总之,触发器和存储过程都是数据库中的重要组件,它们可以用于实现一些自动化的处理和复杂的业务逻辑。
它们在功能和使用方法上有一些不同之处,需要根据具体的需求来选择和使用。
触发器和存储过程
DBMS
OS
DB
由于要设计自己的多任务处理机制和调度算法, 使得N+1方案的DBMS设计在整体上比2N方案要复杂。
Server要处理所有用户的申请,如果调度策略不当或
不能使数据库进程获得较高的优先权,这种方案将导 致瓶颈。 另外,N+1方案中要用到操作系统级的消息机制 以实现多进程向单进程以及单进程向多进程的数据传
针对强制关联关系, 建立触发器。
注意引用完整性
数据录入、修改
数据查询、报表
View
存储过程
T_student
T_teacher
T_Course
T_grade
触发器
三、 DBMS的基本功能和系统结构
1、DBMS的基本功能
◆ 数据库定义
对数据库的结构进行描述,包括外模式、模式、 内模式的定义;数据库完整性的定义;安全保密定义 (如用户口令、级别、存取权限);存取路径 (如索引)
2、设计有效索引 注 意:如果一项查询中,需访问表中多于20%的行, 则使用表扫描比使用索引效率高。 使用索引的指导方针:
● 适量使用索引 ● 不要索引较小的表(比如只有几百行) ● 尽可能使用较少的索引键列
● 尽可能使用覆盖查询(即查询内容包含于索引列
中,则只有索引被访问,表本身被“绕”过)
数据库设计中需要深入考虑的问题
的结果。
存储过程潜在的缺点如下:
1、难以保持负荷平衡。
存储过程提出了一种在服务器上集中处理的模型,
用集中处理代替事务的分布处理。这种方法,除非服 务器的性能进行了优化,符合存储过程运行的需求, 否则它会降低服务器的性能。 2、增加了管理要求。
存储过程是一个共享的资源。管理员必须确保使
存储过程与触发器概念及应用考试
存储过程与触发器概念及应用考试(答案见尾页)一、选择题1. 存储过程是什么?A. 一种数据库对象,用于存储逻辑操作B. 一种数据库对象,用于存储查询语句C. 一种数据库对象,用于存储流程控制语句D. 一种数据库对象,用于存储数据2. 触发器的作用是什么?A. 在数据库中插入、更新或删除数据前自动执行的程序B. 在数据库中创建、修改或删除表C. 用于数据完整性约束D. 用于权限管理3. 存储过程和触发器都存放在以下哪个对象中?A. 数据库B. 表C. 索引D. 视图4. 存储过程可以通过哪种方式调用?A. SQL语句B. 外部程序调用C. 内部程序调用D. 以上都是5. 触发器的类型有哪几种?A. INSERT触发器B. UPDATE触发器C. DELETE触发器D. ALL触发器6. 触发器的工作原理是在哪个事件发生时执行?A. 数据库打开时B. 数据库关闭时C. 数据被插入、更新或删除时D. 用户登录时7. 如何创建一个存储过程?A. 使用CREATE PROCEDURE语句B. 使用CREATE TABLE语句C. 使用ALTER TABLE语句D. 使用CREATE INDEX语句8. 触发器中的IF语句用于做什么?A. 进行条件判断B. 控制触发器的执行流程C. 计算数据D. 存储数据9. 在触发器中,哪个关键字表示不执行任何操作?A. ALLB. EXCEPTIONC. THEND. ELSE10. 触发器的执行顺序是怎样的?A. 从内到外,从上到下B. 从内到外,从下到上C. 从外到内,从上到下D. 从外到内,从下到上11. 触发器的功能是什么?A. 处理数据库中的数据完整性问题B. 执行数据库中的批量操作C. 监控数据库中的数据变化,并在特定事件发生时自动执行操作D. 管理数据库中的用户权限12. 存储过程与触发器都是数据库对象,它们的主要区别是什么?A. 存储过程用于存储查询结果,而触发器用于执行操作B. 存储过程可以有输入参数,而触发器不能C. 存储过程是预编译的,可以提高数据库性能,而触发器是运行时执行的D. 触发器只能由用户触发,而存储过程可以由任何具有权限的用户调用13. 下列哪个不是存储过程的特点?A. 可以接收参数B. 可以有多个输出参数C. 只能在数据库内部执行D. 可以直接修改数据库中的数据14. 触发器通常与哪个对象相关联?A. 数据库表B. 数据库视图C. 数据库索引D. 数据库存储过程15. 在MySQL中,触发器的类型有哪些?A. INSERT触发器B. UPDATE触发器C. DELETE触发器D. SELECT触发器16. 触发器的工作原理是什么?A. 当对触发器关联的数据表进行指定类型的操作时,触发器自动执行预定义的操作B. 当数据库服务器启动时,触发器自动执行C. 当有新的连接连接到数据库时,触发器自动执行D. 当有用户登录到数据库时,触发器自动执行17. 如何在MySQL中创建一个存储过程?A. 使用CREATE PROCEDURE语句B. 使用CREATE FUNCTION语句C. 使用ALTER PROCEDURE语句D. 使用ALTER FUNCTION语句18. 触发器中可以使用哪些类型的条件判断?A. IF...ELSE语句B. CASE语句C. THEN...ELSE语句D. ALL...IN语句19. 触发器可以分为几种类型?(多选)A. INSERT触发器B. UPDATE触发器C. DELETE触发器D. SELECT触发器20. 存储过程和触发器都存放在哪种类型的数据库对象中?A. 表B. 序列C. 索引D. 视图21. 存储过程的类型有哪几种?A. 标准存储过程B. 用户定义存储过程C. 扩展存储过程D. 内置存储过程22. 下列哪个不是存储过程中的控制结构?A. IF...ELSEB. WHILEC. CASED. GOTO23. 触发器在什么情况下会被触发?A. 当表被添加或修改时B. 当数据库连接打开时C. 当用户登录时D. 当执行特定SQL语句时24. 如何使用存储过程?A. 使用CREATE PROCEDURE语句创建存储过程B. 使用ALTER PROCEDURE语句修改存储过程C. 使用DROP PROCEDURE语句删除存储过程D. 以上都是25. 触发器的主要优点是什么?A. 提高数据库性能B. 减少数据库维护成本C. 增加数据库安全性D. 以上都是26. 触发器的主要缺点是什么?A. 可能导致数据库性能下降B. 可能导致数据库死锁C. 可能导致数据库崩溃D. 可能导致数据库锁定二、问答题1. 什么是存储过程?请简述其特点。
存储过程与触发器 实验报告
信息工程学院实验报告课程名称:《数据库原理》实验项目名称:存储过程与触发器一、实验目的:(1)了解存储过程的概念(2)掌握创建、执行存储过程的方法(3)了解查看、修改和删除存储过程的方法(4)了解触发器的概念(5)掌握创建触发器的方法(6)掌握查看、修改、删除触发器信息的方法二、实验设备与器件Win7 +Sql server 2008三、实验内容与步骤(一)存储过程运行实验四附录中的SQL语句,准备实验数据。
然后创建下列存储过程,并调试运行存储过程,查看运行结果。
1.在企业管理器中创建一个名为StuInfo的存储过程,完成的功能是在student表中查询系号为D2的学号、姓名、性别、年龄、系号的内容。
CREATE PROCEDURE StuInfoASSELECT SNO AS学号,SNAME AS姓名,SSEX AS性别,SAGE AS年龄,DNO AS系号FROM studentWHERE DNO='D2'结果:stuinfo2.使用T_SQL语句创建存储过程,完成的功能是在表student,course和study中查询以下字段:学号、姓名、性别、课程名称、考试分数。
use mydb--查询是否已存在此存储过程,如果存在,就删除它if exists(select name from sysobjectswhere name='StuScoreInfo'and type='P')drop procedure StuScoreInfogo--创建存储过程CREATE PROCEDURE StuScoreInfoasselect student.sno as学号,sname as姓名,ssex as性别,ame as课程名称,study.grade as考试分数from student,course,studywhere student.sno=study.sno and o=o结果:StuScoreInfo3.使用T_SQL语句创建一个带有参数的存储过程stu_sno_info,该存储过程根据传入的学生编号,在student表中查询此学生的信息。
存储过程与触发器实验报告
存储过程与触发器实验报告本实验旨在探究存储过程与触发器的概念、作用、使用范围和创建过程,并且通过编写相关的示例代码来展示它们的实际应用。
一、实验原理1. 存储过程存储过程是一组预定义好的 SQL 语句,可以重复使用并且可以直接被调用。
它类似于程序中的函数,可以接受参数、返回值、流程控制等。
2. 触发器触发器是与数据库表相关的事件响应机制,可以在数据库表上定义一些触发条件,当满足这些条件时就会触发执行一些操作,比如插入、更新或删除数据。
二、实验步骤1. 存储过程的创建与使用(1)创建一个用于统计某个用户的订单数量的存储过程。
```DELIMITER //CREATE PROCEDURE `getOrderCount`(IN p_userid INT, OUTp_count INT)BEGINSELECT COUNT(*) INTO p_count FROM orders WHERE user_id = p_userid;END//DELIMITER ;```(2)调用这个存储过程,并输出结果。
```CALL getOrderCount(123, @count);SELECT @count AS 'order_count';```2. 触发器的创建与使用(1)创建一个在用户表中插入新记录时自动生成一个账户记录的触发器。
```DELIMITER //CREATE TRIGGER `insert_user_account` AFTER INSERT ON `users` FOR EACH ROWBEGININSERT INTO accounts (user_id, balance) VALUES (NEW.id, 0);END//DELIMITER ;```(2)在用户表中插入一条新记录,触发器会自动执行并在账户表中生成一条新记录。
```INSERT INTO users (name, email) VALUES ('Alice','***************');SELECT * FROM accounts WHERE user_id =LAST_INSERT_ID();```三、实验结论通过实验我们发现,存储过程可以将一些常用的 SQL 语句封装为一个可以重复调用的函数,使得程序更加简洁和高效。
实验7-存储过程和触发器的使用
实验7 存储过程和触发器的使用1.存储过程①创建存储过程,使用Employees表中的员工人数来初始化一个局部变量,并调用这个存储过程USE YGGLGOCREATE PROCEDURE TEST@NU MBER int OUTPUTASBEGINDECLARE@NU MBER2inTSET@NU MBER2=(SELECT COUNT(*)FROM Employees)SET@NU MBER1=@NU MBER2END②创建存储过程,比较两个员工的实际收入,若前者比后者高就输出0,否则输出1 BEGINDECLARE@SR1float,@SR2FLOATSELECT@SR1=InCome-OutCome FROM Salary WHERE EmployeeID=@ID1SELECT@SR2=InCome-OutCome FROM Salary WHERE EmployeeID=@ID2IF@ID1>@ID2SET@BJ=0ELSESET@BJ=1END③创建添加职员记录的存储过程EmployeeAddUSE YGGLGOCREATE PROCEDURE EmployeeAdd(@employeeid char(6),@name char(10),@education char(4),@birthday datetime, @woekyear tinyint,@sex bit,@address char(40),@phonenumber char(12),@departmentID char(3))ASBEGININSERT INTO EmployeesVALUES(@employeeid,@name,@education,@birthday,@woekyear,@sex,@address,@phonenumber,@departmentID)ENDRETURNGO④创建带有OUTPUT游标参数的存储过程,在Employees表中声明并打开游标USE YGGLGOCREATE PROCEDURE em_cursor@em_cursor cursor VARYING OUTPUTASBEGINSET@em_cursor=CURSOR FORWARD_ONLY STATICFORSELECT*FROM EmployeesOPEN@em_cursorENDGO⑤创建存储过程,使用游标确定一个员工的实际收入是否排在前三名,结果为1表示是,结果为0表示否REATE PROCEDURE TOP_THREE@EM_ID char(6),@OK bit OUTPUTASBEGINDECLARE@X_EM_ID char(6)DECLARE@ACT_IN int,@SEQ intDECLARE SALARY_DIS cursor FORSELECT EmployeeID,InCome_OutComeFROM SalaryORDER BY InCome_OutCome DESCSET@SEQ=0SET@OK=0OPEN SALARY_DISFETCH SALARY_DIS INTO@X_EM_ID,@ACT_INWHILE@SEQ<3 AND@OK=0BEGINSET@SEQ=@SEQ+1IF@X_EM_ID=@EM_IDSET@OK=1FETCH SALARY_DIS INTO@X_EM_ID,@ACT_INENDCLOSE SALARY_DISDEALLOCATE SALARY_DISEND2.触发器①向Employees表插入或修改一个记录时,通过触发器检查记录的DpartmentID值在Dpartments表中是否存在,若不存在,则取消插入或修改操作USE YGGLGOCREATE TRIGGER EmployeesIns ONFOR INSERT,UPDATEASBEGINIF((SELECT DepartmentID from inserted)NOT IN(SELECT DepartmentID FROM DepartmentS))ROLLBACKEND②修改Dpartments表“DpartmentID”字段值时,该字段在Employees表中对应的值也做相应修改USE YGGLUSE YGGLGOCREATE TRIGGER DepartmentUpdate ONFOR UPDATEASBEGINUPDATE EmployeesSET DepartmentID=(SELECT DepartmentID FROM insered)WHERE DepartmentID=(SELECT DepartmentID FROM deleted)ENDGO③删除Dpartment表中记录的同时删除该记录“DpartmentID”字段值在Employees表中对应的记录CREATE TRIGGER DepartmentsDelate ONFOR DELETEASBEGINDELETE FROM EmployeesWHERE DepartmentID=(SELECT DepartmentID FROM deleted)ENDGO④创建INSTEAD OF 触发器,当向Salary表中插入记录时,先检查EmployeeID列上的值在Employees中是否存在,如果在则执行插入操作,如果不存在,则提示“员工号不存在”CREATE TRIGGER EM_EXISTS ON SalaryINSTEAD OF INSERTASBEGINDECLARE@EmployeeID char(6)SELECT@EmployeeID=EmployeeIDFROM insertedIF(@EmployeeID IN(SELECT EmployeeID FROM Employee))INSERT INTO Salary SELECT*FROM insertedELSEPRINT'员工号不存在'END⑤创建DDL触发器,当删除YGGLXJ数据库的一个表时,提示“不能删除表”,并回滚删除表的操作USE YGGLGOCREATE TRIGGER table_deleteON DATABASEAFTER DROP_TABLEASPRINT'不能删除该表'ROLLBACK TRANSACTION。
数据库的一些基本概念(视图,存储过程,函数,触发器)
数据库的⼀些基本概念(视图,存储过程,函数,触发器)⼀、视图视图定义视图是从⼀个或⼏个基本表(或视图)中导出的虚拟的可视化的表。
在系统的数据字典中仅存放了视图的定义,不存放视图对应的数据。
视图特点安全:有的数据是需要保密的,如果直接把表给出来进⾏操作会造成泄密,那么可以通过创建视图把相应视图的权限给出来即可保证数据的安全。
⾼效:复杂的连接查询,每次执⾏时效率⽐较低,可以考虑新建视图,每次从视图中获取,将会提⾼效率。
定制数据:将常⽤的字段放置在视图中。
使⽤视图不会加快数据查询速度。
⼆、存储过程存储过程(Stored Procedure)是在⼤型数据库系统中,⼀组为了完成特定功能的SQL 语句集,存储在数据库中,经过第⼀次编译后调⽤不需要再次编译,⽤户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执⾏它。
存储过程是数据库中的⼀个重要对象。
优点存储过程的能⼒⼤⼤增强了SQL语⾔的功能和灵活性。
可保证数据的安全性和完整性。
通过存储过程可以使没有权限的⽤户在控制之下间接地存取数据库,从⽽保证数据的安全。
存储过程可以使相关的动作在⼀起发⽣,从⽽可以维护数据库的完整性。
在运⾏存储过程前,数据库已对其进⾏了语法和句法分析,并给出了优化执⾏⽅案。
这种已经编译好的过程可极⼤地改善SQL语句的性能。
可以降低⽹络的通信量。
使体现企业规则的运算程序放⼊数据库服务器中,以便集中控制。
三、函数在数据库中都有函数,这些函数属于系统函。
除此之外⽤户也可以编写⽤户⾃定义函数。
⽤户定义函数是存储在数据库中的代码块,可以把值返回到调⽤程序。
调⽤时如同系统函数⼀样,如max(value)函数,其value被称为参数。
函数⼀般功能⽐较简单,对于mysql函数只有传⼊参数,不像存储过程⼀样,有输⼊输出参数。
数据库函数特点如下:存储函数将向调⽤者返回⼀个且仅返回⼀个结果值。
存储函数嵌⼊在sql中使⽤的,可以在select中调⽤,就像内建函数⼀样,⽐如cos()、hex()。
实验6 大数据库实验——存储过程和触发器
实验6 存储过程和触发器一、实验目的1、加深和巩固对存储过程和触发器概念的理解。
2、掌握触发器的简单应用。
3、掌握存储过程的简单应用。
二、实验容一)存储过程:1. 创建一存储过程,求l+2+3+…+n,并打印结果。
CREATE PROCEDURE addresultASDECLARE n int=10,/*最后一个数*/i int=0,result int=0 /*结果*/BEGINWHILE(i<=n)BEGINSET result=result+iSET i=i+1ENDPRINT'1+2+3+...+n的结果是:'PRINT resultRETURN(result)ENDGO2.调用上面的addresult存储过程,打印l十2+3+…+10的结果。
EXEC addresult3. 修改上述存储过程为addresult1,使得n为输入参数,其具体值由用户调用此存储过程时指定。
CREATE PROCEDURE addresult1n int=10 /*最后一个数*/ASDECLARE i int=0,result int=0 /*结果*/BEGINWHILE(i<=n)BEGINSET result=result+iSET i=i+1ENDPRINT'1+2+3+...+n的结果是:'PRINT resultRETURN(result)ENDGO4. 调用上面修改后的addresult1存储过程,打印l+2+3+…+100的结果。
EXEC addresult1 1005.修改上述存储过程为addresult2,将n参数设定默认值为10,并改设sum为输出参数,让主程序能够接收计算结果。
CREATE PROCEDURE addresult2n int=10,/*最后一个数*/sum int out/*结果*/ASDECLARE i int=0BEGINset sum=0WHILE(i<=n)BEGINSET sum=sum+iSET i=i+1ENDENDGO6.调用上面修改后的addresult2存储过程,设置变量s接收计算l+2+3+…+10的结果。
sql数据库练习题参考答案
第1章数据库基础练习题一、单项选择题1.C 2.A 3.C 4.D 5.D6.B 7.A 8.B 9.B 10.D11.C 12.A 13.C 14.B 15.A16.B 17.A 18.D 19.B 20.B21.A; D 22.A 23.C 24.D 25.B26.B 27.B 28.D 29.B 30.B二、填空题1.概念;数据2.属性3.码4.一对一联系;一对多(或多对一)联系;多对多联系5.候选码6.候选码7.关系名(属性1,属性2,…,属性n)8.关系数据结构;关系操作集合;关系完整性约束9.实体;参照;用户定义的;实体;参照10.空值11.需求分析阶段;概念结构设计阶段;逻辑结构设计阶段;物理结构设计阶段;数据库实施阶段;数据库运行和维护阶段12.准确了解并分析用户对系统的要求,尤其是用户的信息要求、处理要求、安全性与完整性要求,确定所要开发的应用系统的目标,产生用户和设计者都能接受的需求说明书,做为下一步数据库概念结构设计的依据。
13.将需求分析得到的用户需求抽象为信息结构即概念模型。
14.将概念结构进一步转化为某一DBMS支持的数据模型,并对其进行优化。
15.为逻辑数据模型选取一个最适合应用环境的物理结构,包括数据库在物理设备上的存储结构和存取方法。
三、指出以下各缩写的英文意思和中文意思1.DB:Database2.DBMS:Database Management System3.RDBMS:4.DBS:Database System5.DBA:Database Administrator6.NF:Normal Form7.DDL:Data Definition Language 四、按题目要求回答问题3.答:(1)关系R是2NF。
因为R的候选码为课程名,而课程名→教师名,教师名→教师地址,所以课程名→教师地址,即存在非主属性教师地址对候选码课程名的传递函数依赖,因此R不是3NF。
数据库实验5 存储过程和触发器
实验五存储过程和触发器一、实验目的(1) 通过实践理解存储过程和触发器的概念、作用及优点;(2) 掌握存储过程的定义与调用,实现存储过程中带有不同参数的应用;(3) 掌握创建触发器。
二、实验原理1.存储过程一个被命名的存储在服务器上的T-SQL语句的集合,是封装重复性工作的一种方法。
(1)创建存储过程CREATE PROC[DURE]PROCDURE_NAME [{@PARAMENT DATA_TYPE}[VARYING][=DEFAULT][OUTPUT]] [, (1)AS SQL_STATEMENTPROCEDURE_NAME:新存储过程的名称,必须符合标识符规则且唯一。
@PARAMETER:过程中的参数。
可以声明一个或多个参数。
用户必须在执行过程时提供每个所声明参数的值(除非定义了该参数的默认值)。
使用 @ 符号作为第一个字符来指定参数名称。
参数名称须符合标识符规则。
每个过程的参数仅用于该过程本身;相同的参数名称可用在其它过程中。
默认情况下参数只能代替常量,不能代替表名、列名或其它数据库对象名称。
DATA_TYPE:参数的数据类型。
DEFAULT:参数的默认值。
如果定义了默认值,不必指定该参数的值即可执行过程。
默认值必须是常量或 NULL。
OUTPUT:表明参数是返回参数。
该选项的值可以返回给 EXEC[UTE]。
使用 OUTPUT 参数可将信息返回给调用过程。
(2)执行存储过程SQL SERVER系统中,可以使用EXECUTE语句执行存储过程。
EXECUTE语句也可以简写为EXEC。
如果将要执行的存储过程需要参数,那么应该在存储过程名称后面带上参数值。
[EXEC[UTE]]{[@RETURN_STATUS=]{PROCEDURE_NAME[;NUMBER]|@PROCEDURE_NAME_VAR}[@PARAMETER={VALUE|@VARIABLE[OUTPUT]|[DEFAULT]}[,…N](3) 删除存储过程使用DROP PROCEDURE语句可永久地删除存储过程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7.1.3 存储过程的修改
语法格式: ALTER { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ] [ { @parameter [ type_schema_name. ] data_type } [ VARYING ] [ = default ] [ OUT[PUT] ] ][ ,...n ] [ WITH <procedure_option>] [ ,...n ] [ FOR REPLICATION ] AS { <sql_statement> [;][ ...n ] | EXTERNAL NAME asse MBly_name.class_name.method_name } [;]
第7章 存储过程和触发器
7.1 存储过程
7.2 触发器
7.1 存储过程
7.1.1 存储过程的类型 (1)系统存储过程。系统存储过程是由SQL Server提供的存储过程,可以作 为命令执行。 (2)扩展存储过程。扩展存储过程是指在SQL Server 2008环境之外,使用编
程语言(如C++语言)创建的外部例程形成的动态链接库(DLL)。
7.1.5 界面操作存储过程
(1)创建存储过程。例如,如果要通过图形向导方式定义一个存储过程来查询 PXSCJ数据库中每个同学各门功课的成绩,那么其主要步骤如下:
7.1.5 界面操作存储过程
(2)执行存储过程。在PXSCJ数据库的“存储过程”目录下选择要执行的存储 过程,例如student_info1,右击鼠标,选择“执行存储过程”菜单项。
7.1.3 存储过程的修改
【例7.8】 创建名为select_students的存储过程,在默认情况下,该存储过程 可查询所有学生信息,随后授予权限。当该存储过程需更改为能检索计算机专业的 学生信息时,用ALTER PROCEDURE重新定义该存储过程。 创建select_students存储过程。 CREATE PROCEDURE select_students /*创建存储过程*/ AS SELECT * FROM XSB ORDER BY 学号 GO 修改存储过程select_students。 ALTER PROCEDURE select_students WITH ENCRYPTION AS SELECT * FROM XSB WHERE 专业= '计算机' ORDER BY 学号 GO
(3)用户存储过程。在SQL Server 2008中,用户存储过程可以使用T-SQL语言 编写,也可以使用CLR方式编写。在本书中,T-SQL存储过程就称为存储过程。
7.1.2 存储过程的创建与执行
1.使用T-SQL命令创建存储过程 创建存储过程的语句是CREATE PROCEDURE或CREATE PROC,两者同义。 语法格式: CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ]
7.1.2 存储过程的创建与执行
3.举例 (1)设计简单的存储过程。 【例7.1】 返回081101号学生的成绩情况。该存储过程不使用任何参数。 USE PXSCJ GO CREATE PROCEDURE student_info AS SELECT * FROM CJB WHERE 学号= '081101' GO 存储过程定义后,执行存储过程student_info: EXECUTE student_info 如果该存储过程是批处理中的第一条语句,则可使用 student_info 执行结果如下:
7.1.2 存储过程的创建与执行
第二个存储过程:
CREATE PROCEDURE do_action @X bit, @STR CHAR(8) OUTPUT AS BEGIN EXEC do_insert IF @X=0 BEGIN UPDATE XSB SET 姓名='刘英', 性别=0 WHERE 学号='091201' SET @STR='修改成功' END ELSE IF @X=1 BEGIN DELETE FROM XSB WHERE 学号='091201' SET @STR='删除成功' E程时,就要把它从数据库中删除。使用DROP PROCEDURE 语句可永久地删除存储过程。在此之前,必须确认该存储过程没有任何依赖关系。 语法格式: DROP { PROC | PROCEDURE } { [ schema_name. ] procedure } [ ,...n ] 【例7.9】 删除PXSCJ数据库中的student_info存储过程。 USE PXSCJ GO IF EXISTS(SELECT name FROM sysobjects WHERE name='student_info') DROP PROCEDURE student_info
7.1.2 存储过程的创建与执行
(5)使用OUTPUT游标参数的存储过程。OUTPUT游标参数用于返回存储过程 的局部游标。 【例7.5】 在 PXSCJ数据库的XSB表上声明并打开一个游标。 CREATE PROCEDURE st_cursor @st_cursor cursor VARYING OUTPUT AS SET @st_cursor = CURSOR FORWARD_ONLY STATIC FOR SELECT * FROM XSB OPEN @st_cursor
7.2 触发器
7.2.1 触发器的类型 (1)DML触发器。当数据库中发生数据操纵语言(DML)事件时将调用DML
触发器。DML事件包括对表或视图的INSERT语句、UPDATE语句和DELETE语句,因
/*定义过程名*/ [ { @parameter [ type_schema_name. ] data_type }
/*定义参数的类 /*定义参数的属
型*/
[ VARYING ] [ = default ] [ OUT | OUTPUT ] [READONLY] 性*/ ][ ,...n ] [ WITH <procedure_option>] [ ,...n ] 存储过程的处理方式*/ AS <sql_statement> [;][ ...n ] /*执行的操作*/ [;] 其中, /*定义
7.1.2 存储过程的创建与执行
(2)使用带参数的存储过程。 【例7.2】 从PXSCJ数据库的三个表中查询某人指定课程的成绩和学分。该存储 过程接收与传递参数精确匹配的值。 USE PXSCJ GO CREATE PROCEDURE student_info1 @name char (8), @cname char(16) AS SELECT a.学号, 姓名, 课程名, 成绩, t.学分 FROM XSB a INNER JOIN CJB b ON a.学号 = b.学号 INNER JOIN KCB t ON b.课程号= t.课程号 WHERE a.姓名=@name and t.课程名=@cname GO
7.1.2 存储过程的创建与执行
在如下的批处理中,声明一个局部游标变量,执行上述存储过程,并将游标赋 值给局部游标变量,然后通过该游标变量读取记录。 DECLARE @MyCursor cursor EXEC st_cursor @st_cursor = @MyCursor OUTPUT /*执行存储过程*/ FETCH NEXT FROM @MyCursor WHILE (@@FETCH_STATUS = 0) BEGIN FETCH NEXT FROM @MyCursor END CLOSE @MyCursor DEALLOCATE @MyCursor
7.1.2 存储过程的创建与执行
执行存储过程student_info1: EXECUTE student_info1 '王林', '计算机基础' 执行结果如下:
以下命令的执行结果与上面的相同: EXECUTE student_info1 @name='王林', @cname='计算机基础' 或者 DECLARE @proc char(20) SET @proc= 'student_info1' EXECUTE @proc @name='王林', @cname='计算机基础'
7.1.2 存储过程的创建与执行
(6)使用WITH ENCRYPTION选项。WITH ENCRYPTION子句用于对用户隐藏存 储过程的文本。 【例7.6】 创建加密过程,使用 sp_helptext 系统存储过程获取关于加密过程 的信息,然后尝试直接从 syscomments 表中获取关于该过程的信息。 CREATE PROCEDURE encrypt_this WITH ENCRYPTION AS SELECT * FROM XSB 执行如下语句: EXEC sp_helptext encrypt_this
7.1.2 存储过程的创建与执行
2.存储过程的执行 通过EXECUTE或EXEC命令可以执行一个已定义的存储过程,EXEC是EXECUTE的 简写。语法格式: [ { EXEC | EXECUTE } ] { [ @return_status = ] { module_name [ ;number ] | @module_name_var } [ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] }] [ ,...n ] } [;]
7.1.2 存储过程的创建与执行
(3)使用带OUPUT参数的存储过程。 【例7.3】 创建一个存储过程do_insert,作用是向XSB表中插入一行数据。创建 另外一个存储过程do_action,在其中调用第一个存储过程,并根据条件处理该行数 据,处理后输出相应的信息。 第一个存储过程: