一. 執行報錯內容不是真實的報錯內容
存儲過程和關聯的存儲過程都不存在'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多個小時也執行不下,誤以爲是死循環;
由於有索引的表是分開歸檔和沒有歸檔,雖然獲取數據要分開兩次,還要條件判斷執行,但整體效率比直接用沒有中間錶快很多