将就用一下Mysql的存储过程
和Oracle相比,Mysql存储过程使用非常之不方便,没有什么可用的调试手段。但我已经在一个应用里已经使用了它,停止使用代价太高,只能将就用下去。我的Mysql版本5.6。
1、调试的将就办法。Mysql没提供有效的调试手段,但我们可以建立一个临时表,字段根据需要保存的内容来设置,应该至少包括时间标记,状态标记等。在存储过程运行中需要保存变量值时把相关值写入到临时表中。最后查看临时表就可以知道运行过程中变量的变化情况。或者观察分支流程的运行情况,可以在相关流程向临时表写入标记,这样就可以知道存储过程的具体运行情况。
2、有了调试手段,发现MMyqsqlysql存储过程运行中居然有一些莫名其妙的问题。
下面这段代码的意思是,有旧记录则把它转储一下,接着删除旧记录。然后,不管有没有旧记录存在,最后都插入一条新记录。
。。。
为CURRENT_ATINC赋值。。。
。。。
if not done then
#进行记录转储
insert into ys_bz_e_lib_bk
( id, jlrq, xmmc, xmjg, xm, bzh)
select id, jlrq, xmmc, xmjg, xm, bzh
from ys_bz_e_lib e
where e.atinc = CURRENT_ATINC;
#删除旧记录
delete from ys_bz_e_lib where atinc = CURRENT_ATINC;
end if;
#插入新记录
insert into ys_bz_e_lib ( id, jlrq, xmmc, xmjg, xm, bzh)
values( mainID, bzrq, jcxm, jcjg, xm, bzh);
这流程看着是没有问题,但实际执行的结果,转储过去的总是最后插入的那条。
用前面的调试办法观察,首先确定流程的确按设想次序执行了,而且进行转储之前读取一下已经存在的记录
SELECT e.id, e.jlrq, e.xmmc, e.xmjg, e.xm, e.bzh
INTO t_id, t_rq, t_xmmc, t_xmjg, t_xm, t_bzh
from ys_bz_e_lib e
where e.atinc = CURRENT_ATINC;
读取出来的记录内容的确是旧记录,但最终执行的结果还是转转储了新记录。
真真奇也怪哉,可能是Mysql在编译存储过程的时候进行了什么优化,但这个优化造成了流程执行的错误。不去追究,就当这是Mysql的bug了。
既然可以读取出来旧记录,那就麻烦一下,不再用语句转储的办法,改用先把旧记录读取出来保存到时临时变量,然后用这些临时变量生成插入语句,把旧数据插入到备份表。
很笨,但解决了问题。