mysql創建存儲過程的坑


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM