存储过程和关联的存储过程都不存在'value_1_'这个字段mysql
可使用navicat的命令窗口执行sql
反馈出真实的报错缘由oop
因为customer_po_no_ 变量设置了长度2000 ,游标循环叠加的customer_po_no_ 的时候超出了长度 ,在循环内添加spa
IF LENGTH(customer_po_no_) >= 1950 THEN LEAVE archive_loop; end IF;
便可;code
明明获取了游标,但就是只执行了几个,代码表面上看不出问题blog
所有执行大概要一个小时,结果只执行了几秒,检查数据,发现只执行了前面几个;索引
这个时候,能够经过每执行一次,就更新或者插入数据到一张表里面,观察那张表的规律,看下执行到哪一个位置游标就直接跳出整个循环it
如:class
再尝试单独执行断开那个数据,观察有没有报错或者那个数据有什么特殊的效率
这个时因为 ****Diff() 那个存储过程里面有一个变量的设置为 varchar(200), 那个变量会接收GROUP_CONCAT(customer_po_no) 的数据;把修改为 varchar(20000)便可;
能够在my.ini 里面设置须要的长度,重启mysql
#group_concat 的长度
group_concat_max_len=102400;
也能够;
SET GLOBAL group_concat_max_len=102400; SET SESSION group_concat_max_len=102400;
如:
select GROUP_CONCAT(a) from a_tab limit 5;
获取的结果也是所有的;
须要套多一个select 在外面才可使用
select GROUP_CONCAT(a SEPARATOR ',') from (select c.a as a from a_tab c limit 5) t;
将获取的变量强制格式转换为char 便可
select GROUP_CONCAT(CAST(a AS char) SEPARATOR ',') from (select c.a as a from a_tab c limit 5) t;
虽然即便使用没有索引的也是在一秒以内,但对于复杂运做,数据量大的存储过程,的时候,原本一个小时能够完成执行,结果10多个小时也执行不下,误觉得是死循环;
因为有索引的表是分开归档和没有归档,虽然获取数据要分开两次,还要条件判断执行,但总体效率比直接用没有中间表快不少