数据库实验系列之3存储过程和触发器实验(至少包括完整的调试通过的8个存储过程和5个触发器)
数据库实验系列之3存储过程和触发器实验(至少包括完整的调试通过的8个存储过程和5个触发器)
目录
- 实验9:存储过程实验
- 实验10:触发器实验
实验9:存储过程实验
自拟题目完成8个存储过程的编写及调试,熟练掌握存储过程的使用。也可采用下图中作业上的题目。
SQL语句代码
--1.例1use 学生作业管理数据库;select * from 学生表;select * from 课程表;select * from 学生作业表;--先查看是否存在名字为student_course的存储过程,如果有,删除if exists (select name from sysobjects where name='student_course' and type='P')drop procedure stuent_course;--创建存储过程create procedure student_courseas select 学生表.学号,姓名,课程名,作业1成绩 from 学生表,课程表,学生作业表 where 学生表.学号=学生作业表.学号 and 课程表.课程号=学生作业表.课程号 and 姓名='张艳'--执行存储过程execute student_course;--带输入参数的存储过程create procedure student_course1@Studentname varchar(10)as select 学生表.学号,姓名,课程名,作业1成绩 from 学生表,课程表,学生作业表 where 学生表.学号=学生作业表.学号 and 课程表.课程号=学生作业表.课程号 and 姓名=@Studentname;--调用student_course1execute student_course1 '于兰兰';--创建一个存储过程用于向学生表中插入记录create procedure student_insert@学号 int,@姓名 nvarchar(10),@性别 nvarchar(2),@专业班级 nvarchar(10),@出生日期 nvarchar(20),@联系电话 nvarchar(20)as INSERT into 学生表 values(@学号,@姓名,@性别,@专业班级,@出生日期,@联系电话);--执行student_insertexecute student_insert '007','阿刚','男','电子06','2000-1-1','13333333333';--创建存储过程,若没有给出学生姓名,则返回所有学生情况create procedure student_course2@StudentName nvarchar(20)=nullas if @StudentName is null begin select 学生表.学号,姓名,课程名,作业1成绩 from 学生表,课程表,学生作业表 where 学生表.学号=学生作业表.学号 and 课程表.课程号=学生作业表.课程号 end else begin select 学生表.学号,姓名,课程名,作业1成绩 from 学生表,课程表,学生作业表 where 学生表.学号=学生作业表.学号 and 课程表.课程号=学生作业表.课程号 and 姓名=@Studentname; endexecute student_course2 '张志国';execute student_course2; --使用默认参数值--使用输出参数CREATE procedure student_count@CourseName varchar(20),@StudentSum int outputas select @StudentSum=COUNT(*) from 课程表,学生作业表 where 课程表.课程号=学生作业表.课程号 and 课程名=@CourseName;--对于带有输出参数的存储过程,调用时需要定义相应的变量用于接收从存储过程返回的参数值declare @StudentSum1 int;execute student_count '数据结构',@StudentSum1 OUTPUT;SELECT @StudentSum1 as 选数据结构的人数;--创建一个存储过程,输出学生的基本情况alter procedure student_query@学号 int,@姓名 nvarchar(8) output,@性别 char(2) outputas select @姓名=姓名,@性别=性别 from 学生表 where 学号=@学号;--调用存储过程,查看基本情况declare @姓名1 nvarchar(20);declare @性别1 char(2);execute student_query '7',@姓名1 output,@性别1 output;select @姓名1 as 学生姓名,@性别1 as 学生性别;select * from 学生表;--删除存储过程是--drop procedure 存储过程名;--market数据库中use market;--存储过程shanghai,查看上海客户信息select * from Customers;insert into Customers VALUES(3,'阿美','上海');create procedure shanghai as select * from Customers where City='上海'execute shanghai;--存储过程Goods,查看指定商品信息,商品编号作为输入参数select * from Goods;insert into Goods values(1,'牙膏',2.5,'牙膏厂',400,'在售');insert into Goods values(2,'牙刷',5,'牙刷厂',1200,'热卖');create procedure cunchuGoods@商品编号 intas select * from Goods where GoodID=@商品编号;execute cunchuGoods @商品编号=2;--存储过程GoodsSum,查看指定客户的所有订单的订货总金额,客户编号作为输入参数,订货总金额作为输出参数select * from Orders;insert into Orders values(1,1,1,2,5,'2020-1-1');insert into Orders values(2,1,2,2,10,'2020-1-1');insert into Orders values(3,2,2,2,10,'2020-1-1');create procedure cunchuGoodsSum@客户编号 int,@订货总金额 float outputas select @订货总金额=OrderSum from Orders where Orders.CustomerID=@客户编号;declare @订货总金额 float; --切记勿忘声明变量execute cunchuGoodsSum 2,@订货总金额 output;select @订货总金额 as '订货总金额';--存储过程insert_Goods,向Goods表中插入一条记录select * from Goods;alter procedure insert_Goods@商品编号 int,@商品名称 nvarchar(20),@价格 float,@供货商 nvarchar(20),@库存量 int,@商品状态 nvarchar(20)as insert into Goods(GoodID,Gname,Price,Provider,Stocks,Status) values(@商品编号,@商品名称,@价格,@供货商,@库存量,@商品状态);execute insert_Goods 3,'牙刷杯',10,'牙刷杯厂',5,'即将断货';--创建存储过程Goods_Orders1,查看任何指定货品的订单情况,包括订单号,订货客户姓名以及订货数量(使用输入参数)select * from Orders;select * from Goods;select * from Customers;CREATE procedure Goods_Orders1@指定货品 nvarchar(20)as select OrderID,Cname,Quantity from Orders,Goods,Customers where Orders.GoodID=Goods.GoodID and Orders.CustomerID=Customers.CustomerID AND Goods.Gname=@指定货品;EXECUTE Goods_Orders1 @指定货品='牙膏';--执行存储过程,如果不给出参数则报错,如果希望不输入参数,即默认值,得到所有货品订单,则新建表Goods_Orders2execute Goods_Orders1 @指定货品; --报错create procedure Goods_Orders2@指定货品 nvarchar(20)=nullas if @指定货品 is null begin select OrderID,Cname,Quantity from Orders,Goods,Customers where Orders.GoodID=Goods.GoodID and Orders.CustomerID=Customers.CustomerID end else begin select OrderID,Cname,Quantity from Orders,Goods,Customers where Orders.GoodID=Goods.GoodID and Orders.CustomerID=Customers.CustomerID AND Goods.Gname=@指定货品 endexecute Goods_Orders2;execute Goods_Orders2 @指定货品='牙刷';--创建存储过程Goods_OrderSum,来获得某个货品的订单总额(使用输入输出参数)alter PROCEDURE Goods_OrderSum@货品名称 nvarchar(20),@订单总额1 float outputas select @订单总额1=sum(OrderSum) from Orders,Goods where Goods.GoodID=Orders.GoodID and Gname=@货品名称;declare @订单总额1 float;execute Goods_OrderSum '牙膏',@订单总额1 output;select @订单总额1 as '订单总额';
实验10:触发器实验
自拟题目完成5个触发器的编写及调试,熟练掌握触发器的使用。也可采用下图中作业上的题目。
SQL语句代码
use 学生作业管理数据库;--例8 创建一个触发器,当 学生表 中的记录被更新时,显示表中的所有记录create trigger student_change on 学生表 after insert,update,delete as select * from 学生表;--查看下变化select * from 学生表;insert into 学生表 values(1,'阿美','女','计科06','2002-1-1','13312313213');--例9 在 学生表 中创建DELETE触发器,实现对 学生表 和 学生作业表 的级联删除create trigger studentdelete on 学生表 after deleteas delete from 学生作业表 where 学号 in (select deleted.学号 from deleted);--查看下变化select * from 学生作业表;insert into 学生作业表 values('K001',1,99,99,99);select * from 学生作业表;delete from 学生表 where 姓名='阿美';select * from 学生作业表;--例10 在学生作业表上创建insert 触发器,当向学生作业表 中添加学生的选课记录时,--检查该学生的学号是否存在,若不存在,则不能将记录插入create trigger sc_insert on 学生作业表 after insertas if(select count(*) from 学生表,inserted where 学生表.学号=inserted.学号)=0 begin print '学号不存在,不能插入' rollback transaction end;--查看效果insert into 学生作业表 values('K001',1,99,99,99);--例11 创建update触发器,禁止对学生表 中学生的性别进行修改create trigger student_update on 学生表 after updateas if update(性别) begin print '禁止对学生学号修改' rollback transaction end;--查看效果select * from 学生表;update 学生表 set 性别='男' where 性别='女' and 学号=7;select * from 学生表;--例12 在学生作业表上创建触发器,当一次向学生作业表中添加多个记录时,删除学号在学生表中不存在的记录,--从而保证数据的一致性,注意,不能在学生作业表中定义外键约束create trigger sc_insert1 on 学生作业表 after insertas if(select count(*) from 学生表,inserted where inserted.学号=学生表.学号)<>@@ROWCOUNT BEGIN delete from 学生作业表 where 学号 not in (select 学号 from 学生表) END;--例13 在视图上定义instead of 触发器select * from 学生表;create view birth_view(学号,姓名,性别,生日,专业班级)as select 学号,姓名,性别,出生日期,专业班级 from 学生表;create trigger birth_view_insert on birth_viewinstead of insertas declare @学号 int declare @姓名 varchar(20); declare @性别 varchar(20); declare @生日 varchar(20); declare @专业班级 varchar(20); select @学号=学号,@姓名=姓名,@性别=性别,@专业班级=专业班级 from inserted; insert into 学生表(学号,姓名,性别,专业班级) values(@学号,@姓名,@性别,@专业班级);--查看效果insert into birth_view(学号,姓名,性别,专业班级) values(2,'阿红','女','软件04');use market;--第四章第五题(5)在Customers表上建立删除触发器,实现Customers表和Orders表的级联删除select * from Customers;select * from Orders;create trigger customers_delete on Customers after deleteas delete from Orders where CustomerID in (select deleted.CustomerID FROM DELETED);--第四章第五题(6)在Orders表上建立插入触发器,当向表中添加一条订货记录时,若订单中的商品状态为即将断货(Status='即将断货')--则不能插入该条记录select * from Customers;select * from Orders;select * from Goods;CREATE trigger orders_insert on Orders AFTER INSERTAS if(select Status from Goods,inserted where Goods.GoodID=inserted.GoodID) in ('即将断货') begin print '即将断货,不能订购' rollback transaction end; --试试效果insert into Orders values(4,3,3,2,20,'2020-2-2');--第四章第五题(7)在Orders表上建立插入触发器,当添加订单时,减少Goods表中相应商品的库存量select * from Customers;select * from Orders;select * from Goods;create trigger orders_insert1 on Ordersafter insertas UPDATE Goods SET Stocks=Stocks-inserted.Quantity FROM Goods,inserted WHERE Goods.GoodID=inserted.GoodID; --第四章第五题(8)在Orders表上建立触发器,不允许对订单日期进行修改select * from Customers;select * from Orders;select * from Goods;CREATE TRIGGER orders_create ON Orders AFTER UPDATEas IF UPDATE(Date) BEGIN RAISERROR('不能手动修改',10,1) ROLLBACK TRANSACTION END;--第四章第五题(9)建立触发器,实现参照完整性约束,即若在Orders表中添加一条记录时,则该订单中的商品也必须在--Goods表中存在,否则不许添加该记录;select * from Customers;select * from Orders;select * from Goods;CREATE TRIGGER orders_create1 ON Orders AFTER INSERTAS IF (SELECT COUNT(*) from Goods,inserted WHERE Goods.GoodId=inserted.GoodID)=0 BEGIN print '这种货物不存在' rollback transaction END;
No comments:
Post a Comment