set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
-- 商品出货
-- 返回: -1 数据 overflow
ALTER PROCEDURE [dbo].[ap_PopPro]
@pro_id int, --产品ID
@wh_id int, --仓库号
@num int --出库数量
AS
BEGIN
declare
@pos1 int, --起始位置
@pos2 int, --可放位置
@curPos int, --当前位置
@totNum int, --总的数量
@curNum int , --当前位置的数量
@curtotNum int, --当前商品总数量
@totPrice money, --总的出货价
@curPrice money --当前批的出货价
declare
@sqlCmd nvarchar(200),
@fldNum varchar(10),
@fldPrice varchar(10)
--初始化出货总价
set @totPrice = 0
--查找对应产品的记录
select @pos1 = pos1, @pos2 = pos2, @totNum = totNum
from whproduct
where pro_id = @pro_id and wh_id = @wh_id
if @totNum < @num --产品数量不够,刚退出
begin
print 'The number of the product is not enough'
return -1
end
laber1:
set @fldNum = 'num' + Convert(varchar(2), @pos1) --得到当前num字段
set @fldPrice = 'price' + Convert(varchar(2), @pos1)
set @sqlCmd = 'select ' + '@curNum ='+ @fldNum+ ' ,@curtotNum = totNum'
+ ',@curPrice='+@fldPrice +' from whproduct where pro_id = @pro_id and wh_id = @wh_id'
exec sp_executesql @sqlCmd,N'@curNum int output ,@curtotNum int output, @curPrice money output ,@pro_id int,@wh_id int',@curNum output ,@curtotNum output,@curPrice output,@pro_id,@wh_id
set @curPos = @pos1 --一开始的初始化curPos 与@pos1相等,用于后面价格是否需要置0做准备
if @curNum >=@num --当前位置的商品数量大于或等于要求的数量时
begin
set @curNum = @curNum - @num
set @curtotNum = @curtotNum - @num
set @totPrice = @totPrice + @curPrice*@num
set @num = 0 --取出数量全总,所以设为0
if @curNum = 0
begin
set @pos1 = @pos1 +1
end
end
else --当前位置的商品数量小于要求的数量时
begin
set @num = @num - @curNum
set @totPrice = @totPrice + @curPrice*@curNum
set @curtotNum = @curtotNum - @curNum
set @curNum = 0
set @pos1 = @pos1 + 1
end
if @curPos != @pos1 --当发现当前位置的商品都被取光的时候,该位置的进货价格清0
begin
set @fldPrice = 'price' + Convert(varchar(2), @curPos)
set @sqlCmd = 'update whProduct set ' + @fldprice + ' = ' + Convert(varchar(10), 0)
+' where pro_id = @pro_id and wh_id = @wh_id'
exec sp_executesql @sqlCmd, N'@wh_id int, @pro_id int', @wh_id, @pro_id
end
if @pos1 = @pos2 --当位置1到达位置2时,也就相当于仓库里面没货了,这时应该把@pos1返回
begin
set @pos1 = 1
set @pos2 = 1
end
--当前位置被置0后,修改数据表中的值
set @sqlCmd = 'update whProduct set pos1 = ' + Convert(varchar(2), @pos1) + ',pos2 = ' + Convert(varchar(2), @pos2) +', totNum = '
+ Convert(varchar(5), @curtotNum) + ',' + @fldNum +'='+ Convert(varchar(5), @curNum)+
' where pro_id = @pro_id and wh_id = @wh_id'
exec sp_executesql @sqlCmd, N'@wh_id int, @pro_id int', @wh_id, @pro_id
if @num != 0
begin
goto laber1 --如果需要的商品数量还没有得到,则回到前面部分,进而得到循环的目的
end
print '出货成功--'
print '出货数量为:'
print @totNum - @curtotNum
print '出货总价为:'
print @totPrice
END
分享到:
相关推荐
总结来说,这个作业涵盖了数据库完整性中的数据统计分析、存储过程的创建与执行,以及数据类型的转换。这些知识点在实际的数据库管理与应用中非常常见,理解和掌握这些技能对于数据库开发者和管理员至关重要。
### 触发器、存储过程等上机作业 #### 知识点1:创建存储过程——统计特定条件下的学生人数 在SQL Server中,存储过程是一种预编译的SQL语句集合,它能够提高数据库应用系统的性能,并简化复杂的业务逻辑处理。本...
根据提供的文件内容,本篇实验报告主要围绕MySQL数据库中存储过程和函数的应用,涵盖了创建存储过程、函数、游标以及异常处理等高级特性。下面将详细解析报告中的每个知识点。 1. 创建存储过程 存储过程是一种在...
实验9主要围绕存储过程的创建、使用、查看、修改和删除等核心概念展开,这是数据库管理系统中的重要组成部分,尤其在SQL Server中具有广泛的应用。存储过程是一组预先编写的SQL语句,它允许用户像调用函数一样重复...
实验六的目的是深入理解并掌握SQL Server中的存储过程和触发器。存储过程是预编译的SQL语句集合,它们可以被多次调用,提高了代码的重用性和执行效率,同时降低了网络流量。以下是关于存储过程和触发器的详细解释: ...
### 自动备份SQL Server数据库的作业的脚本及存储过程详解 #### 一、背景介绍 在企业级应用中,数据库备份是一项非常重要的任务。它不仅能够帮助组织防止数据丢失,还能确保数据的一致性和可用性。对于SQL Server...
2. **创建调度器作业**:接下来,我们需要使用DBMS_SCHEDULER来创建一个作业,该作业将在指定的时间调用我们的存储过程。下面是如何创建一个作业的示例: ```sql BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name => ...
### Oracle 存储过程 + 日期 + 定时任务 Job #### 一、概述 在 Oracle 数据库中,存储过程是一种可编程的对象,用于执行特定的任务。存储过程可以在数据库服务器上运行,从而提高应用程序的性能并减少网络流量。...
视图,触发器,存储过程,ER图.sqlserver数据库实训,广告公司管理系统,sqlsever数据库大作业,包括增删改查。。视图,触发器,存储过程,ER图.sqlserver数据库实训,广告公司管理系统,sqlsever数据库大作业,包括...
Oracle作为一个强大的关系型数据库管理系统,不仅提供了数据存储和查询的功能,还允许我们通过存储过程来执行更复杂的业务逻辑。本话题将详细探讨如何在Oracle存储过程中调用外部的批处理脚本,如Windows系统的BAT...
【存储过程概述】 存储过程是数据库管理系统中的一种重要特性,它是预先定义并编译好的一组SQL语句,存储在数据库中以供重复调用。在SQL Server中,存储过程有诸多优点,包括: 1. **注册在服务器上**:存储过程在...
存储过程中查找关键字,存储过程,关键字,查询存储过程关键字
教程\存储过程和触发器.ppt
这通常包括但不限于运行SQL脚本、存储过程或其他管理任务。以下将详细解释如何设置SQL Server定时作业。 1. **新建作业** - 在SQL Server Management Studio (SSMS)中,首先导航至“管理”菜单,然后选择“SQL ...
11.6.3 用于维护作业的存储过程 11.6.4 操作员和报警 11.7 SQL Server和Web 11.7.1 Web Assistan 11.7.2 Web任务存储过程 11.7.3 sp_makewebtas 11.7.4 sp_runwebtas 11.7.5 sp_dropwebtas 11.7.6 Web页模板 11.8 串...
在IT行业中,"job调用的存储过程"是一个常见的数据库管理任务,主要涉及数据库调度和自动化操作。这里我们将深入探讨这个主题,以及与之相关的标签"job",并结合提供的压缩包子文件名称来推测可能的应用场景。 首先...
"基于SQL Server作业扩展存储过程实现数据库自动远程备份.pdf" 数据库自动远程备份是数据库管理中非常重要的一环,尤其是在大型企业中,数据的安全和可靠性对业务的影响非常大。如果数据库发生崩溃或遭受攻击,导致...
存储过程 自定义函数 作业 - 参考答案.sql
设计一个可变式分区分配的存储管理方案。并模拟实现分区的分配和回收过程。假设初始状态下,可用的内存空间为640KB,并有下列的请求序列: 作业1申请130KB 作业2申请60KB 作业3申请100KB 作业2释放60KB 作业4申请200...