一. 执行报错内容不是真实的报错内容
存储过程和关联的存储过程都不存在'value_1_'这个字段
可以使用navicat的命令窗口执行
反馈出真实的报错原因
由于customer_po_no_ 变量设置了长度2000 ,游标循环叠加的customer_po_no_ 的时候超出了长度 ,在循环内添加
IF LENGTH(customer_po_no_) >= 1950 THEN
LEAVE archive_loop;
end IF;
即可;
二. 没有报错但获取的游标没有全部执行完直接退出,提示执行成功
明明获取了游标,但就是只执行了几个,代码表面上看不出问题
全部执行大概要一个小时,结果只执行了几秒,检查数据,发现只执行了前面几个;
这个时候,可以通过每执行一次,就更新或者插入数据到一张表里面,观察那张表的规律,看下执行到哪个位置游标就直接跳出整个循环
如:
再尝试单独执行断开那个数据,观察有没有报错或者那个数据有什么特殊的
这个时由于 ****Diff() 那个存储过程里面有一个变量的设置为 varchar(200), 那个变量会接收GROUP_CONCAT(customer_po_no) 的数据;把修改成 varchar(20000)即可;
三. GROUP_CONCAT 的长度限制,以及完全找不到原因的报错
1. group_concat 默认长度时1024,
可以在my.ini 里面设置需要的长度,重启mysql
#group_concat 的长度
group_concat_max_len=102400;
也可以;
SET GLOBAL group_concat_max_len=102400;
SET SESSION group_concat_max_len=102400;
2. group_concat 是不可以直接使用limit 限制长度
如:
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;
3. group_concat 不明原因提示超长,明明获取的数据是绝对不会超长的
将获取的变量强制格式转换为char 即可
select GROUP_CONCAT(CAST(a AS char) SEPARATOR ',')
from (select c.a as a from a_tab c limit 5) t;
四. 对于千万级别的数据,抽取数据的语句一定要使用索引
虽然即使使用没有索引的也是在一秒之内,但对于复杂运作,数据量大的存储过程,的时候,本来一个小时可以完成执行,结果10多个小时也执行不下,误以为是死循环;
由于有索引的表是分开归档和没有归档,虽然获取数据要分开两次,还要条件判断执行,但整体效率比直接用没有中间表快很多