1. 程式人生 > >mysql 動態遊標

mysql 動態遊標

開發十年,就只剩下這套架構體系了! >>>   

CREATE DEFINER=`root`@`localhost` PROCEDURE `MoveOrderUtil_PartMove`(
						in  company_id_ int ,
                        in  owner_id_                varchar(10),
                        in  warehouse_               varchar(10),
                        in  part_no_                 varchar(20),
                        in  lot_batch_no_	         varchar(20),
                        in  fr_location_no_          varchar(20),
                        in  to_warehouse_            varchar(10),
                        in  to_location_no_          varchar(20),
                        in  qty_to_move_             int,
                        in  user_id_                 varchar(40))
BEGIN
	DECLARE totalSum_           int ;
    DECLARE qty_onhand_         int ;
    DECLARE inv_stk_id_         int ;
    DECLARE move_no_            varchar(20);
    DECLARE move_id_            int ;
    if nvl(lot_batch_no_ , '*') = '*' then
		begin
			DECLARE get_in_stock CURSOR FOR
				 SELECT sum(qty_onhand) 
					 FROM   inventory_part_in_stock
					 WHERE  logistics_company_id = company_id_
					 and    warehouse = warehouse_
					 and    location_no = fr_location_no_
                     and    part_no = part_no_ ;
			DECLARE CONTINUE HANDLER FOR NOT FOUND SET totalSum_ = NULL; 

			OPEN  get_in_stock;
			FETCH get_in_stock INTO totalSum_;
			CLOSE get_in_stock;  
        end;
    else 
		begin
			DECLARE get_in_stock CURSOR FOR
				 SELECT sum(qty_onhand) 
					 FROM   inventory_part_in_stock
					 WHERE  logistics_company_id = company_id_
					 and    warehouse = warehouse_
					 and    location_no = fr_location_no_
                     and    part_no = part_no_ 
					 and    lot_batch_no = lot_batch_no_ ;
			DECLARE CONTINUE HANDLER FOR NOT FOUND SET totalSum_ = NULL; 

			OPEN  get_in_stock;
			FETCH get_in_stock INTO totalSum_;
			CLOSE get_in_stock; 
		end;
    end if;


    if(nvl(totalSum_ , 0) < qty_to_move_ ) then
	  CALL ErrorSys_RecordGeneral('MoveOrder', '庫位 :P1 庫存  : P2 少於需移庫數量 : P3 !',
                                                           fr_location_no_,
                                                           totalSum_,
                                                           qty_to_move_);
    end if;
    
    begin
		DECLARE get_in_stock CURSOR for( SELECT id , qty_onhand from temp_view); 
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET inv_stk_id_ = null;  
		DROP VIEW IF EXISTS temp_view;  
        SET @sqlstr = "CREATE VIEW temp_view as ";  
		if nvl(lot_batch_no_ , '*') = '*' then
			
			SET @sqlstr = CONCAT(@sqlstr , "SELECT id , qty_onhand
					 FROM   inventory_part_in_stock
					 WHERE  logistics_company_id = ", company_id_ ,"
					 and    warehouse = '", warehouse_ ,"'
					 and    location_no = '", fr_location_no_ ,"'
                     and    part_no = '", part_no_ ,"' ");
		else
			SET @sqlstr = CONCAT(@sqlstr , "SELECT id , qty_onhand
					 FROM   inventory_part_in_stock
					 WHERE  logistics_company_id = ", company_id_ ,"
					 and    warehouse = '", warehouse_ ,"'
					 and    location_no = '", fr_location_no_ ,"'
                     and    part_no = '", part_no_ ,"' 
                     and    lot_batch_no = '", lot_batch_no_ ,"' "); 
		end if ;
        PREPARE stmt FROM @sqlstr;  
		EXECUTE stmt;  
		DEALLOCATE PREPARE stmt;  
        OPEN get_in_stock;  
        moveLoop : loop
		FETCH get_in_stock INTO inv_stk_id_ , qty_onhand_ ; 
			if inv_stk_id_ is NULL then
				leave moveLoop;
			end if ;
            
            if qty_onhand_ >=  qty_to_move_ then 
            	--  新增入庫單
				call MoveOrderUtil_NewOrder(move_no_ ,company_id_ , warehouse_ , inv_stk_id_ , qty_to_move_ , to_warehouse_ ,to_location_no_ , owner_id_ , 1 ,  user_id_); 
				leave moveLoop;
            else 
				--  新增入庫單
				call MoveOrderUtil_NewOrder(move_no_ ,company_id_ , warehouse_ , inv_stk_id_ , qty_to_move_ , to_warehouse_ ,to_location_no_ , owner_id_ , 1 ,  user_id_); 
                set qty_to_move_ = qty_to_move_ - qty_onhand_ ;
            end if;
        end loop moveLoop ;
        close get_in_stock ;
        
        set move_id_ = MoveOrderUtil_GetIdByUnindex(company_id_ ,move_no_ );
		-- 執行移庫確認
		call MoveOrderUtil_ConfirmOrder(move_id_ , user_id_);
		-- 執行移庫完成
		call MoveOrderUtil_ExecMove(move_id_ , user_id_);

    end ;

END