首页 > 其他 > 详细

函数,游标与存储过程的综合应用

时间:2017-02-24 16:10:18      阅读:217      评论:0      收藏:0      [点我收藏+]

--在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

函数,游标与存储过程的综合应用

原文:http://www.cnblogs.com/zhouqiang0701/p/6438863.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!