SQL实验七:存储过程和触发器的使用

合集下载

MySQL中的触发器和存储过程的区别与用途

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的触发器,它在订单表插入数据后触发,然后执行更新库存表的操作。

SQL Server 2012 数据库教程第7章 存储过程和触发器

SQL Server 2012 数据库教程第7章 存储过程和触发器
(3)用户存储过程。在SQL Server中,用户存储过程可以使用T-SQL语言编写, 也可以使用CLR方式编写。在本书中,T-SQL存储过程就称为存储过程。
① 存储过程:存储过程保存T-SQL语句集合,可以接收和返回用户提供的参 数。
② CLR存储过程:CLR存储过程是对Microsoft .NET Framework公共语言运行时 (CLR)方法的引用,可以接收和返回用户提供的参数。
则创建完成,如图7.4所示。
2.执行存储过程 在pxscj数据库的“存储过程”目录下选择要执行的存储过程,如 student_info1,右键单击鼠标,选择“执行存储过程”菜单项。在弹出的“执行 过程”窗口中会列出存储过程的参数形式,如果“输出参数”栏为“否”,则表
以下命令的执行结果与上面的相同:
EXECUTE student_info1 @name='王林', @cname='计算机基础'
或者: DECLARE @proc char(20) SET @proc= 'student_info1' EXECUTE @proc @name='王林', @cname='计算机基础'
接下来执行存储过程do_action来查看结果: DECLARE @str char(8) EXEC dbo.do_action 0, @str OUTPUT SELECT @str; 执行结果显示“修改成功”。
Hale Waihona Puke 4)使用带有通配符参数的存储过程【例7.4】 从3个表的连接中返回指定学生的学号、姓名、所选课程名称及该
在如下的批处理中,声明一个局部游标变量,执行上述存储过程,并将游标 赋值给局部游标变量,然后通过该游标变量读取记录。

sql触发器语句的使用流程

sql触发器语句的使用流程

SQL触发器语句的使用流程1. 触发器简介触发器是SQL中一种特殊的过程,它会在SQL语句执行之前或之后自动被触发执行。

通过触发器,我们可以在数据库中插入、更新或删除记录时执行一系列的操作。

本文将介绍SQL触发器语句的使用流程。

2. 创建触发器在SQL中,创建触发器需要使用CREATE TRIGGER语句。

下面是创建触发器的语法:CREATE TRIGGER trigger_nameAFTER/BEFORE INSERT/UPDATE/DELETE ON table_nameFOR EACH ROWBEGIN-- 触发器的操作语句END;•trigger_name为触发器的名称,可以根据具体需求自行命名。

•AFTER/BEFORE指定触发器是在SQL语句执行之前还是之后触发执行。

•INSERT/UPDATE/DELETE指定触发器是在插入、更新或删除记录时触发执行。

•table_name为触发器所属的表名。

•FOR EACH ROW表示触发器是逐行触发执行的。

3. 触发器的操作语句在触发器的BEGIN和END之间可以编写一系列的操作语句。

这些操作语句可以是SQL语句、条件语句、循环语句等。

下面是一个示例,创建一个触发器在插入记录时更新另一个表中的记录:CREATE TRIGGER update_another_tableAFTER INSERT ON table1FOR EACH ROWBEGINUPDATE table2 SET column1 =NEW.column1 WHERE id=NEW.id;END;在上述示例中,每当向table1表中插入一条记录时,触发器就会自动执行。

执行的操作是将插入的记录中的column1的值更新到table2表中对应记录的column1字段。

4. 激活和禁用触发器在某些情况下,我们可能需要临时禁用触发器或重新激活触发器。

可以使用DISABLE TRIGGER和ENABLE TRIGGER语句来完成这个操作。

存储过程和触发器实验心得

存储过程和触发器实验心得

存储过程和触发器实验心得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开始,导致违反唯一约束条件,从而导致调用储存过程失败。

四、实验心得体会通过本次实验,学会了储存过程以及触发器和序列的使用方法,对存储过程有了一个直观的认识,对触发器的工作原理和作用有了更加深刻的认识,使用触发器可以在修改数据前后规范数据,使数据规范化和标准化。

简单使用触发器SQL触发器的使用及语法

简单使用触发器SQL触发器的使用及语法

简单使用触发器SQL触发器的使用及语法SQL触发器是一种特殊类型的存储过程,它是在数据库中一些特定的操作发生时自动执行的。

触发器可以用于在数据被插入、更新或删除时执行一系列的操作。

本文将详细介绍SQL触发器的使用和语法。

1.触发器的类型:SQL触发器可以分为三种类型:插入触发器(INSERT trigger)、更新触发器(UPDATE trigger)和删除触发器(DELETE trigger)。

