`

工作中的递归存储过程

阅读更多
CREATE procedure test107 @mtlno varchar(40),@flag bit=1
as
declare @materialbill varchar(8),--物料单号
	@alternativebom varchar(2),--物料替代号
	@configuration varchar(18), --物料对象号
	@bomcomponent varchar(40),
	@quantity NUMERIC(16,6),
	@classtype varchar(3),
	@isConfFlag varchar(1),
	@count int
--判断是否需要创建临时表
--这个临时表用于存储结果数据
if(@flag=1)
	create table #result (bomcomponent varchar(40),quantity NUMERIC(16,6),classtype varchar(3),isselect varchar(1),isvirtual varchar(1));

--主物料对象号,主物料单号,主物料替代
select top 1 @materialbill=a.materialbill,@alternativebom=a.alternativebom,@configuration=b.configuration
from N_BDMMaterToBOMLink a,(
select top 1 configuralbemtl ,configuration
from  N_MMRPLANTMTL 
where mtlno=@mtlno) b
where a.mtlno=b.configuralbemtl
--select @materialbill ,@alternativebom ,@configuration ;

--判断物料单号是否为空
if(@materialbill is not null)
begin
	--判断物料单号是否被删除
	if (select bomsdeletionindic from  N_bdmbomheader where materialbill=@materialbill and alternativebom=@alternativebom ) ='Y'
	begin
		--删除
		goto labelend;
	end
	else
	begin
		--未被删除
		--创建临时表 用于临时存储数据
		create table #thisbomlist (bomcomponent varchar(40),quantity NUMERIC(16,6),classtype varchar(3),isselect varchar(1),isvirtual varchar(1),speprocuretypefbomitem varchar(2));
		--向临时表插入数据 
		insert into #thisbomlist(bomcomponent,quantity,classtype,speprocuretypefbomitem) 
		(
			select bomcomponent,quantity,classtype,speprocuretypefbomitem
			from N_BDMBOMITEM where bomitemnodeno in 
				(select bomitemnodeno
					from N_BDMBOMSITEMSELECT where materialbill= @materialbill and alternativebom = @alternativebom)
			and materialbill = @materialbill
		)
		--select * from #thisbomlist;
		--选装件处理
		--创建临时表 临时存储特性信息
		create table #tmp (characterval varchar(30),intcharact varchar(10),signnumindic varchar(12));
		insert into #tmp(characterval,intcharact,signnumindic) 
		(
			select 
			charactvalue,intcharact,numberindic
			from 
			N_pcmibsymbol 
			where 
			numberindic in 
			(
				select 
				signnumindic 
				from 
				N_pcmexamchartrestrain 
				where 
				internalCfg = @configuration
				
			)
		)
		--select * from #tmp;
		--select * from #thisbomlist;
		declare cur cursor for
			select bomcomponent,classtype from #thisbomlist where classType is not null 
		open cur
		fetch next from cur into @bomcomponent,@classtype
		--
		while @@fetch_status = 0
			begin
				--判断该物料是否可以复选
				if((select top 1 multipleObjAllowed from n_pcmclasstypes where classType=@classType) <>'Y')
				begin
					delete  #thisbomlist  WHERE   CURRENT   OF   cur 
					fetch next from cur into @bomcomponent,@classtype
					continue
				end
				select top 1 @bomcomponent = configuration from n_PCMLinkBeInterNumAndObj  where keyobjclassified=@bomcomponent
				--判断该物料是否是下达状态
				if(exists (select top 1 classreleaseindi 
					from n_pcmclassificastatus 
					where classificastatus in (
						select distinct classificastatus 
						from n_pcmallocatableobjtoclass 
						where keyobjclassified=@bomcomponent  and classType = @classtype
						)
					and classType = @classtype and classreleaseindi <> 'Y')
				)
				begin
					delete  #thisbomlist  WHERE   CURRENT   OF   cur 
					fetch next from cur into @bomcomponent,@classtype
					continue
				end
				--判断是否存在与原特性值相匹配的值
				if(exists(select top 1 a.* from 
						(select intcharact,characterval from N_PCMCharacterVal 
						where keyobjclassified =@configuration and internalclassno in 
						(select internalclassno from N_pcmallocatableobjtoclass 
						where keyobjclassified=@configuration  and classType =@classtype)
						) a ,#tmp b 
					where a.intcharact=b.intcharact and a.characterval = b.characterval)
				)
				begin
					fetch next from cur into @bomcomponent,@classtype
					continue
				end
				
				delete  #thisbomlist  WHERE   CURRENT   OF   cur 
				
				fetch next from cur into @bomcomponent,@classtype
			end
		close cur
		deallocate cur
		--select * from #thisbomlist;
		--虚拟件处理
		--判断是否是虚拟件
		DECLARE cur2 CURSOR FOR
			select a.bomcomponent,a.quantity,a.classtype from 
			(
				select  bomcomponent,quantity,classtype,speprocuretypefbomitem from #thisbomlist where speprocuretypefbomitem <>'' or speprocuretypefbomitem is not null
				union
				select a.bomcomponent,a.quantity,a.classtype,bb.specprocuretype as speprocuretypefbomitem from #thisbomlist  a 
				join N_MMRPLANTMTL bb on a.bomcomponent=bb.mtlno
				where (bb.specprocuretype <>'' or bb.specprocuretype is not null)
			) a 
			,N_BDMSpecProcureKey b where  b.specprocuretype=a.speprocuretypefbomitem
			and b.phantomitemindic='Y'
		Open cur2
		FETCH NEXT FROM cur2 into @bomcomponent,@quantity,@classtype 
		WHILE @@FETCH_STATUS = 0
		BEGIN
		--select @bomcomponent;
		
		 if(@classtype is not null)
		 begin
		 	insert into #result (bomcomponent,quantity,classtype,isselect,isvirtual) values (@bomcomponent,@quantity,@classtype,'Y','Y')
			delete from #thisbomlist where bomcomponent = @bomcomponent;
		--虚拟件展开
			exec test107 @bomcomponent, 0
		 end
		 else
		 begin
			insert into #result (bomcomponent,quantity ,classtype,isselect,isvirtual) values (@bomcomponent,@quantity,@classtype,'N','Y')
			delete from #thisbomlist where bomcomponent = @bomcomponent;
		--虚拟件展开
			exec  test107 @bomcomponent, 0
		 end
		 FETCH NEXT FROM cur2 into @bomcomponent,@quantity,@classtype 
			
		END
		
		CLOSE cur2
		DEALLOCATE cur2	
		
		DECLARE cur3 CURSOR FOR
			select #thisbomlist.bomcomponent from #thisbomlist 
		Open cur3
		FETCH NEXT FROM cur3 into @bomcomponent
		WHILE @@FETCH_STATUS = 0
		BEGIN
		set @isConfFlag = (
				select top 1 N_MMRGenMtl.isConfFlag 
					from N_MMRGenMtl where N_MMRGenMtl.mtlno=@bomcomponent
				)
		 if(@isConfFlag ='Y')
			 begin
				set @count = 0
				declare cur4 cursor for
					select configuration from  n_MMRPLANTMTL where configuralbeMtl=@bomcomponent
				open cur4
				fetch next from cur4 into @configuration
				while @@fetch_status = 0
				begin
					if(exists (select signnumindic from #tmp where signnumindic in 
						(select signnumindic  from  n_PCMEXAMCHARTRESTRAIN where internalcfg=@configuration))
					)
					begin
						if(@count = 1)
						begin
							set @count=0
							break
						end
						set @count = 1
						set @bomcomponent = @configuration
					end
				fetch next from cur4 into @configuration
				end
				close cur4
				deallocate cur4
				--set @count = (select count(*) from (
				--	select distinct a.internalcfg from
				--	(
				--	select internalcfg,signnumindic  from  N_PCMEXAMCHARTRESTRAIN 
				--	where internalcfg in (select configuration from  N_MMRPLANTMTL where configuralbeMtl=@bomcomponent) and signnumindic in (select signnumindic from #tmp)
				--	) a 
				--	) b
				--	)
			--select @bomcomponent
			
				if(@count=1)
				begin
					set @bomcomponent =(select top 1 mtlno from  n_MMRPLANTMTL where configuration=@bomcomponent)
					-- (
					--select top 1 mtlno from N_MMRPLANTMTL where configuration = (select top 1 internalcfg from  N_PCMEXAMCHARTRESTRAIN 
					--		where internalcfg in (select configuration from  N_MMRPLANTMTL where configuralbeMtl=@bomcomponent) and signnumindic in (select signnumindic from #tmp)
					--		 )
					--)
					UPDATE  #thisbomlist   SET   bomcomponent   =  @bomcomponent WHERE   CURRENT   OF  cur3
				end
				
			 end
		 
		FETCH NEXT FROM cur3 into @bomcomponent
		END
		
		CLOSE cur3
		DEALLOCATE cur3

		
		insert into #result(bomcomponent,quantity,classtype,isselect,isvirtual)
		(
			select bomcomponent,quantity,classtype,(case when isselect is not null then 'Y' else 'N' end) isselect,isvirtual
			from #thisbomlist
		)

		--select * from #thisbomlist left join N_MMRGenMtl on N_MMRGenMtl.mtlno = #thisbomlist.bomcomponent
		--select * from #thisbomlist;
		drop table #tmp;
		drop table #thisbomlist;
	end
end

--删除临时表
--select * from #thisbomlist;
--select * from #tmp;


labelend:
--判断是否需要查询和删除临时表
if(@flag=1)
begin
	select * from #result;
	drop table #result;
end
GO



不知道有没有可以优化的空间
先将就用着
分享到:
评论

相关推荐

    一个递归调用的存储过程

    递归调用的存储过程是指该存储过程在其执行过程中会调用自身,形成一种自相似的结构,通常用于处理层次数据或者实现特定的算法。在给定的标题“一个递归调用的存储过程”中,我们可以推测这个存储过程利用了递归机制...

    存储过程递归查询

    2. **递归步**:递归过程中的核心部分,通过与递归基连接的方式逐步扩展结果集。 3. **连接条件**:用于确定递归步中如何与递归基进行关联,通常是根据父节点与子节点的关系进行匹配。 #### 六、递归查询的应用场景...

    mysql递归存储过程

    包括两个存储过程,一个是建立临时表用来存储需要的数据,另一个利用临时表进行操作。

    递归查询存储过程

    本文将详细解析一个具体的递归查询存储过程示例,并探讨其工作原理。 #### 二、递归查询存储过程示例分析 ##### 1. 存储过程定义 给定的存储过程名为`proc_wx_getuserlist`,它接收两个参数:`@nodeid`和`@uid`。...

    递归调用详解,分析递归调用的详细过程[参考].pdf

    程序员还必须确保递归函数不会随意改变静态变量和全局变量的值,以避免在递归下降过程中的上层函数出错。 递归调用可以解决许多问题,如求和、阶乘、斐波那契数列等。例如,求 1+2+⋯ ⋯ +100 的和,可以使用递归...

    mysql复杂存储过程实例(游标、临时表、循环、递归)

    本资源结合实例实现一个复杂的存储过程,存储过程中有用到游标、临时表、循环、递归等知识,sql文件附有实例数据表创建的sql语句。

    无限级分类的非递归实现(存储过程版)

    在上面的存储过程中,我们定义了一个游标`cur`来遍历当前层级的所有子分类,并通过递归调用`generate_tree`处理每个子分类的子分类,直到所有子节点都被访问到。这样,我们就能生成整个分类树,而无需实际执行递归...

    sqlserver中存储过程的递归调用示例

    以阶层为例子说存储过程中递归的调用。 递归 CREATE PROC [dbo].[usp_spFactorial] @InputValue INT, @OuputValue INT OUTPUT AS BEGIN DECLARE @InValue INT; DECLARE @OutValue INT; IF(@InputValue!=1) ...

    C#递归 C#递归 C#递归

    在每次循环迭代过程中,还会调用`AddReplies`方法来添加子节点。这个过程是递归的,因为它不断地调用自身来构建树的层次结构。 #### AddReplies() 方法 `AddReplies()` 方法负责向给定的父节点添加子节点。方法首先...

    abap简单递归算法

    ### ABAP简单递归算法解析 #### 一、引言 ABAP(Advanced Business ...通过上述分析,我们不仅了解了递归算法的工作机制,也熟悉了ABAP中递归函数的实现方法,这对于进一步学习和应用ABAP编程具有重要意义。

    ava中的递归的资源

    在Java编程语言中,递归是一种强大的编程技术,它指的是函数或方法调用自身的过程。递归可以帮助我们解决复杂的问题,通过将大问题分解为更小的子问题来简化问题解决。本文将深入探讨Java中递归的概念、工作原理、优...

    VB6.0过程的递归调用

    在编程领域,递归是一种强大的概念,它在VB6.0中同样得到了广泛的应用。递归调用是指在执行一个过程或函数时,该过程或函数又在其内部直接或间接地调用自身。这种调用方式可以解决某些复杂问题,如树遍历、分治策略...

    ackermann函数的递归实现和非递归实现

    非递归实现的基本思想是将递归调用转化为循环,并使用数据结构(如堆栈)存储中间结果,避免了递归带来的调用栈溢出问题。 非递归实现的步骤大致如下: 1. 初始化一个堆栈,用于保存待处理的阿克曼函数参数对`(m, ...

    递归算法与非递归转化

    (4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。 非递归算法的特点: 1. 非递归算法是采用循环或者栈的方式来实现。 2. 递归算法递归越深,占用栈空间也...

    函数递归调用堆栈分析.doc

    函数递归调用堆栈分析是指在计算机科学中,函数递归调用时,函数调用自身的过程中,如何使用堆栈来存储变量和参数的过程。堆栈是一种 lasts-in-first-out(LIFO)的数据结构,用于存储函数调用的参数和变量。 在...

    使用SQL Server存储过程递归遍历层次结构.pdf

    如果在递归调用过程中试图创建同名的游标,就会因为作用域问题导致失败。为了解决这个问题,可以将游标的作用域更改为局部,或者在存储过程的游标声明语句中添加LOCAL关键字,这样每个递归层级的调用都会创建一个...

    c语言,二叉树,前中后,递归,非递归

    在计算机科学中,二叉树广泛应用于算法设计、数据存储和检索等领域。二叉树的遍历是对其进行操作的基本步骤之一,用于访问树中的所有节点。 ### 递归遍历方法 #### 前序遍历 前序遍历是指首先访问根节点,然后递归...

    链式栈实现递归和非递归迷宫路径求解

    在非递归的深度优先搜索(DFS)中,我们使用链式栈来模拟递归调用的过程。当遇到一个可通行的节点时,我们将该节点压入栈中,并标记为已访问,然后移动到其相邻的未访问节点。如果所有相邻节点都无法通行或者已被...

    acm递归算法总结竞赛

    7. **动态规划与记忆化**:为了优化递归算法,可以采用动态规划的思想,将已经计算过的子问题结果存储起来,避免重复计算,这种方法称为记忆化搜索。 8. **递归与分治策略**:递归往往是分治算法的实现方式,如快速...

Global site tag (gtag.js) - Google Analytics