首页 > 数据库 >将就用一下Mysql的存储过程

将就用一下Mysql的存储过程

时间:2022-11-09 20:45:02浏览次数:40  
标签:存储 xm 一下 记录 转储 Mysql ys bzh

和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了。

既然可以读取出来旧记录,那就麻烦一下,不再用语句转储的办法,改用先把旧记录读取出来保存到时临时变量,然后用这些临时变量生成插入语句,把旧数据插入到备份表。

很笨,但解决了问题。

标签:存储,xm,一下,记录,转储,Mysql,ys,bzh
From: https://www.cnblogs.com/sundp/p/16875112.html

相关文章

  • MySQL: 备份 & 导入备份
    备份​​mysqldump​​​是​​MySQL​​​自带的逻辑备份工具。它的备份原理是通过协议连接到​​MySQL​​​数据库,将需要备份的数据查询出来,将查询出的数据转换成对应的......
  • Spring Boot:The new driver class is com.mysql.cj.jdbc.Driver
    以前使用的是​​5.1.31​​​的​​mysql​​​驱动,后面使用​​SpringBoot​​​默认的​​mysql​​驱动,启动就报错了:Loadingclass`com.mysql.jdbc.Driver'.Thisis......
  • mysqldump备份报错 'max_allowed_packet'
    1.mysqldump备份报错[root@176-238bin]#./mysqldump-uroot-p'123456'--default-character-set=utf8--opt-R-Econfluence>/data/backup/20221109/confluence202......
  • Mysql
    主从复制1.什么是主从复制主从复制是将主数据库的DDL、DML操作通过binlog(二进制日志)的方式传输到从数据库上,然后将这些日志重新执行。2.主从复制的作用数据备份读写......
  • mysql批量制造数据
    DELIMITER$$CREATEPROCEDUREprocess_test3()BEGINDECLAREyouridINT;SETyourid=100000;WHILEyourid<2000000DOINSERTINTOtt(order_no)VALUES(yourid)......
  • VS_QT——连接MySQL数据库
    原文链接连接2链接3           ......
  • mysql rpm安装
    目录mysqlrpm安装安装包下载安装mysqlmysqlrpm安装安装包下载官网:https://dev.mysql.com/downloads/mysql/下载完成后你应该拥有下面四个包文件安装mysql//安装......
  • 有点私心,记录一下课后的学习笔记(数据结构)
    2022.11.09课后——数据结构笔记主要分为两部分,第一部分关于拓扑排序;第二部分关于关键路径拓扑排序(AOV-网的相关基本思路)利用图进行拓扑排序(排序结果不唯一)首先找到图......
  • mysql mysqldump常见报错
    目录mysqlmysqldump常见报错ERROR2006(HY000)atline5922:MySQLserverhasgoneawaymysqlmysqldump常见报错ERROR2006(HY000)atline5922:MySQLserverha......
  • Docker安装Mysql8
    ​​CentOS7.9安装Docker​​拉取mysql镜像搜寻仓库里面有那些镜像dockersearchmysql我们拉取mysql:latest的镜像dockerpullmysql:latest查看镜像但是我们不知道m......