一、运行环境说明
1、电脑环境:win10
2、数据库软件:SQL Server 2008 R2
二、经典例题原型
题目1:设有一个 SPJ 数据库,包括 S、P、J 及 SPJ 4 个关系模式:
S (SNO,SNAME,STATUS,CITY) ;
P (PNO,PNAME,COLOR,WEIGHT) ;
J (JNO,JNAME,CITY) ;
SPJ (SNO,PNO,JINO,QTY) ;
应商表 S 由供应商代码(SNO)、供应商姓名(SNAME)、供应商状态(STATUS)、供应商所在城市(CITY)组成。
零件表P由零件代码(PNO)、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT)组成。
工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成。
供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成,表示某供应商供应某种零件给某工程项目的数量为QTY。
题目2:商品出库表、入库表、库存表的设计
三、经典例题
1、创建一个存储过程,以供应商号为参数,输出该供应商所在城市,如果不存在该供应商,则显示“该供应商不存在!”。
create procedure SNO_CITY @SCITY nchar(4) output,@SNO char(2)
as
if exists (select * from S where SNO=@SNO)
select @SCITY=CITY
from S
where SNO=@SNO;
else print'没有该供应商'
2、创建一个函数,以供应商号为参数,返回该供应商供应零件的总数量。如果不存在该供应商,则返回-100;如果该供应商没有供应零件,返回0。
create function SN0_QTY(@SNO CHAR(4))
returns INT
as
begin
declare @result INT
if not exists (select * from SPJ where SNO= @Sno)
set @result=-100
else
if not exists (select PNO from SPJ where SNO= @Sno)
set @result=0
else
select @result=QTY from SPJ where SNO= @SNO
return @result
end
3、创建一个存储过程,以SNO、PNO、JNO、QTY作为参数,将SPJ表该供应记录的供应量值修改为QTY。如果修改成功,则显示“修改成功!” ;如果不存在该供应记录,则显示“没有修改任何数据!”。
create procedure SNO_CITY2 @SNO char(4),@PNO char(4),@JNO char(4),@QTY smallint
as
if not exists (select * from SPJ where SNO=@SNO and PNO=@PNO and JNO=@JNO and QTY=@QTY)
print'没有修改任何数据'
else
update SPJ
set QTY=@QTY;
print '修改成功'
(4) 创建入库表、出库表、库存表:
create table tab_rk
(spbh int,rkrq datetime,rksl int);
create table tab_ck
(spbh int,ckrq datetime,cksl int);
create table tab_kc
(spbh int, kcsl int);
(4)在入库表上创建一个插入触发器,实现库存表的自动更新。
create trigger tab_rk_insert on tab_rk --入库表插入,库存表更新
for insert
As
declare @spbh int
declare @rksl int
set @spbh=(select spbh from inserted)
set @rksl=(select rksl from inserted)
if not exists(select * from tab_kc where spbh=@spbh)
begin
insert into tab_kc
values(@spbh,@rksl);
return;
end
update tab_kc
set kcsl=kcsl+@rksl
where spbh=@spbh;
(5)在入库表上创建一个删除触发器,实现库存表的自动更新。
create trigger tab_rk_delete on tab_rk
for delete
as
declare @spbh int
set @spbh=(select spbh from deleted)
begin
delete from tab_kc
where spbh=@spbh;
end
(6)在入库表上创建一个修改触发器,实现库存表的自动更新。
create trigger tab_rk_update on tab_rk
for update
as
declare @spbh int
declare @rksl int
set @spbh=(select spbh from deleted)
set @rksl=(select rksl from inserted)
begin
update tab_kc
set kcsl=@rksl
where spbh=@spbh;
end
(7)在出库表上创建一个插入触发器,实现库存表的自动更新。
create trigger tab_ck_insert on tab_ck
for insert
as
declare @spbh int
declare @cksl int
set @spbh=(select spbh from inserted)
set @cksl=(select cksl from inserted)
if exists(select * from tab_kc where spbh=@spbh)
begin
update tab_kc
set kcsl=kcsl-@cksl
where spbh=@spbh;
end
(8)在出库表上创建一个删除触发器,实现库存表的自动更新。
create trigger tab_ck_delete on tab_ck
for delete
as
declare @spbh int
declare @cksl int
set @spbh=(select spbh from deleted)
set @cksl=(select cksl from deleted)
begin
update tab_kc
set kcsl=kcsl+@cksl
where spbh=@spbh;
end
(9)在出库表上创建一个修改触发器,实现库存表的自动更新。
create trigger tab_ck_update on tab_ck
for update
as
declare @spbh int
declare @cksla int
declare @ckslb int
set @spbh=(select spbh from deleted)
set @cksla=(select cksl from deleted)
set @ckslb=(select cksl from inserted)
begin
update tab_kc
set kcsl=kcsl+@cksla-@ckslb
where spbh=@spbh;
end
不足之处请大家多多批评指正!!!如有借鉴请评论和点赞!!!