根据业务需求选择相应的触发器类型。

2.创建触发器:创建触发器需要使用CREATETRIGGER语句。

语法如下:CREATE TRIGGER <trigger_name>{BEFORE,AFTER,INSTEADOF}{INSERT,UPDATE,DELETE}[ON <table_name>][FOREACHROW][WHEN (<condition>)]BEGIN--触发器执行的操作END;其中,trigger_name是触发器的名称;BEFORE / AFTER / INSTEAD OF表示触发器在所指定操作之前、之后或者代替进行;INSERT / UPDATE/ DELETE表示触发器响应的操作类型;table_name是触发器所绑定的表名;FOR EACH ROW表示该触发器对每一行数据都执行;condition是触发器的条件。

3.触发器执行的操作:在触发器的BEGIN和END之间,可以进行一系列的操作,如执行SQL 语句、调用存储过程等。

可以根据业务需求在触发器中编写逻辑代码来满足需求。

4.触发器的应用场景:-数据完整性:可以使用触发器在插入、更新或删除数据时进行一些验证,确保数据的完整性。

例如,在插入新用户之前,可以在触发器中检查用户的必填字段是否为空。

-数据同步:可以使用触发器在数据更新时自动更新其他相关表中的数据,确保数据的同步。

例如,在更新订单信息时,可以在触发器中更新库存表中的相应数据。

存储过程、函数与触发器操作答案

存储过程、函数与触发器操作答案

《存储过程、函数与触发器操作》实验一、实验目的与要求1、掌握存储过程的使用。

2、掌握函数的使用。

3、掌握触发器操作。

三、实验内容一、存储过程1、在“教务管理系统”数据库中创建一个名为ProcStudentInfo的存储过程,它返回学生的学号、姓名、性别、班级编号、年级和籍贯信息。

CREATE PROCEDURE Proc_StudentInfoASSELECT 学号,姓名,性别,班级编号,年级,籍贯FROM 学生信息2、用EXECUTE执行Proc_StudentInfo存储过程。

EXECUTE Proc_StudentInfo3、创建一个存储过程,用于返回“教务管理系统”数据库上某个班级中所有学生的信息。

CREATE PROCEDURE Proc_GetClassStudent1@ClassID varchar(14)ASSELECT 学号,姓名,性别,班级编号,年级,籍贯FROM 学生信息WHERE 班级编号=@ClassID4、创建一个存储过程,用于返回“教务管理系统”数据库上某个班级中所有学生的信息,默认班级编号为'20031340000102' 。

CREATE PROCEDURE Proc_GetClassStudent2@ClassID varchar(14)= '20031340000102'ASSELECT 学号,姓名,性别,班级编号,年级,籍贯FROM 学生信息WHERE 班级编号=@ClassIDEXECUTE Proc_GetClassStudent2 '20031340000103'5、创建一个返回执行代码为100的存储过程。

CREATE PROCEDURE Proc_GetClassStudent4@ClassID varchar(14)ASBEGINSELECT 学号,姓名,性别,班级编号,年级,籍贯FROM 学生信息WHERE 班级编号=@ClassIDRETURN 100END6、执行存储过程Proc_GetClassStudent2和Proc_GetClassStudent4,并定义两个个变量存储执行返回代码。

存储过程和触发器(实验报告)

存储过程和触发器(实验报告)
CREATE PROCEDURE stu_en
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创建触发器的方法和步骤;

实验七 存储过程与触发器

实验七 存储过程与触发器

实验七存储过程与触发器实验七存储过程与触发器一、创建一个名为“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.。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(二 〇 一 五 年 五 月《数据库原理及应用》实验报告学校代码: 10128 学 号: ************题 目:存储过程和触发器的使用 ****:** 学 院:理学院 系 别:数学系专 业:信息与计算科学 班 级:信计12-2 ****:**一、实验目的1.掌握存储过程的使用方法;2.掌握触发器的使用方法。

二、实验内容1.存储过程;2.触发器。

三、实验程序及结果1、存储过程(1)创建存储过程,使用Employees表中的员工人数来初始化一个局部变量,并调用这个存储过程。

USE YGGLGOCREATE PROCEDURE TEST @NUMBER1 int OUTPUTASBEGINDECLARE @NUMBER2 intSET @NUMBER2=(SELECT COUNT(*)FROM Employees)SET @NUMBER1=@NUMBER2ENDGOUSE YGGLGODECLARE @num intEXEC TEST @num OUTPUTSELECT @num(2)创建存储过程,比较两个员工的实际收入,若前者比后者高就输出0,否则输出1。

USE YGGLGOCREATE PROCEDURE COMPA @ID1 CHAR(6),@ID2 CHAR(6),@BJ INT OUTPUTASBEGINDECLARE @SR1 FLOAT,@SR2 FLOATSELECT@SR1=InCome-OutComeFROMSalaryEmployeeID=@ID1SELECT @SR2=InCome-OutCome FROM Salary WHERE EmployeeID=@ID2 IF @ID1>@ID2SET @BJ=0ELSESET @BJ=1ENDUSE YGGLGODECLARE @BJ intEXEC COMPA '000001','108991',@BJ OUTPUTSELECT @BJ(3)创建添加职员记录的存储过程EmployeeADD。

USE 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)ENDRETURNGOGOEXEC EmployeeAdd '990230','刘朝','本科','840909',2,1,'武汉小洪山号','85465213','3'(4)创建一个带有OUTPUT游标参数的存储过程,在Employees表中声明并打开一个游标。

