数据库系统设计与实习 2010年9月
五.入库数量与仓位数转化的函数设计
功能要求:将入库的货物按照入库的数量转换成所要占据的仓位数的功能。
入口参数:入库数量 单位:吨 返回:仓位数 单位:个 仓位数的转换算法:
仓位数=ceiling(入库数量/仓位数)
脚本:
AmountConvert.sql
create function AmountConvert(@inputamount int ,@wamount int) --@inputmount:入库数量 --@wamount :仓位数 returns int As begin
return (ceiling(@inputamount/10)) end
test.sql
select Good.Gname,dbo.AmountConvert(Intoamount,Wamount) Input.Intoamount
from Good ,Input ,Warehouse
1
仓位数,
数据库系统设计与实习 2010年9月
六.存储过程
1.随机查看任意号码仓库的仓库信息,使用输入参数,创建一个存储过程
源程序:
Pro_2.test use cc go
create procedure pro_2 @wno char(2) as
select a.Wno ,a.Gno ,a.Gname,c.Oname,b.Gamount,b.Gstyle,b.Gprice,b.Gunite from Warehouse a,Good b,Owner c
where a.Gno=b.Gno and b.Oname=c.Oname and a.Gname=b.Gname and a.Wno=@wno
test1.sql
execute pro_2 'AA'
1
数据库系统设计与实习 2010年9月
七. 触发器
1.实现修改现存货物数量的触发器
实现功能:当货物出库时,在货物表中的剩余货物数量可以自动修改。
t.sql
alter table Good add Rest int null
the_rest.sql
create trigger the_rest on Outt
for insert,update,delete as
declare @therest int
declare @Gno char(6),@Gname varchar(10)
--declare insert_cursor cursor for select Gno ,Gname from inserted declare delete_cursor cursor for select Gno ,Gname from deleted begin
open delete_cursor
fetch next from delete_cursor into @Gno,@Gname while @@fetch_status=0 begin
set @therest=(select Good.Gamount-Outt.Oamount from Good,Outt
where Good.Gno=Outt.Gno and Outt.Gno=@Gno and Good.Gname=@Gname ) update Good set Rest=@therest where Gname=@Gname and Gno=@Gno fetch next from delete_cursor into @Gno,@Gname end
close delete_cursor deallocate delete_cursor
/*if update(Oamount) begin
open insert_cursor
fetch next from insert_cursor into @Gno,@Gname while @@fetch_status=0 begin
set @therest=(select Good.Gamount-Outt.Oamount from Good,Outt
1
数据库系统设计与实习 2010年9月
where Good.Gno=Outt.Gno and Outt.Gno=@Gno and Good.Gname=@Gname ) print str(@therest)+'delete'+'mmm'+@Gno+@Gname
update Good set Rest =@therest where Gno=@Gno and Gname=@Gname fetch next from insert_cursor into @Gno,@Gname end
close insert_cursor deallocate insert_cuosor end */ end
execute1.sql
update Outt set Oamount =70
where Wno='CC' and Gno='CC2000' and Gname='钢铁'
execute2.sql
update Outt set Oamount =70
where Wno='AA' and Gno='AA1000' and Gname='水泥'
2. 不准修改的货主姓名的触发器
T2.sql
/*不准修改的货主姓名的触发器*/ create trigger [修改货主姓名] on Good for update as
if update(Oname) begin
rollback transaction
raiserror('不能修改货主姓名',16,10) end
test2.sql
update Good set Oname='王五'
where Gno='AA1000' and Gname='水泥'
1
数据库系统设计与实习 2010年9月
附录A:
设计所用结构表
1.Warehouse 仓库 说明 仓库号 货物号 货物名 仓库名 仓位数 面积 负责人编号 负责人姓名 字段名称 Wno Gno Gname Wname Wamount Warea Rno Rname 数据类型 Char(2) Char(6) Varchar(10) Varchar(16) int 约束 P F F 备注 Numeric(3,1) Varchar(8) Varchar(8) 2.Goods货物 说明 货物号 字段名称 Gno Gname Checker Oname Gamount Gstyle Gunite 数据类型 Char(6) Varchar(10) Varchar(8) Varchar(8) Int 约束 P P F F 备注 前2位为仓库号,后4位物品编号 货物名 审核人 货主姓名 货物数量 货物类型 单位 Varchar(20) Char(1) 1