1 BEGIN 2 #Routine body goes here... 3 4 -- 现可以限制 卡口及号牌 5 6 -- //定义变量 7 8 9 declare insertedDatetime TIMESTAMP ; 10 declare licenseNumber varchar(50) default '' ; 11 declare pointNumber varchar(50) default '' ; 12 13 declare cursorSurveil CURSOR FOR select t.insertedDatetime, t.licenseNumber, t.pointNumber from t_surveil as t WHERE t.matchRuleIds is null ; 14 declare CONTINUE HANDLER FOR SQLSTATE '02000' SET insertedDatetime = null; 15 16 17 DROP TEMPORARY TABLE IF EXISTS tmpLog ; 18 19 CREATE temporary table `tmpLog`( `insertedDatetime` timestamp not null DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 20 `log` VARCHAR(2000) not null ) ENGINE=MEMORY ; 21 22 23 INSERT tmpLog(log) VALUES ('以下是日志内容'); 24 25 -- SELECT * from tmpLog ; 26 27 INSERT tmpLog(log) VALUES ( concat( '监控数据开始') ); 28 29 30 31 -- 监控数据 32 OPEN cursorSurveil ; 33 FETCH cursorSurveil INTO insertedDatetime, licenseNumber , pointNumber ; 34 WHILE( insertedDatetime is not null) DO 35 36 -- SELECT 't_surveil' title, `insertedDatetime` ; 37 38 INSERT tmpLog(log) VALUES ( concat( '监控数据 t_surveil, insertedDatetime = ' , insertedDatetime ) ); 39 INSERT tmpLog(log) VALUES ( concat( '监控数据 t_surveil, licenseNumber = ' , licenseNumber ) ); 40 INSERT tmpLog(log) VALUES ( concat( '监控数据 t_surveil, pointNumber = ' , pointNumber ) ); 41 42 begin 43 44 -- 匹配的规则 ID 45 DECLARE matchRuleIds varchar(2000) DEFAULT '0' ; 46 47 declare ruleId INT DEFAULT 0 ; 48 declare cursorRule CURSOR FOR select id from t_rule as t WHERE t.activeStatus = 1 ; 49 declare CONTINUE HANDLER FOR SQLSTATE '02000' SET ruleId = null ; 50 51 52 INSERT tmpLog(log) VALUES ( concat( '规则开始') ); 53 54 -- //打开游标 55 OPEN cursorRule; 56 -- //遍历游标 57 FETCH cursorRule INTO ruleId ; 58 -- //把游标查询出的 name 都加起并用 ; 号隔开 59 WHILE( ruleId is not null) DO 60 -- SELECT ruleId ; 61 -- SELECT 't_rule' title, ruleId ; 62 63 INSERT tmpLog(log) VALUES ( concat( 't_rule, ruleId = ' , ruleId ) ); 64 65 -- 规则项 66 -- 规则项之间是 AND 的关系。即要全部成立才认为匹配成功 67 68 BEGIN 69 70 declare isThisItemMatch int default 0 ; -- 本项是否匹配项 71 DECLARE isAllItemMatch int default 1 ; -- 是否所有的项目都匹配? 72 DECLARE itemCount INT DEFAULT 0 ; -- 项数量。是否存在至少一个项? 73 74 declare ruleItemId INT DEFAULT 0 ; 75 DECLARE fieldName VARCHAR(50) ; 76 77 declare cursorRuleItem CURSOR FOR select id, t.fieldName from t_rule_item as t WHERE t.ruleId = ruleId ; 78 declare CONTINUE HANDLER FOR SQLSTATE '02000' SET ruleItemId = null; 79 80 INSERT tmpLog(log) VALUES ( concat( '规则项开始') ); 81 82 OPEN cursorRuleItem ; 83 FETCH cursorRuleItem INTO ruleItemId, fieldName ; 84 WHILE( ruleItemId is not null) DO 85 86 -- SELECT 't_rule_item' title, ruleItemId ; 87 88 89 INSERT tmpLog(log) VALUES ( concat( 't_rule_item, ruleItemId = ' , ruleItemId ) ); 90 91 INSERT tmpLog(log) VALUES ( concat( 't_rule_item, fieldName = ' , fieldName ) ); 92 93 SET itemCount = itemCount + 1 ; -- 项目数 94 95 INSERT tmpLog(log) VALUES ( concat( 't_rule_item, itemCount = ' , itemCount ) ); 96 97 SET fieldName = CASE 98 WHEN fieldName = 'licenseNumber' THEN fieldName 99 WHEN fieldName = 'pointNumber' THEN fieldName 100 END ; 101 102 103 BEGIN 104 105 -- 规则项值 106 -- 规则项值之间是 OR 的关系,即有一条成立,即认为匹配成功。 107 -- 一但找到匹配,就退出本层游标 108 109 declare hasMatchedValue int default 0 ; -- 是否匹配值 110 111 declare ruleItemValueId INT DEFAULT 0 ; 112 declare comparisonType varchar(50) DEFAULT '' ; 113 declare itemValue varchar(200) DEFAULT '' ; 114 declare valueMinmum varchar(200) DEFAULT '' ; 115 declare valueMaximun varchar(200) DEFAULT '' ; 116 117 declare cursorRuleItemValue CURSOR FOR 118 select 119 t.id, t.comparisonType, t.itemValue, t.valueMinmum, t.valueMaximun 120 from 121 t_rule_item_value as t 122 WHERE 123 t.ruleItemId = ruleItemId ; 124 125 declare CONTINUE HANDLER FOR SQLSTATE '02000' SET ruleItemValueId = null; 126 127 -- SET hasMatchedValue = 0 ; 128 129 INSERT tmpLog(log) VALUES ( concat( '项值开始') ); 130 131 OPEN cursorRuleItemValue ; 132 FETCH cursorRuleItemValue INTO ruleItemValueId, comparisonType , itemValue , valueMinmum , valueMaximun ; 133 WHILE( ruleItemValueId is not null ) DO 134 135 -- SELECT 't_rule_item_value' title, ruleItemValueId ; 136 137 INSERT tmpLog(log) VALUES ( concat( 't_rule_item_value, ruleItemValueId = ' , ruleItemValueId ) ); 138 INSERT tmpLog(log) VALUES ( concat( 't_rule_item_value, comparisonType = ' , comparisonType ) ); 139 INSERT tmpLog(log) VALUES ( concat( 't_rule_item_value, itemValue = ' , itemValue ) ); 140 141 -- 比较 - 等于 142 IF comparisonType = '等于' OR comparisonType = 'equal' then 143 144 INSERT tmpLog(log) VALUES ( concat( '等于' ) ); 145 146 147 if fieldName = 'licenseNumber' then 148 IF licenseNumber = itemValue then 149 SET hasMatchedValue = 1 ; 150 INSERT tmpLog(log) VALUES ( concat( 't_rule_item_value, 找到匹配值!!! licenseNumber' ) ); 151 END IF ; 152 end if ; 153 154 if fieldName = 'pointNumber' then 155 IF pointNumber = itemValue then 156 SET hasMatchedValue = 1 ; 157 INSERT tmpLog(log) VALUES ( concat( 't_rule_item_value, 找到匹配值!!! pointNumber' ) ); 158 END IF ; 159 end if ; 160 161 END IF ; 162 163 -- 比较 - 区间 164 IF comparisonType = '区间' or comparisonType = 'between' then 165 166 if fieldName = 'licenseNumber' then 167 IF licenseNumber >= valueMinmum AND licenseNumber <= valueMaximun then 168 SET hasMatchedValue = 1 ; 169 END IF ; 170 end if ; 171 172 if fieldName = 'pointNumber' then 173 IF pointNumber >= valueMinmum AND pointNumber <= valueMaximun then 174 SET hasMatchedValue = 1 ; 175 END IF ; 176 end if ; 177 178 END IF ; 179 180 -- select hasMatchedValue ; 181 182 IF hasMatchedValue = 1 THEN 183 SET isThisItemMatch = 1 ; -- 本项匹配 !! 184 SET ruleItemValueId = null ; -- 结束本层循环 185 INSERT tmpLog(log) VALUES ('存在匹配的项值,本项匹配,退出项值循环。'); 186 ELSE 187 FETCH cursorRuleItemValue INTO ruleItemValueId, comparisonType , itemValue , valueMinmum , valueMaximun ; 188 end if ; 189 190 END WHILE ; -- 规则项值 191 192 CLOSE cursorRuleItemValue ; 193 194 -- SELECT 'rule item value over ' msg ; 195 196 197 INSERT tmpLog(log) VALUES ('项值结束'); 198 199 200 END ; 201 202 203 IF isThisItemMatch = 1 THEN 204 FETCH cursorRuleItem INTO ruleItemId, fieldName ; 205 else 206 set isAllItemMatch = 0 ; 207 SET ruleItemId = null ; 208 end if ; 209 210 END WHILE ; 211 212 CLOSE cursorRuleItem ; 213 214 INSERT tmpLog(log) VALUES ('项结束'); 215 216 -- !!!! 如果全部匹配 !!!! 217 IF isAllItemMatch = 1 AND itemCount > 0 THEN 218 -- 这个规则符合 !!! 219 set matchRuleIds = concat( matchRuleIds , ',' , ruleId ) ; 220 end if ; 221 222 END ; 223 224 -- SHOW VARIABLES ruleId ; 225 FETCH cursorRule INTO ruleId ; 226 227 END WHILE; 228 CLOSE cursorRule; 229 -- select mycursor; 230 INSERT tmpLog(log) VALUES ('规则结束'); 231 232 -- 写入匹配结果 233 -- UPDATE t_surveil as t SET t.matchRuleIds = matchRuleIds WHERE t.insertedDatetime = insertedDatetime ; 234 -- SELECT matchRuleIds, insertedDatetime ; 235 INSERT tmpLog(log) VALUES ( concat( 'matchRuleIds = ', matchRuleIds ,', insertedDatetime = ' , insertedDatetime ) ); 236 237 end ; 238 239 FETCH cursorSurveil INTO insertedDatetime, licenseNumber , pointNumber ; 240 241 END WHILE ; 242 243 CLOSE cursorSurveil ; 244 245 INSERT tmpLog(log) VALUES ('监控数据循环结束'); 246 247 248 SELECT * from tmpLog ; 249 250 DROP TEMPORARY TABLE IF EXISTS tmpLog ; 251 252 END