实验五 存储过程和触发器

一.实验目的

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

二. 实验内容

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

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

实验过程:

  • 创建存储过程:
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;
  • 调用InsertS
call InsertS('S8','精益',50,'北京');

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

实验过程:

  • 创建存储过程:
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;
  • 调用QuerySPJ,查询J4
SET @count=0;
call QuerySPJ('J4',@count);
SELECT @count;

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

实验过程:

  • 删除外键:

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;

可视化界面:

右键设计表,把外键删掉就可以了

  • 创建触发器:
CREATE TRIGGER delete_spj
AFTER
DELETE on s
for each ROW
BEGIN
DELETE FROM spj WHERE SNO=OLD.SNO;
END;
  • 再运行删除语句:
DELETE from s where SNO='S3';

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

实验过程:

  • 添加新的属性列:
alter table s add avgQty DOUBLE (10,0);
  • 创建触发器:
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;
  • 测试:
INSERT INTO spj VALUES('S3','P1','J6',200);

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

实验过程:

  • 创建一个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)
);
  • 创建触发器:
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;
  • 测试:
INSERT INTO spj() VALUES('S7','P1','J2',200);

实验存储过程触发器与索引 一、实验目的 1.熟悉大型数据库实验环境,以MS SQL SERVER为例; 2.掌握视图; 3.掌握存储过程触发器; 4.掌握MS SQL SERVER的导入和导出; 5.掌握MS SQL SERVER的索引。 二、实验内容 (1)使用“实验一”中的数据库“abc”,创建一个视图,生产厂家为“北京”且价格低于北京生产的产品的平均价格,输出产品的名称、价格和生产厂家。 (2)使用“实验一”中的数据库“abc”,创建一个带有输入参数的存储过程proc_abc,查询指定职工的销售记录,用户输入职工编号,存储过程返回职工名称、产品名称、销售日期、销售数量,假如执行存储过程时所提供的“职工编号”不存在,存储过程应给予一定的提示。 (3)使用“实验一”中的数据库“abc”,练习使用游标, 写出按如下报表形式显示结果的SQL语句,该报表查询每年每种产品总销售金额,(总销售金额=价格*销量),报表显示格式如下所示: 年 产品号 产品名 销售总量 总销售金额(万元) 2001年 2 AAA 590 3.2 2001年 5 BBB 644 23.3 2002年 1 CCC 32 0.2 (4)使用“实验一”中的数据库“abc”,练习使用触发器,在销售表上创建触发器tr_updateprice,每次新增销售记录时,自动更新产品表的单价,更新方法是:每增加一笔销售记录,就将该产品的单价减去1块钱。 (5)将100万行网络连接监控数据Netflow导入数据库,创建多个索引,观察创建索引对数据库文件大小的影响;并设计不同的查询语句来观察索引对查询效率的影响;可以尝试将100万行记录扩展为1000万行,然后再做索引和查询的实验?文件见附件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值