--在TOY数据库中完成以下操作
use toy
go
--1、编写一个存储过程,接收任意一个订单号,打印订单的表头数据。格式如下:
--(其中订单编号由订单日期+订单号的字符串组成)
--订单编号:20010520000001 订货日期:2001-05-20 订货人:拉尔森
create procedure proc_order
(@orderid as varchar(6))
as
begin
declare @ord varchar(6),@name varchar(10),@time datetime
select @ord=[定单号],@name=[名],@time=[定单日期] from [dbo].[定单],[dbo].[购物者]
where [dbo].[定单].购物者号=[dbo].[购物者].购物者号 and [定单号]=@orderid
print '订单编号:'+Convert(varchar(12),@time,112)+@orderid+' 订货日期:'+Convert(varchar(10),@time,120)+' 订货人:'+@name
end
go
execute proc_order '000001'
go
--2、编写一个存储过程或函数,接收订单号、玩具号、输出该订单中该种玩具的销售金额。
--其中,玩具的销售金额=玩具单价* 订单中玩具的购买数量*折扣率,折扣率的处理规则如下:
--玩具的销售金额 折扣
------------------------------------------------------------
--[0-30) 1.0
--[30-50) 0.9
--[50-100) 0.8
--[100以上 0.7
create proc proc_dis
(@orderid varchar(6),@wjid varchar(6),@salemoney decimal(8,2) output)
as
begin
declare @money decimal(8,2);
select @money=价格*购买数量 from [dbo].[玩具],[dbo].[定单详情] where [dbo].[玩具].玩具号=[dbo].[定单详情].玩具号
and [定单详情].定单号=@orderid and [定单详情].玩具号=@wjid
select @salemoney=@money*
case when @money<30 then 1.0
when @money>=30 and 价格<50 then 0.9
when @money>=50 and 价格<100 then 0.8
when @money>100 then 0.7
end from [dbo].[玩具],[dbo].[定单详情] where [dbo].[玩具].玩具号=[dbo].[定单详情].玩具号
and [定单详情].定单号=@orderid and [定单详情].玩具号=@wjid
end
go
declare @salemoney decimal(8,2)
execute proc_dis '000001','000007',@salemoney output
select @salemoney
go
--3、编写一个存储过程,接收一个订单号,调用上述存储过程打印输出该订单下的所有玩具的明细信息。例如:输入订单号000001,则打印格式如下:
--玩具编号 玩具名称 购买数量 单价 金额
-------- ------------------------------ -------- ------ ------
--000007 tie dye kit?工具箱 2 20 36
--000008 爱丽丝奇境记 1 15 15
create proc proc_dtinfo
(@orderid varchar(6))
as
begin
print '玩具编号 玩具名称 购买数量 单价 金额 '
print '-------- ----------------------- -------- ------ ------'
declare @wjid varchar(6),@wjname varchar(20),@num int,@price decimal(8,2)
declare cur cursor
for select [玩具].玩具号 from [定单详情],[玩具] where [定单详情].玩具号=[玩具].玩具号 and [定单详情].定单号=@orderid
open cur
fetch next from cur into @wjid
while @@fetch_status=0
begin
declare @salemoney decimal(8,2)
execute proc_dis @orderid,@wjid,@salemoney output
select @wjname=[玩具].玩具名,@num=[定单详情].购买数量,@price=[玩具].价格,@salemoney=@salemoney from [定单详情],[玩具] where [定单详情].玩具号=[玩具].玩具号
and [定单详情].定单号=@orderid and [玩具].玩具号=@wjid
print @wjid+' '+@wjname+' '+str(@num)+' '+Convert(varchar(10),@price)+' '+Convert(varchar(10),@salemoney)
fetch next from cur into @wjid
end
close cur
deallocate cur
end
go
exec proc_dtinfo '000001'
go
--4、编写一个存储过程,接收一个订单号,计算出该订单的总金额,并输出。(总金额=该订单中所有玩具的销售金额+订单的运输费用)。
create proc p_sum
(@orderid varchar(6))
as
begin
declare @ysmoney decimal(8,2),@wjid varchar(6),@sum decimal(8,2)
set @sum=0;
select @ysmoney=[定单].运输价格 from [dbo].[定单] where [定单].定单号=@orderid
declare cur cursor
for select 玩具号 from [dbo].[定单详情] where [定单详情].定单号=@orderid
open cur
fetch next from cur into @wjid
while @@FETCH_STATUS=0
begin
declare @salemoney decimal(8,2)
execute proc_dis @orderid,@wjid,@salemoney output
set @sum=@sum+@salemoney;
fetch next from cur into @wjid
end
print '总金额:'+ltrim(str(@sum+@ysmoney));
close cur
deallocate cur
end
go
exec p_sum '000001'
go
--5、编写一个存储过程,接收一个订单号,打印出该订单的附加信息(包括:运送方式、接受者姓名、接受者地址、邮政编码和联系电话)。
--例如:输入订单号000001,则打印格式如下:
--运送方式:标准航运 运送金额:6
--接收者姓名:约翰逊
--接收者地址:美国加利福尼亚州桑德兰227 海滨大道.
--邮政编码:94087-1147
--电话号码:123-5673
create procedure proc_fjinfo
(@orderid varchar(6))
as
begin
declare @fsm varchar(10),@ysmoney decimal(8,2),@name varchar(20),@gjname varchar(20),@zname varchar(20),@city varchar(20),
@address varchar(200),@yb varchar(10),@phone varchar(10)
select @fsm=[运输方式].方式名,@ysmoney=运输价格,@name=[接受者].名,@gjname=[国家].国家名,@zname=[接受者].州,@city=[接受者].城市,
@address=[接受者].地址,@yb=[接受者].邮编,@phone=[接受者].电话 from [dbo].[定单]
inner join [dbo].[运输方式] on [dbo].[运输方式].方式号=[dbo].[定单].运输号
inner join [dbo].[接受者] on [dbo].[接受者].定单号=[dbo].[定单].定单号
inner join [dbo].[国家] on [dbo].[国家].国家号=[接受者].国家号 and 定单.定单号=@orderid
print '运送方式:'+@fsm+' '+'运送金额:'+ltrim(str(@ysmoney))
print '接收者姓名:'+@name
print '接收者地址:'+rtrim(@gjname)+ltrim(rtrim(@zname))+ltrim(rtrim(@city))+ltrim(@address)
print '邮政编码:'+@yb
print '电话号码:'+@phone
end
go
execute proc_fjinfo '000001'
go
--6、编写一个存储过程,接收一个订单号,调用上述的所有存储过程打印出订单的完整信息。格式如下:
--例如:输入订单号000001,则打印格式如下:
-- 订 货 单
--======================================================================
--订单编号:20010520000001 订货日期:2001-05-20 订货人:拉尔森
--======================================================================
--玩具编号 玩具名称 购买数量 单价 金额
-------- ------------------------------ -------- ------ ------
--000007 tie dye kit?工具箱 2 20 36
--000008 爱丽丝奇境记 1 15 15
--======================================================================
--运送方式:标准航运 运送金额:6
--接收者姓名:约翰逊
--接收者地址:美国加利福尼亚州桑德兰227 海滨大道.
--邮政编码:94087-1147
--电话号码:123-5673
--======================================================================
--总金额:57
create proc p_detail
(@orderid varchar(6))
as
begin
print ' 订 货 单 '
print '======================================================================'
exec proc_order @orderid
print '======================================================================'
exec proc_dtinfo @orderid
print '======================================================================'
exec proc_fjinfo @orderid
print '======================================================================'
exec p_sum @orderid
end
go
exec p_detail '000001'
go
--7、创建一个函数,根据所给玩具号及数量,计算应支付的金额。
create function fun_pay(@wjid varchar(6),@num int)
returns decimal(8,2)
begin
return @num*(select [价格] from [dbo].[玩具] where [玩具号]=@wjid)
end
go
select dbo.fun_pay('000007',2);
go
--8、创建一个函数,根据给定的订单号,求出该订单的详细购物情况(订单号、玩具名、数量)。
create function fun_detinfo(@orderid varchar(6))
returns table
as
return (select 定单号,玩具名,购买数量 from [dbo].[定单详情] inner join dbo.玩具 on dbo.玩具.玩具号=[定单详情].玩具号
where 定单号=@orderid)
go
select * from dbo.fun_detinfo('000001')
go