一、有编程经验的人应该很熟悉mysql数据库存储过程。 首先,让我谈谈它的优点。
可以更快地执行。 如果项目需要大量sql语句或重复执行,则存储过程在此时将具有优势,而且运行速度比程序快,性能也更好
它还支持图案化设计。 这意味着,一旦创建,就可以通过定时器多次重复调用,还可以减少开发人员的工作量
安全性很高,只能将此用户设置为具有指定存储过程的使用权
您可以封装数据逻辑和业务规则,以便用户只能以开发人员和数据库管理员使用的方式访问数据和对象
通过禁止查询和修改数据,可以防止用户恶意破坏数据或意外执行查询,从而避免服务器或网络性能降低。
二、来吧,上重点,储藏过程,这是宝宝用洪荒之力写的,以前没写过,第一次写
比根
DECLARE done INT DEFAULT 0;
默认(11 )默认空值;
缺省值(50 )缺省空值;
默认角色(50 )默认空值;
declarecurcursorforselectidfromproductitem _ infowhereendtime=curdate (andstate=1;
declarecontinuehandlerfornotfoundsetdone=1;
OPEN cur;
REPEAT
FETCH cur INTO tid;
IF NOT done THEN
selectzjeintotmoneyfromv _ productzcswhereproductid=tid;
if tmoney is null then
set tmoney=0;
end IF;
selectcollectmoneyintototalmoneyfromproductitem _ infowhereid=tid;
IF tmoney=totalMoney THEN
updateproductitem _ info setstate=3where id=tid;
ELSE
SET done=0;
END IF;
END IF;
UNTIL done END REPEAT;
结算;
COMMIT;
结束
注意:如果我先说一下我写这个过程的含义,为了修正productitem_info的state=3这个状态,我将使用endtime=Curdate(andstate=1; 只有在这些条件必须为tmoney=totalMoney时,才能修改state状态。 而且,里面代码的意思简单地说,DECLARE是定义变量的意思,我理解的相当于Java中的int; DECLARE游标名称CURSOR FOR查询语句。 这是具有唯一名称的声明游标。 open打开以前声明的光标; REPEAT….UNTIL done END REPEAT; 我理解的是Java中的for循环,也可以使用while循环; FETCH游标名称INTO变量[,变量2] …此语句用指定的打开游标读取下一行,并将光标指针前进(如果存在下一行)。 关闭关闭光标; commit提交这些数据
三.计时器
只要计时器在数据库中创建事件并定期执行上述存储过程就可以了。
请先调查这个事件的状态,看看是否接通
showvariableslike ' event _ scheduler '
如果为“off”,则必须执行步骤2。 如果为“on”,则不需要步骤2
2 .在MySQL程序目录中找到my.ini文件,添加项event_scheduler=1,保存后重新启动MySQL服务即可。 重启服务可以在服务管理中找到; 或者用脚本实现,然后打开event_scheduler sql命令
SET GLOBAL event_scheduler=ON;
SET @@global.event_scheduler=ON;
SET GLOBAL event_scheduler=1;
SET @@global.event_scheduler=1;
3 .第三步很重要。 请一定要记住。 正在查询中执行以下代码: 不是在事件中。 请一定要记住。 我花了洪荒的力气才意识到是这样的懦弱错误。 请大家不要走我的弯路
set global event_scheduler=1;
createeventifnotexistsauto _ product info _ stateonscheduleevery1secondoncompletionpreservedocallproduct _ info _ state (
slect * from information _ schema.events;
altereventauto _ product info _ stateoncompletionpreserveenable;
注:这将每秒运行一次
createeventifnotexistsauto _ product info _ stateonscheduleevery1day starts date _ add (concat (current _ date ),' 003333 interval0second (oncompletionpreserveenabledocallproduct _ info _ state ) )
注意:这将在每晚零时执行
4 .开始时间任务
altereventauto _ product info _ stateoncompletionpreserveenable;
关闭时间任务
altereventauto _ product info _ stateoncompletionpreservedisable;
大工作到此结束。 但是,我必须找出我以前的错误和解决方案。 因为,我搜索了很久。 网上有人问过这个问题,但没有人回答。 当时心都碎了。 所以,我必须贴出这个错误
是的,这个错误! 我头大了。 好在我是个积极向上的好青年。 否则你就得抑郁症。 解决方案其实很有趣。
解决方案如上所述。 请不要让代码在事件中执行。 创建新查询并在查询中执行。 事件只写名字,写想定期执行的表和存储过程就可以了
CALL product_info_state (
如果大家有什么好的意见和建议,欢迎大家的留言。 谢谢