`

mysql 存储过程

阅读更多

刚写的,做个记录:

 

-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE DEFINER=`root`@`%` PROCEDURE `getPercentOfPass`(IN p_batchCode varchar(255), IN p_customerCode varchar(255), OUT p_ispass INT)
BEGIN
	DECLARE Done INT DEFAULT 0;
	DECLARE Done2 INT DEFAULT 0;
	DECLARE Done3 INT DEFAULT 0;
	DECLARE singleMacId INT;
	DECLARE detailCount INT DEFAULT 0;
	DECLARE detailPassCount INT DEFAULT 0;
	DECLARE singleRssiPass INT;
	DECLARE singlePwPass INT;
	DECLARE totalRssiPass INT DEFAULT 0;
	DECLARE totalPwPass INT DEFAULT 0;

	/* 
	 * 逻辑:
	 *	1、得到该批次号所有的mac地址,
	 *	2、循环,取出每个mac地址对应的测试明细,
	 *  3、分析信号通过比率以及功率通过比率,各自大于等于80%,则此macid为通过
     *  4、整批通过为1,有一个不通过,则返回0
	 */
	DECLARE cursor_macId CURSOR FOR 
		SELECT DISTINCT(macId) AS macIds FROM batchdetail bd LEFT JOIN batch b ON bd.bId = b.bId WHERE b.bName = p_batchCode;
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET Done = 1;

	OPEN cursor_macId;
	WHILE Done = 0 DO
		FETCH cursor_macId INTO singleMacId;
		/*必须加if,否则会多执行一次*/
		IF Done = 0 THEN
			/* 得到每个mac地址对应的总的明细条数 */
			SELECT COUNT(1) INTO detailCount FROM batchDetail bd WHERE bd.macId = singleMacId;
			
			SET totalRssiPass = 0;/* 每个mac地址的明细条数中,能通过测试的总数 */
			SET totalPwPass = 0;/* 每个mac地址的明细条数中,能通过测试的总数 */
			SET Done2 = 0;
			/* 嵌套游标需要加begin end */
			BEGIN
				DECLARE cursor_detail CURSOR FOR 
					SELECT bd.rssipass, bd.pwpass FROM batchDetail bd WHERE bd.macId = singleMacId;
				DECLARE CONTINUE HANDLER FOR NOT FOUND SET Done2 = 1;
				
				OPEN cursor_detail;
					WHILE Done2 = 0 DO
						FETCH cursor_detail INTO singleRssiPass, singlePwPass;
						IF Done2 =  0 THEN
							/*SELECT singleRssiPass,singlePwPass;*/
							IF singleRssiPass = 1 THEN
								SET totalRssiPass = totalRssiPass + 1;
							END IF;

							IF singlePwPass = 1 THEN
								SET totalPwPass = totalPwPass + 1;
							END IF;
						END IF;
					END WHILE;
				CLOSE cursor_detail;

				select totalRssiPass, totalPwPass, detailCount, totalRssiPass/detailCount, totalPwPass/detailCount;

				SET @ccode = p_customerCode;
				SET @bcode = p_batchCode;
				SET @macid = singleMacId;
				SET @createdate = now();

				IF totalRssiPass / detailCount >= 0.8 THEN
					/*SELECT ("pass") AS ispass;*/
					SET @rssiPass = 1;
				ELSE
					/*SELECT ("not pass") AS ispass;*/
					SET @rssiPass = 0;
				END IF;

				IF totalPwPass / detailCount >= 0.8 THEN
					/*SELECT ("pass") AS ispass;*/
					SET @pwPass = 1;
				ELSE
					/*SELECT ("not pass") AS ispass;*/
					SET @pwPass = 0;
				END IF;
				
				SET SQL_SAFE_UPDATES = 0;
				DELETE FROM detectiondata WHERE customercode= p_customerCode AND batchcode = p_batchCode;
				
				SET @insertDetectiondataSql = CONCAT('INSERT INTO detectiondata(customercode,batchcode,macid,rssipass,pwpass,createdate) VALUES(?,?,?,?,?,?)');
				PREPARE stmt_insertDetectiondataSql FROM @insertDetectiondataSql;
				EXECUTE stmt_insertDetectiondataSql USING @ccode,@bcode,@macid,@rssiPass,@pwPass,@createdate;
				
			END;
			

		END IF;
	END WHILE;
	CLOSE cursor_macId;
	
	BEGIN
		DECLARE passFlag INT DEFAULT 1;
		/* 得到该批次所有macId的通过情况,有一个macid不过,则整批设为不过*/
		DECLARE cursor_dd CURSOR FOR SELECT macid, rssipass, pwpass FROM detectiondata WHERE batchcode = p_batchCode AND customercode = p_customerCode;
		DECLARE CONTINUE HANDLER FOR NOT FOUND SET Done3 = 1;
		

		OPEN cursor_dd;
		WHILE Done3 = 0 DO
			FETCH cursor_dd INTO singleMacId,singleRssiPass,singlePwPass;
			IF Done3 = 0 THEN
				IF singleRssiPass = 0 OR singlePwPass = 0 THEN
					SET passFlag = 0;
					SET Done3 = 0;
					/*SELECT '跳出';*/
				END IF;
			END IF;
		END WHILE;
		CLOSE cursor_dd;

		IF passFlag = 1 THEN
			SET p_ispass = 1;
		ELSE
			SET p_ispass = 0;
		END IF;
		SELECT p_ispass;
	END;
	
END

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics