存儲過程和關聯的存儲過程都不存在'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多個小時也執行不下,誤覺得是死循環;
因爲有索引的表是分開歸檔和沒有歸檔,雖然獲取數據要分開兩次,還要條件判斷執行,但總體效率比直接用沒有中間錶快不少