这篇文章上次修改于 1249 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### TRUNCATE TABLE `PlanTab`; INSERT INTO `PlanTab` VALUES ('1', "call proc_impl_YX_failure_or_success('517&518&520&521^511');", '5', '0', '1'); INSERT INTO `PlanTab` VALUES ('2', 'call procedure_test();', '3', '0', '1'); ################################################################################### DROP PROCEDURE IF EXISTS procedure_plan; delimiter // CREATE PROCEDURE procedure_plan() BEGIN DECLARE v_id INT DEFAULT 1; # ID DECLARE v_cur INT DEFAULT 0; # 默认起始计数0,从表中读取 DECLARE v_step INT DEFAULT 1; # 默认计数每次增加1分钟,过程内置 DECLARE v_preset INT DEFAULT 5; # 默认执行周期每5分钟,从表中读取 DECLARE data_end INT DEFAULT 0; DECLARE data_cur CURSOR FOR SELECT `ID`,PresetCount,CurrentCount FROM PlanTab; DECLARE CONTINUE HANDLER FOR NOT FOUND SET data_end=1; open data_cur; REPEAT FETCH data_cur INTO v_id, v_preset, v_cur; IF data_end <> 1 THEN SET v_cur = v_cur + v_step; IF v_cur > v_preset THEN SET v_cur = FLOOR(MOD(v_cur, v_preset) - 1); END IF; UPDATE PlanTab SET CurrentCount = v_cur WHERE `ID` = v_id; END IF; UNTIL data_end END REPEAT; -- select v_begin, v_end, v_value, v_total; END // delimiter ; call procedure_plan(); ################################################################################### DROP PROCEDURE IF EXISTS procedure_init; delimiter // CREATE PROCEDURE procedure_init() BEGIN DROP TEMPORARY TABLE IF EXISTS temp_message_tab; CREATE TEMPORARY TABLE temp_message_tab ( `id` INTEGER PRIMARY KEY NOT NULL, `totab` VARCHAR(16) NOT NULL, `policy` VARCHAR(64) NOT NULL, `inners` INTEGER DEFAULT NULL, `outers` INTEGER DEFAULT NULL, `vendor` INTEGER DEFAULT NULL, `message` VARCHAR(64) character set utf8 DEFAULT '' ; ) ENGINE=MEMORY ; INSERT INTO temp_message_tab VALUES ('11', 'YXDataTab', '', '511', '11', '3', '遥信变位'); INSERT INTO temp_message_tab VALUES ('12', 'YXDataTab', '', '512', '12', '3', '遥信抖动'); INSERT INTO temp_message_tab VALUES ('13', 'YXDataTab', '', '513', '13', '3', '遥信质量码'); INSERT INTO temp_message_tab VALUES ('14', 'YXDataTab', '', '514', '14', '3', 'SOE发生'); INSERT INTO temp_message_tab VALUES ('15', 'YXDataTab', '', '515', '15', '3', 'SOE抖动'); INSERT INTO temp_message_tab VALUES ('16', 'YXDataTab', '', '516', '16', '3', 'SOE延迟传输'); INSERT INTO temp_message_tab VALUES ('17', 'YKDataTab', '', '517', '17', '3', '遥控选择'); INSERT INTO temp_message_tab VALUES ('18', 'YKDataTab', '', '518', '18', '3', '遥控选择成功'); INSERT INTO temp_message_tab VALUES ('19', 'YKDataTab', '', '519', '19', '3', '遥控选择失败'); INSERT INTO temp_message_tab VALUES ('20', 'YKDataTab', '', '520', '20', '3', '遥控执行'); INSERT INTO temp_message_tab VALUES ('21', 'YKDataTab', '', '521', '21', '3', '遥控执行成功'); INSERT INTO temp_message_tab VALUES ('22', 'YKDataTab', '', '522', '22', '3', '遥控执行失败'); INSERT INTO temp_message_tab VALUES ('23', 'YKDataTab', '', '523', '23', '3', '遥控取消'); INSERT INTO temp_message_tab VALUES ('24', 'YKDataTab', '', '524', '24', '3', '遥控取消成功'); INSERT INTO temp_message_tab VALUES ('25', 'YKDataTab', '', '525', '25', '3', '遥控取消失败'); INSERT INTO temp_message_tab VALUES ('35', 'YCDataTab', '', '535', '35', '3', '遥测变化'); INSERT INTO temp_message_tab VALUES ('36', 'YCDataTab', '', '536', '36', '3', '遥测上送'); INSERT INTO temp_message_tab VALUES ('37', 'YCDataTab', '', '537', '37', '3', '遥测长时间未变化'); INSERT INTO temp_message_tab VALUES ('38', 'YCDataTab', '', '538', '38', '3', '遥测质量码'); INSERT INTO temp_message_tab VALUES ('39', 'YCDataTab', '', '539', '39', '3', '遥测跳变'); -- SELECT * FROM temp_message_tab; DROP TEMPORARY TABLE IF EXISTS temporary_logic; CREATE TEMPORARY TABLE temporary_logic ( `id` INTEGER PRIMARY KEY NOT NULL, `msgtype` INTEGER NOT NULL, `msgname` VARCHAR(64) NOT NULL, `msgidx` INTEGER NOT NULL, `record` INTEGER NOT NULL, `status` INTEGER NOT NULL, `analys` INTEGER NOT NULL ) ENGINE=MEMORY ; END // delimiter ; call procedure_init(); ################################################################################### ################################################################################### ################################################################################### DELIMITER // DROP FUNCTION IF EXISTS setDotRelated; CREATE FUNCTION setDotRelated() RETURNS INT BEGIN DECLARE v_begin INT DEFAULT 0; DECLARE v_end INT DEFAULT 0; DECLARE v_value VARCHAR(32767) DEFAULT ''; DECLARE v_title VARCHAR(32767) DEFAULT ''; DECLARE v_total VARCHAR(32767) DEFAULT ''; DECLARE v_msgidx INT DEFAULT 0; DECLARE v_record INT DEFAULT 0; DECLARE v_status INT DEFAULT 0; DECLARE v_analys INT DEFAULT 0; DECLARE flag_end INT DEFAULT 0; DECLARE data_cur CURSOR FOR SELECT `msgidx`,`record`,`status`,`analys` FROM `temporary_logic` WHERE `msgidx` > 0 AND `id` < 5; DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag_end=1; open data_cur; SET v_begin = 1; REPEAT FETCH data_cur INTO v_msgidx, v_record, v_status, v_analys; IF flag_end <> 1 THEN set v_end = v_end+1; -- PREPARE stmt FROM @proc_call_name; -- EXECUTE stmt; -- DEALLOCATE PREPARE stmt; SELECT `ReportTime`,`TextValue` INTO v_title, v_value FROM `temp_term_tab` WHERE `ID` = v_msgidx; set v_total = TRIM(LEADING '\n' FROM CONCAT_WS('\n',v_total, CONCAT(v_title,' ',v_value))); INSERT INTO `YKDataTab` (SELECT '0' AS `ID`, `IpAddress`,`Port`, `DestinationIpAddress`, `DestinationPort`,`ReportTime`, CURRENT_TIMESTAMP AS `StorageTime`, `Ypoint` AS `YkPointIndex`, `Ydesc` AS `YkPointNumberDescription`, `MessageType`, `Ydot` AS `Dot`, `Yval` AS `DataValue`, v_record AS `YKConclusionRecord`, v_status AS `YKConclusionStatus`, v_analys AS `YKConclusionIndex`, v_total AS `ContentOfProof` FROM `temp_term_tab` WHERE `ID` = v_msgidx); DELETE FROM `BaseDataTab` WHERE `ID` = v_msgidx AND 'HwMsas1000' IN ( SELECT DATABASE() ); END IF; UNTIL flag_end END REPEAT; -- SELECT v_begin, v_end, v_value, v_total; RETURN 4; END // DELIMITER ; SELECT setDotRelated(); ################################################################################### DROP PROCEDURE IF EXISTS procedure_each; DELIMITER // CREATE PROCEDURE procedure_each( IN p_logic TINYTEXT, IN p_table TINYTEXT) BEGIN DECLARE v_begin INT DEFAULT 0; DECLARE v_end INT DEFAULT 0; DECLARE v_value VARCHAR(32767) character set utf8 DEFAULT '' ; DECLARE v_total VARCHAR(32767) character set utf8 DEFAULT '' ; DECLARE v_i int DEFAULT 0; DECLARE v_len int DEFAULT 0; DECLARE v_id int DEFAULT 0; DECLARE v_num int DEFAULT 0; DECLARE v_msgidx int DEFAULT 0; DECLARE v_msgtype int DEFAULT 0; DECLARE v_msgtext VARCHAR(64) character set utf8 DEFAULT '' ; DECLARE flag_end int DEFAULT 0; DECLARE data_cur CURSOR FOR SELECT GROUP_CONCAT(CONCAT_WS(',', `ID`,`MessageType`, SUBSTRING_INDEX(SUBSTRING_INDEX(`TextValue`, '-', -2), '-', 1)) SEPARATOR ';') FROM `temp_term_tab` WHERE `MessageType` IN ('517', '518', '520', '521', '511') GROUP BY `YDot` ORDER BY `ReportTime`; DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag_end=1; -- SELECT * FROM `temp_term_tab` WHERE `MessageType` GROUP BY `YDot` ORDER BY `ReportTime`; -- SELECT `YDot`,`Yindex`,GROUP_CONCAT(CONCAT_WS(',', `ID`,`MessageType`, SUBSTRING_INDEX(SUBSTRING_INDEX(`TextValue`, '-', -2), '-', 1)) SEPARATOR ';') -- FROM `temp_term_tab` WHERE `MessageType` IN ('17', '18', '20', '21', '11') GROUP BY `YDot` ORDER BY `ReportTime`; DROP TEMPORARY TABLE IF EXISTS temporary_logic; CREATE TEMPORARY TABLE temporary_logic ( `id` INTEGER PRIMARY KEY NOT NULL, `msgtype` INTEGER NOT NULL, `msgname` VARCHAR(64) NOT NULL, `msgidx` INTEGER NOT NULL, `record` INTEGER NOT NULL, `status` INTEGER NOT NULL, `analys` INTEGER NOT NULL ) ENGINE=MEMORY ; INSERT INTO `temporary_logic` VALUES ('1', '517', '遥控选择' , 0, 1, 2, 3), ('2', '518', '遥控选择成功' , 0, 1, 2, 3), ('3', '520', '遥控执行' , 0, 1, 2, 3), ('4', '521', '遥控执行成功' , 0, 2, 2, 3), ('5', '511', '遥信变位' , 0, 1, 2, 3); -- SELECT * FROM `temporary_logic`; open data_cur; set v_begin = 1; REPEAT FETCH data_cur INTO v_total; IF flag_end != 1 THEN set v_end = v_end + 1; set v_len = LENGTH(v_total) - LENGTH(REPLACE(v_total,';',''))+1; set v_i = 0; IF v_len >= 4 THEN UPDATE `temporary_logic` SET `msgidx` = 0; END IF; WHILE v_len >= 4 AND v_i < v_len DO set v_i = v_i+1; set v_value = SUBSTRING_INDEX(SUBSTRING_INDEX(v_total, ';', v_i), ';', -1); set v_msgidx = SUBSTRING_INDEX(v_value, ',', 1); set v_msgtype = SUBSTRING_INDEX(SUBSTRING_INDEX(v_value, ',', 2), ',', -1); set v_msgtext = SUBSTRING_INDEX(v_value, ',', -1); SELECT `id` INTO v_id FROM `temporary_logic` WHERE `msgtype` = v_msgtype; -- SET: FIRST MSG OR LAST MSG NOT NULL SHOUL UPDATE CURRENT MSG INDEX IF v_id = 1 THEN UPDATE `temporary_logic` SET `msgidx` = v_msgidx WHERE `msgtype` = v_msgtype; ELSE SELECT `msgidx` INTO v_num FROM `temporary_logic` WHERE `id` IN (SELECT v_id - 1); -- LAST MSG GOT IT OR PREVIEW MSG IS NONE, SHOULD CLENN ALL IF v_id = 5 OR v_num = 0 THEN UPDATE `temporary_logic` SET `msgidx` = 0; ELSE UPDATE `temporary_logic` SET `msgidx` = v_msgidx WHERE `msgtype` = v_msgtype; END IF; -- SOME DATA OR NODATA ---> CLEAN, RECV YK SELECT, OR REACH END END IF; -- CHECK IF RECV FIRST MSG(PROMISE FULL AND WITHOUT YXBW) OR REACH END IF v_id = 1 OR v_i = v_len THEN SELECT COUNT(*) INTO v_num FROM `temporary_logic` WHERE `msgidx` > 0 AND `id` != 5; IF v_num = 4 THEN -- FULL DATA ---> STORE , RECV YK SELECT, OR REACH END UPDATE `temporary_logic` SET `msgname` = 999 WHERE `msgtype` = v_msgtype; -- SELECT v_begin, v_end, v_value, v_total, v_msgidx, v_id, v_msgtype; SELECT * FROM `temporary_logic`; -- SELECT * FROM `temp_term_tab`; SELECT setDotRelated() INTO v_num; -- SELECT v_begin, v_end, v_value, v_total, v_id, v_msgidx, v_msgtype, v_msgtext; END IF; END IF; END WHILE; END IF; UNTIL flag_end END REPEAT; close data_cur; -- SELECT v_begin, v_end, v_value, v_total; END // DELIMITER ; call procedure_each('517&518&520&521^511', 'temp_table_term'); ################################################################################### DROP PROCEDURE IF EXISTS procedure_term; DELIMITER // CREATE PROCEDURE procedure_term( IN p_logic TINYTEXT, IN p_termid INT ) BEGIN DECLARE v_begin INT DEFAULT 0; DECLARE v_end INT DEFAULT 0; DECLARE v_value TINYTEXT DEFAULT ''; DECLARE v_total TINYTEXT DEFAULT ''; DECLARE v_i INT DEFAULT 0; DECLARE v_len INT DEFAULT 0; DECLARE v_delim TINYTEXT DEFAULT '|'; DECLARE v_logic TINYTEXT DEFAULT ''; set v_len = LENGTH(p_logic) - LENGTH(REPLACE(p_logic,v_delim,''))+1; set v_i = 0; WHILE v_i < v_len do set v_i = v_i+1; set v_logic = replace(substring(substring_index(p_logic, v_delim, v_i), length(substring_index(p_logic, v_delim, v_i -1)) + 1), v_delim, ''); set v_total = CONCAT(v_total, ' ', v_logic); call procedure_each(v_logic, 'temp_term_tab'); END WHILE; -- SELECT v_begin, v_end, v_value, v_total; END // DELIMITER ; call procedure_term('517&518&520&521^511', '20511'); ################################################################################### DELIMITER // DROP FUNCTION IF EXISTS genDotRelated; CREATE FUNCTION genDotRelated(msgType INT,dot INT, termid INT, flag VARCHAR(16)) RETURNS VARCHAR(64) BEGIN DECLARE v_result VARCHAR(64) DEFAULT ''; DECLARE v_decideTab VARCHAR(64) DEFAULT ''; DECLARE v_dotAbsAddr INT DEFAULT 0; DECLARE v_pointIdx INT DEFAULT 0; DECLARE v_pointDesc VARCHAR(64) DEFAULT ''; DECLARE has_error int DEFAULT 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET has_error = 1; IF ISNULL(msgType) || LENGTH(trim(msgType))<1 OR ISNULL(dot) || LENGTH(trim(dot))<1 OR ISNULL(termid) || LENGTH(trim(termid))<1 THEN RETURN v_result; END IF; IF 11 <= msgType AND msgType <= 16 THEN set v_decideTab = 'YXDataTab'; set v_dotAbsAddr = 0x1 + dot; -- SELECT IFNULL(`InternalPointIndex`, 0),IFNULL(`DotDescription`, ' ') INTO v_pointIdx,v_pointDesc FROM `YXPointDataTab` -- WHERE `TerminalIndex` = termid AND `DotAbsoluteAddress` = v_dotAbsAddr; ELSEIF 17 <= msgType AND msgType <= 25 THEN set v_decideTab = 'YKDataTab'; set v_dotAbsAddr = 0x4001 + dot; -- SELECT `InternalPointIndex`,`DotDescription` INTO v_pointIdx,v_pointDesc FROM `YKPointDataTab` -- WHERE `TerminalIndex` = termid AND `DotAbsoluteAddress` = v_dotAbsAddr; ELSEIF 35 <= msgType AND msgType <= 39 THEN set v_decideTab = 'YCDataTab'; set v_dotAbsAddr = 0x6001 + dot; -- SELECT `InternalPointIndex`,`DotDescription` INTO v_pointIdx,v_pointDesc FROM `YCPointDataTab` -- WHERE `TerminalIndex` = termid AND `DotAbsoluteAddress` = v_dotAbsAddr; END IF; SELECT CASE WHEN flag = 'TYPE' THEN v_decideTab WHEN flag = 'POINT' THEN v_pointIdx WHEN flag = 'DESC' THEN v_pointDesc ELSE NULL END AS ret INTO v_result; RETURN v_result; END // DELIMITER ; SELECT genDotRelated(17,3,20511, 'TYPE'); ################################################################################### DROP PROCEDURE IF EXISTS procedure_work; delimiter // CREATE PROCEDURE procedure_work(IN p_logic VARCHAR(64) ) BEGIN DECLARE v_begin INT DEFAULT 0; DECLARE v_end INT DEFAULT 0; DECLARE v_value TINYTEXT DEFAULT ''; DECLARE v_total TINYTEXT DEFAULT ''; DECLARE v_num INT DEFAULT 0; DECLARE v_termid INT DEFAULT ''; DECLARE v_ip TINYTEXT DEFAULT ''; DECLARE v_port INT DEFAULT 0; DECLARE flag_end int DEFAULT 0; DECLARE data_cur CURSOR FOR SELECT `TerminalIndex`,`IpAddress`,`Port` FROM TerTab; DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag_end=1; open data_cur; set v_begin = 1; REPEAT FETCH data_cur INTO v_termid, v_ip, v_port; SELECT COUNT(*) INTO v_num FROM `BaseDataTab` WHERE `IpAddress` = v_ip AND `Port` = v_port AND `DataType` = 3; IF flag_end != 1 AND v_num > 0 THEN set v_end = v_end + 1; -- SET @v_termid=20511; -- test v_termid -- SET @p_ip='192.168.10.15'; -- test p_ip -- SET @p_port='2404'; -- test p_port DROP TEMPORARY TABLE IF EXISTS `temp_term_tab`; CREATE TEMPORARY TABLE `temp_term_tab` SELECT `ID`,`IpAddress`,`Port`,`DestinationIpAddress`,`DestinationPort`,`ReportTime`,`MessageType`,`TextValue`, '' AS `Yflag`, -- CASE -- WHEN 11 <= `MessageType` AND `MessageType` <= 16 THEN 'YXDataTab' -- WHEN 17 <= `MessageType` AND `MessageType` <= 25 THEN 'YKDataTab' -- WHEN 35 <= `MessageType` AND `MessageType` <= 39 THEN 'YCDataTab' -- ELSE NULL -- END AS `YType`, '' AS `Ypoint`, '' AS `Ydesc`, genDotRelated(`MessageType`, SUBSTRING_INDEX(SUBSTRING_INDEX(`TextValue`, ']', 1), '[', -1), 20511, 'TYPE') AS `YType`, genDotRelated(`MessageType`, SUBSTRING_INDEX(SUBSTRING_INDEX(`TextValue`, ']', 1), '[', -1), 20511, 'POINT') AS `Ypoint`, genDotRelated(`MessageType`, SUBSTRING_INDEX(SUBSTRING_INDEX(`TextValue`, ']', 1), '[', -1), 20511, 'DESC') AS `Ydesc`, SUBSTRING_INDEX(SUBSTRING_INDEX(`TextValue`, ']', 1), '[', -1) `YDot`, SUBSTRING_INDEX(`TextValue`, '-', -1) AS `Yval`, '' AS `Yrecord`,'' AS `Ystatus`, '3' AS `Yindex`, '' AS `Yproof` -- FROM `BaseDataTab` WHERE `IpAddress` = '192.168.10.15' AND `Port` = '2404' AND `DataType` = 3 FROM `BaseDataTab` WHERE `IpAddress` = v_ip AND `Port` = v_port AND `DataType` = 3 ORDER BY `ReportTime`; SELECT * FROM `temp_term_tab`; -- 开始处理每一个终端,应用所有的逻辑 call procedure_term(p_logic, v_termid); END IF; UNTIL flag_end END REPEAT; close data_cur; -- select v_begin, v_end, v_value, v_total; END // delimiter ; call procedure_work('517&518&520&521^511'); ################################################################################### DROP PROCEDURE IF EXISTS proc_impl_YX_failure_or_success; delimiter // CREATE PROCEDURE proc_impl_YX_failure_or_success(IN p_logic TINYTEXT) BEGIN DECLARE v_begin INT DEFAULT 0; DECLARE v_end INT DEFAULT 0; DECLARE v_value TINYTEXT DEFAULT ''; DECLARE v_total TINYTEXT DEFAULT ''; -- 处理每一个可配置的存储过程 call procedure_work(p_logic); -- SELECT v_begin, v_end, v_title, v_value, v_total; END // delimiter ; call proc_impl_YX_failure_or_success('517&518&520&521^511'); -- -- 8.2 终端异常分析 -- -- 8.2.1 遥控成功但无遥信变位 -- call proc_impl_YK_exec_success_YX_failure('517&518&520&521^511'); -- -- 8.2.2 开关处于分位但仍有电流 -- call proc_impl_YX_switch_off_alternate_on('1&2|3|4'); -- -- 8.2.3 蓄电池活化状态持续为1 -- call proc_impl_YC_bettery_always_one('6|6', ''); -- -- 8.2.4 三相电流不平衡但无零序电流上报 -- call proc_impl_YC_alternate_imbalance_none_zreo( ); -- -- 8.2.5 蓄电池电压突变 -- call proc_impl_YC_bettery_voltage_jump('3&3', '24'); -- -- 8.2.6 某一终端遥测值长时间保持不变 -- call proc_impl_YC_longtime_stable('1&2|1&3&4&5|1&3&4&6&7'); -- -- 8.2.7 终端持续上报“故障总”遥信 -- call proc_impl_YX_continue_report_fault('5&5'); -- -- 8.2.8 终端响应速率慢异常分析 -- call proc_impl_YX_response_slowly( ); ################################################################################### -- 主存储过程调用入口,由事件定时器以最小粒度,比如配置事件每分钟定时调用 DROP PROCEDURE IF EXISTS procedure_main; delimiter // #将语句的结束符号从分号;临时改为两个//(可以是自定义) CREATE PROCEDURE procedure_main() BEGIN DECLARE v_begin INT DEFAULT 0; DECLARE v_end INT DEFAULT 0; DECLARE v_value TINYTEXT DEFAULT ''; DECLARE v_total TINYTEXT DEFAULT ''; DECLARE time_cur INT DEFAULT 0; DECLARE time_per INT DEFAULT 0; DECLARE flag_end INT DEFAULT 0; DECLARE data_cur CURSOR FOR SELECT StoredProcedureName FROM PlanTab WHERE PresetCount = CurrentCount; DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag_end=1; -- 1,初始化逻辑消息配置表,在内存中创建表,每一次调用都执行 call procedure_init(); -- 2,刷新定时器的计数,超出已做翻转重置处理 call procedure_plan(); -- 3,遍历 PlanTab 表,找出到期的任务 open data_cur; SET v_begin = 1; REPEAT FETCH data_cur INTO v_value; IF flag_end <> 1 THEN -- 3,开始调用查询到的存储过程,执行已配置并且到期的存储过程接口 SET @proc_call_name = (SELECT v_value); # call proc_impl_YX_failure_or_success(); PREPARE stmt FROM @proc_call_name; EXECUTE stmt; DEALLOCATE PREPARE stmt; END IF; UNTIL flag_end END REPEAT; SELECT v_begin, v_end, v_value, v_total; END // delimiter ; #将语句的结束符号恢复为分号 call procedure_main(); ################################################################################### DROP PROCEDURE IF EXISTS procedure_test; delimiter // CREATE PROCEDURE procedure_test() BEGIN DECLARE v_begin INT DEFAULT 0; DECLARE v_end INT DEFAULT 0; DECLARE v_value TEXT DEFAULT ''; DECLARE v_total TEXT DEFAULT ''; DECLARE v_title TEXT DEFAULT ''; SELECT v_begin, v_end, v_title, v_value, v_total; -- select v_begin, v_end, v_IpAddress,v_TextValue, v_total, v_title; END // delimiter ; call procedure_test(); ################################################################################### -- 每隔一分钟执行一次,开始执行时间为当前时间的下一分钟 DELIMITER // DROP EVENT IF EXISTS event_minute; CREATE EVENT event_minute ON SCHEDULE EVERY 1 MINUTE STARTS DATE_ADD(now(), INTERVAL 1 MINUTE) ON COMPLETION PRESERVE ENABLE DO BEGIN INSERT INTO `BakDataTab` VALUES ('0', '', '0', '', '0', '', '', CURRENT_TIMESTAMP, '0', '0', '0', '0', ''); call procedure_main(); END // DELIMITER ; ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### -- concat字符串连接函数,只要其中一个是NULL,那么将返回NULL -- concat_ws字符串连接函数,只要有一个字符串不是NULL,就不会返回NULL。需要指定分隔符。 DROP PROCEDURE IF EXISTS test_procedure; delimiter // CREATE PROCEDURE test_procedure() BEGIN DECLARE v_begin INT DEFAULT 0; -- default DECLARE v_end INT DEFAULT 0; -- default DECLARE v_value VARCHAR(64) character set utf8 DEFAULT '' ; -- default DECLARE v_total VARCHAR(64) character set utf8 DEFAULT '' ; -- default DECLARE flag_end int DEFAULT 0; DECLARE data_cur CURSOR FOR SELECT name FROM mysql.event; DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag_end=1; open data_cur; set v_begin = 1; -- default REPEAT FETCH data_cur INTO v_value; IF flag_end <> 1 THEN set v_end = v_end + 1; -- default set v_total = CONCAT_WS(',', v_value, v_value); -- todo. END IF; UNTIL flag_end END REPEAT; close data_cur; -- OPEN data_cur; -- set v_begin = 1; -- default -- FETCH data_cur INTO v_value; -- WHILE flag_end <> 1 DO -- set v_end = v_end + 1; -- default -- set v_total = CONCAT_WS(',', v_value, v_value); -- todo. -- FETCH data_cur INTO v_value; -- END WHILE; -- CLOSE data_cur; select v_begin, v_end, v_value, v_total; END // delimiter ; call test_procedure(); ################################################################################### ################################################################################### ################################################################################### ################################################################################### AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### -- 数据表中有自增长主键时,当用SQL插入语句中插入语句带有ID列值记录的时候; -- 如果指定了该列的值,则新插入的值不能和已有的值重复,而且必须大于其中最大的一个值; -- 也可以不指定该列的值,只将其他列的值插入,让ID还是按照MySQL自增自己填; -- 这种情况在进行插入的时候,两种解决方法: -- ①可以把id的值设置为null或者0,这样子mysql都会自己做处理 -- ②手动指定需要插入的列,不插入这一个字段的数据! ################################################################################### ################################################################################### -- FILE权限与SELECE/DELETE/UPDATE等不同,后者是可以具体指定到某个db的某个表的,而FILE则是全局的, -- 即只能通过grant FILE on *.* to 'abcde'@'%'才能使FILE权限对所有db的所有tables生效。 -- 通过grant all on db.* to 'abcde'@'%'不能使指定的user在指定的db上具有FILE权限。 ################################################################################### ################################################################################### -- MySql的CURRENT_TIMESTAMP在创建时间字段的时候 -- DEFAULT CURRENT_TIMESTAMP 表示当插入数据的时候,该字段默认值为当前时间 -- ON UPDATE CURRENT_TIMESTAMP 表示每次更新这条数据的时候,该字段都会更新成当前时间 -- 这两个操作是mysql数据库本身在维护,生成【创建时间】和【更新时间】两个字段,且不需要代码来维护 -- CREATE TABLE `alls_create_time_update_time` ( -- `index` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'INDEX', -- `text` varchar(255) DEFAULT '' COMMENT '内容', -- `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', -- `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' -- ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 注意:MySQL 5.6.5 以及之前的版本不支持同时指定两个自动time字段。 ################################################################################### ################################################################################### -- MySQL错误:删除数据库的时候报错ERROR 1010 (HY000) -- 原因是数据/var/lib/mysql/目录下有除了数据库文件以外的文件,可以cd到其目录,清空后。再drop ################################################################################### ################################################################################### -- 问题说明(修改 variables 变量配置,系统重启后将失效,需要修改配置文件,重启数据库): -- 1,导入文件路径问题,需要修改 secure_file_priv 字段为空,或者指定的某个路径 -- 2,修改创建数据库的默认编码,character_set_server,character_set_database 重启失效。 -- 3, -- 8,忘记密码,修改mysql配置文件 skip-grant-tables 跳过密码检查 -- 9,LOAD DATA 必须针对 用户及访问方式设置 grant file 单独设置,不能针对数据库。 ################################################################################### ################################################################################### ################################################################################### ################################################################################### show variables like 'event%'; show variables like '%char%'; show variables like 'autocommit'; SHOW VARIABLES LIKE 'max_allowed_packet'; SHOW VARIABLES LIKE 'secure_file_priv'; show global variables like "secure_file_priv"; show global variables like 'local_infile'; show variables like 'datadir'; show variables like '%dir%'; show variables like '%log%'; ################################################################################### ################################################################################### ################################################################################### mysql -u root -p mysql -h 127.0.0.1 -P 3306 -uandy -p543604 mysqld_safe --user=mysql --skip-grant-tables --skip-networking ################################################################################### UPDATE mysql.user SET password=PASSWORD('test') WHERE user='test'; UPDATE mysql.user SET password='test' WHERE user='test'; SELECT * FROM mysql.user WHERE user='test'; create user 'hwuser'@'localhost' identified by 'hwuser'; create user 'hwuser'@'%' identified by 'hwuser'; flush privileges; create database HwMsas1000 DEFAULT CHARSET utf8 COLLATE utf8_general_ci; grant all privileges on `HwMsas1000`.* to 'hwuser'@'%' identified by 'hwuser'; grant all privileges on `HwMsas1000`.* to 'hwuser'@'localhost' identified by 'hwuser'; flush privileges; grant file on `TestDev`.* to 'test'@'%' identified by 'test'; grant file on *.* to 'test'@'%' identified BY PASSWORD '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29'; grant file on *.* to 'test'@'localhost' identified BY PASSWORD '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29'; FLUSH PRIVILEGES; ################################################################################### -- 查询所有事件定时器的特定字段信息 select * from mysql.event; SELECT event_name,event_definition,interval_value,interval_field,status FROM information_schema.EVENTS; ################################################################################### -- 更改单个事件定时器的开启关闭 alter event second_event on completion preserve enable;//开启定时任务 alter event second_event on completion preserve disable;//关闭定时任务 -- 开启事件 定时器执行计划 SET GLOBAL event_scheduler = ON; show variables like 'event%'; ################################################################################### set character_set_server=utf8; set character_set_database=utf8; show variables like '%char%'; alter table `BaseDataTab` convert to character set utf8; ################################################################################### -- DROP DATABASE IF EXISTS dataDictDb; CREATE DATABASE IF NOT EXISTS dataDictDb DEFAULT CHARSET utf8 COLLATE utf8_general_ci; USE dataDictDb; -- TRUNCATE table `TypeTab`; delete from TypeTab; alter table `TypeTab` auto_increment=1; -- DROP TEMPORARY TABLE IF EXISTS `temp_event_term`; CREATE TEMPORARY TABLE `temp_event_term` ENGINE=MEMERY SELECT * mysql.event; CREATE TEMPORARY TABLE temp_a (`inId` int auto_increment, b VARCHAR(20)) ENGINE=MEMORY ; CREATE TABLE `TypeTab` (PRIMARY KEY (`Index`),`Index` int NOT NULL AUTO_INCREMENT,`TerminalName` text NOT NULL DEFAULT '') ENGINE=InnoDB DEFAULT CHARSET=utf8; SELECT * INTO OUTFILE 'TypeTab.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM TypeTab; load data local infile "TypeTab.csv" INTO table TypeTab FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n'; load data infile '/var/lib/mysql-files/BaseDataTab.csv' into table BaseDataTab fields terminated by ',' optionally enclosed by '"' escaped by '"' lines terminated by '\n'; load data infile '/tmp/t0.txt' into table t0 character set gbk fields terminated by ',' enclosed by '"' lines terminated by '\n' (`name`,`age`,`description`) set update_time=current_timestamp; SELECT LOAD_FILE('/root/TypeTab.csv') AS csvResult; ################################################################################### SELECT * FROM `temp_event_term`; select SUBSTRING("Hello World",1,3) as test; select SUBSTRING("Hello World",2) as test; ################################################################################### SELECT 'YK[-359]-YKSEFA-0.000000' REGEXP '(YKSEFA)'; ################################################################################### SELECT * FROM BaseDataTab WHERE `ID` IN ( SELECT `ID` FROM YKDataTab ); ################################################################################### SELECT * FROM BaseDataTab WHERE `ID` = 17 AND 'HwMsas1000' IN ( SELECT DATABASE() ); ################################################################################### delete from BakDataTab; alter table `BakDataTab` auto_increment=1; ################################################################################### delete from BakDataTab; alter table `BakDataTab` auto_increment=1; SELECT * FROM BakDataTab WHERE date(BackupTime) >= '2020-03-11'; SELECT * FROM BakDataTab WHERE date(BackupTime) between '2013-01-01' and '2013-01-31'; ################################################################################### SELECT "2020-03-10 19:00:04" + INTERVAL 30 SECOND; SELECT DATE_ADD("1997-12-31 23:59:59",INTERVAL 1 SECOND); SELECT DATE_SUB("1998-01-02", INTERVAL 31 DAY); select TO_DAYS(950501); select TO_DAYS('1997-10-07'); select FROM_DAYS(729669); select DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y'); select DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s'); select DATE_FORMAT('1997-10-04 22:23:00', '%H %k %I %r %T %S %w'); ################################################################################### SELECT FIND_IN_SET(',' ,'YK,20;YX,10;YX,5') pos; SELECT POSITION(',' IN 'YK,20;YX,10;YX,5'); ################################################################################### CREATE TABLE `t_test` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(1) NOT NULL DEFAULT '', PRIMARY KEY (`id`), UNIQUE KEY `idx_name` (`name`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 INSERT INTO t_test (`name`)VALUES('a') REPLACE INTO t_test (`name`)VALUES('a')