实验五 存储过程和触发器

实验五 存储过程和触发器

  • 实验目的
  1. 加深对存储过程和触发器的理解
  2. 掌握存储过程和触发器的创建和使用,理解它们的执行方式的不同
  3. 理解并体会存储过程和触发器的区别和联系

二. 实验内容

在已建好的各表基础上,根据需要创建相关的存储过程或触发器,完成一定的功能。

  1. 创建一个InsertS的存储过程,向S中插入一条记录,新记录的值由参数提供。并验证该存储过程的执行情况。

实验过程:

  1. 创建存储过程:

DROP PROCEDURE IF EXISTS InsertS;

DELIMITER $$

CREATE PROCEDURE InsertS(in S_SNO CHAR(2),in S_SNAME CHAR(3),in S_STATUS CHAR(2),in C_CITY CHAR(2))

BEGIN

   insert into s VALUES(S_SNO,S_SNAME,S_STATUS,C_CITY);

END

$$

DELIMITER;

  1. 调用InsertS

call InsertS('S8','精益',50,'北京');

实验结果:

  1. 创建存储过程:

  1. 调用InsertS

结果分析:

该存储过程创建成功,可以实现用户直接调用进行数据的插入

  1. 创建一个QuerySPJ的存储过程,根据用户提供的工程项目代码查询该工程项目的使用零件情况,并返回使用零件的总数量。

实验过程:

  1. 创建存储过程:

DROP PROCEDURE IF EXISTS QuerySPJ;

DELIMITER $$

CREATE PROCEDURE QuerySPJ(in J_JNO CHAR(2),OUT QTYcount INT)

BEGIN

   SELECT jno,pno,QTY FROM spj WHERE JNO=J_JNO;

   SELECT sum(QTY) into QTYcount

   FROM spj

   GROUP BY JNO

   HAVING JNO=J_JNO;

END

$$

DELIMITER;

  1. 调用QuerySPJ,查询J4

SET @count=0;

call QuerySPJ('J4',@count);

SELECT @count;

实验结果:

  1. 创建存储过程:

  1. 调用QuerySPJ,查询J4

 

结果分析:

      

可以看到J4的零件使用情况确实如结果所示。J4的零件使用情况见结果1,总零件数见结果2,J4使用零件总数800个。

  1. 创建一个触发器,使得在S表中删除某条记录时,SPJ表中的数据也进行相应的删除操作。(创建触发器之前先去掉表的外键联系,这个触发器只是模拟一下级联删除操作)

实验过程:

  1. 删除外键:

Sql语句方式:

Alter table spj drop foreign key spj_ibfk_1;

Alter table spj drop foreign key spj_ibfk_2;

Alter table spj drop foreign key spj_ibfk_3;

可视化界面:

  1. 创建触发器:

CREATE TRIGGER delete_spj

AFTER

DELETE on s

for each ROW

BEGIN

DELETE FROM spj WHERE SNO=OLD.SNO;

END;

  1. 再运行删除语句:

DELETE from s where SNO='S3';

实验结果:

  1. 删除外键:

  1. 创建触发器:

  1. 再运行删除语句:

结果分析:

在无外键的情况下,s表与spj表没有关联,但是通过触发器是可以实现级联删除的。需要注意的是,弄清楚删的顺序,删除s表中数据的时候,spj表中的数据也相应删除。

 

 

  1. S表中增加一列属性,属性名为AvgQty,表示供应商的平均供应数量,创建一个触发器,使得当向SPJ表中插入数据时,AvgQty也做相应修改。

实验过程:

  1. 加新的属性列:

alter table s add avgQty DOUBLE (10,0);

  1. 创建触发器:

CREATE TRIGGER spj_AvgQty

AFTER

INSERT on spj

for EACH ROW

BEGIN

DECLARE qtycount DOUBLE(10,0);

DECLARE count INT;

SET qtycount=0;

set count=0;

SELECT SUM(QTY) INTO qtycount FROM spj GROUP BY sno HAVING sno=new.sno;

SELECT count(*) INTO count FROM spj GROUP BY sno HAVING sno=new.sno;

set qtycount=qtycount/count;

UPDATE s SET AvgQty=qtycount WHERE sno=new.sno;

END;

  1. 测试:

INSERT INTO spj VALUES('S3','P1','J6',200);

实验结果:

  1. 添加新的属性列:

  1. 创建触发器:

  1. 测试:

结果分析:

插入了一条('S3','P1','J6',200);s表中的AvgQty数据列中的数据发生相应变化。

  1. 创建一个供应历史表hspj(sno,pno,jno,qty,username,modifydate),记录供应变化情况。实现这样的约束控制:如果spj表中的某条供应记录发生改变,就在hspj表中插入一行历史记录,其中username为操作的用户名,modifydate为操作的时间。

实验过程:

  1. 创建一个hspj表:

DROP TABLE  if EXISTS hspj;

CREATE TABLE hspj(

sno char(2),

pno char(2),

jno char(7),

qty INT,

username CHAR(20),

modifydate TIMESTAMP,

PRIMARY KEY(sno,pno,jno)

);

  1. 创建触发器:

CREATE TRIGGER spj_hspj

AFTER

INSERT on spj

FOR EACH ROW

BEGIN

INSERT into hspj() VALUES(new.sno,new.pno,new.jno,new.qty,CURRENT_USER,CURRENT_TIMESTAMP);

end;

  1. 测试:

INSERT INTO spj() VALUES('S7','P1','J2',200);

实验结果:

  1. 创建一个hspj表:

 

 (2)    创建触发器:

 (3)    测试:

结果分析:

        插入一条数据('S7','P1','J2',200);的时候,hspj表会插入一条操作的信息。

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
存储过程触发器是关系型数据库中的重要组成部分,它们可以帮助我们提高数据库的性能和数据的安全性。下面分别介绍一下存储过程触发器的概念和用途。 1. 存储过程 存储过程是一段预先编译好的 SQL 语句集合,它可以被多次使用,并且可以带参数。存储过程可以用于执行一些比较复杂的操作,例如查询多个表,更新多个表,或者执行多个操作的组合。 存储过程的好处在于: - 提高数据库性能:存储过程在数据库中预编译,可以减少数据库的负担,提高数据库的性能。 - 提高数据安全性:存储过程可以限制对数据库的访问权限,并且可以对数据进行验证和检查。 - 重用性:存储过程可以被多次使用,提高代码的重用性和可维护性。 2. 触发器 触发器是一种特殊的存储过程,它是在数据库发生特定事件时自动执行的。这些事件可以是 INSERT、UPDATE 或 DELETE 操作。触发器可以用于实现数据完整性、安全性和业务逻辑约束等方面。 触发器的好处在于: - 实现数据完整性:触发器可以在数据被写入数据库之前进行验证和检查,确保数据的完整性。 - 提高数据安全性:触发器可以限制对数据库的访问权限,并且可以对数据进行验证和检查。 - 自动化:触发器可以自动执行,减少手动干预的需要。 总之,存储过程触发器是关系型数据库中的重要组成部分,它们可以帮助我们提高数据库的性能和数据的安全性。在实际应用中,我们可以根据具体情况选择使用存储过程触发器来实现业务需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

简单点了

谢谢大佬

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值