USE YGGLGOCREATE PROCEDURE em_cursor @em_cursor cursor VARYING OUTPUTASBEGINSET @em_cursor=CURSOR FORWARD_ONLY STATICFORSELECT*FROM EmployeesOPEN @em_cursorENDGO声明一个局部游标变量,执行上述存储过程,并将游标赋值给局部游标变量,然后通过该游标变量读取记录:USE YGGLGODECLARE @MYCURSOR CURSOREXEC em_cursor @em_cursor=@MyCursor OUTPUTFETCH NEXT FROM @MyCursorWHILE(@@FETCH_STATUS=0)BEGINFETCH NEXT FROM @MyCursorENDCLOSE @MyCursorDEALLOCATE @MyCursorGO(5)创建一个存储过程,使用游标确定一个员工的实际收入是否排在前三名。

结果为1表示是,结果为0表示否。

USE YGGLGOCREATE 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_DISEND执行该存储过程,并查看结果:USE YGGLGODECLARE @OK bitEXEC TOP_THREE '108991',@OK OUTPUTSELECT @OK2、触发器(1) 向Employees表插入或修改一个记录时,通过触发器检查记录的DepartmentID值在Department表中是否存在,若不存在,则取消插入或修改操作。

USE YGGLGOCREATE TRIGGER EmployeesIns ON dbo.EmployeesFOR INSERT,UPDATEASBEGINIF((SELECT DepartmentID from inserted)NOT IN(SELECT DepartmentID FROM Department))ROLLBACKEND向Employees表插入或修改一行记录,查看结果(2) 修改Department表“DpartmentID”字段值时,该字段在Employees表中对应的值也做相应修改。

USE YGGLGOCREATE TRIGGER DepartmentUpdate ON dbo.DepartmentFOR UPDATEASBEGINUPDATE EmployeesSET DepartmentID=(SELECT DepartmentID FROM insered)WHERE DepartmentID=(SELECT DepartmentID FROM deleted)ENDGO(3) 删除Department表中记录的同时删除该记录“DepartmentID”字段值在Employees 表中对应的记录。

USE YGGLGOCREATE TRIGGER DepartmentsDelate ON dbo.DepartmentFOR DELETEASBEGINDELETE FROM EmployeesWHERE DepartmentID=(SELECT DepartmentID FROM deleted)ENDGO(4) 创建INSTEAD OF 触发器,当向Salary表中插入记录时,先检查EmployeeID列上的值在Employees中是否存在,如果在则执行插入操作,如果不存在,则提示“员工号不存在”。

USE YGGLGOCREATE TRIGGER EM_EXISTS ON SalaryINSTEAD OF INSERTASBEGINDECLARE @EmployeeID char(6)SELECT @EmployeeID=EmployeeIDFROM insertedIF(@EmployeeID IN(SELECT EmployeeID FROM Employees))INSERT INTO Salary SELECT*FROM insertedELSEPRINT'员工号不存在'END向Salary表中插入一行记录查看效果:USE YGGLGOINSERT INTO Salary VALUES('111111',2500.3,123.2)(5)创建DDL触发器,当删除YGGL数据库的一个表时,提示“不能删除表”,并回滚删除表的操作。

USE YGGLGOCREATE TRIGGER table_deleteON DATABASEAFTER DROP_TABLEASPRINT'不能删除该表'ROLLBACK TRANSACTION四、实验总结本次上机实验,通过对存储过程和触发器两个内容的实际操作,让我对存储过程的使用方法和触发器的使用方法有了更好的掌握,同时也对课堂所学知识进行了巩固和提高,我觉得在上机操作中还应该耐心细致,认真思考,把出错的可能性降到最低,同时也让自己的实际操作水平得以提高。

相关文档
最新文档