1.使用的工具:navicat,mysql版本:5.0
2.創建存儲過程,注意傳的值的大小要定義好,不然會報1064錯誤:

3.navicat創建的過程已經默認定義好了結束標志為空格,不要額外定義//,$$等結束標志了

4.當需要知道一個sql語句影響的行數時,注意用select 和update/delete時是不一樣的。
判斷Select得到的行數用found_rows()函數進行判斷。
判斷Update或Delete影響的行數用row_count()函數進行判斷,這里需要注意,如果Update前后的值一樣,row_count則為0,而不像SqlServer里的@@rowcount或Oracle里的rowcount,只要update到行,影響的行數就會大於0,而無論update前后字段的值是否發生了變化。

5.區分於函數,沒有return,返回的是你最后一條sql數據的內容。
6.寫存儲過程時,因為mysql的事務是自動提交的,而且不保證多條sql語句的原子性,也就是如果插入兩條數據然后第二條報錯第一條還是可以插入的,所以在這里要實現事務管理,實現整體的原子性和回滾操作,這個事務和spring的事務管理是一致的,在boot中@Transational注解的方式實現起來方便一些,通過下邊語句實現事務的提交和回滾操作。
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;
START TRANSACTION;
IF t_error = 1 THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
6.游標的跳出本次循環:

7.寫了一個循環取數的過程,功能可以實現,有待優化,注意變量的使用問題,有的時候前邊的語句修改了后邊沒注意的話就有可能用錯數值,寫的時候最好層次分明,可讀性會提高,如果想當作函數來使用的話只需要加一個return就好。
BEGIN
DECLARE lo int(10);
DECLARE i int(10) ;
DECLARE len int(10);
DECLARE newLo VARCHAR(100)DEFAULT 0;
DECLARE nextLo int(10);
DECLARE re INT(100);
DECLARE j int(10) DEFAULT 1;
DECLARE h int(10) DEFAULT 1;
DECLARE f int(10);
DECLARE d int(10);
set lo = (SELECT LOCATE(id,numbers));
set len =(SELECT CHAR_LENGTH(numbers));
set i = len-lo ;
if i> count then
WHILE count>0 do
set nextLo = (SELECT SUBSTR(numbers,lo+j,1));
SET newLo = (SELECT CONCAT(newLo,nextLo));
set j = j+1;
SET count =count-1;
END while;
END if;
if i< count then
WHILE i>0 do
set nextLo = (SELECT SUBSTR(numbers,lo+j,1));
SET newLo = (SELECT CONCAT(newLo,nextLo));
set j = j+1;
SET i = i-1;
END while;
SET f = (SELECT FLOOR((count-len+lo)/len));
SET d = (SELECT MOD((count-len+lo),len));
if f >0
THEN
WHILE f>0
do
SET newLo = (SELECT CONCAT(newLo,numbers));
SET f= f-1;
END while;
WHILE d>0
do
SET nextLo = (SELECT SUBSTR(numbers,h,1));
SET newLo = (SELECT CONCAT(newLo,nextLo));
SET h= h+1;
set d = d-1;
END while;
END if;
IF f=0
THEN
WHILE d>0
do
SET nextLo = (SELECT SUBSTR(numbers,h,1));
SET newLo = (SELECT CONCAT(newLo,nextLo));
SET h= h+1;
set d = d-1;
END while;
END if;
END if;
SELECT newLo;
END
