67自学网

SQL语句的定时任务


在之前做了一个项目,需要做每月的定时设置。使用PHP是比较难实现。现在可以用到mysql的语句实现定时操作。

BEGIN
	DECLARE agent_flag,sql_flag TINYINT DEFAULT 1; -- 声明变量用于判断SQL执行情况	
	DECLARE aa,v_userid,v_content		varchar(32); -- 声明变量
	DECLARE count INT; -- 声明select是否有
	DECLARE agent_cur CURSOR FOR SELECT userid, content FROM say where addtime = 1; -- 声明游标的值可以有多个,遍历的时候可根据游标的数量遍历
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET agent_flag = 0; -- 捕捉select执行,如果select执行为空agent_flag=0,现在默认为1
	SET aa = 1; -- 定义aa=1
	open agent_cur; -- 打开游标
	agent_loop: LOOP -- 开始遍历agent_loop
		FETCH agent_cur INTO v_userid, v_content; -- 启动游标,获得游标的第一列的值
		IF agent_flag = 0 THEN LEAVE agent_loop; END IF; -- 判断捕捉agent_flag是否为0
		select count(1) into count FROM say WHERE addtime = 1; -- 执行select,执行后的数量赋值给count,若无则agent_flag=0
		IF count = 0 THEN ITERATE agent_loop; END IF; -- 若count=0就跳过执行从新开始

		BEGIN
			DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET sql_flag = 0; -- 捕捉sql执行,若下面的insert或update有错,sql_flag=0
			START TRANSACTION; -- 启动事务若下面的insert或update有错可以回滚
				INSERT INTO say(userid, content, addtime) VALUES(v_userid,v_content,aa); -- SQL语句
				SET aa = aa + 1; -- 增加aa
				UPDATE say set addtime = aa WHERE addtime = 1; -- SQL语句
			IF store_flag = 1 THEN -- 若SQL正常实行store_flag=1,若有错store_flag=0
				COMMIT; -- 确定事务,实现sql
			ELSE 
				ROLLBACK; -- 有错就回滚
			END IF;
			INSERT INTO say(userid, content, addtime) VALUES(123,123, 123); -- SQL语句
		END;
	END LOOP; -- 结束遍历
	close agent_cur; -- 关闭游标
END



侧栏导航