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

我不是程序员,我只是程序的搬运工
原文地址:https://www.cnblogs.com/keith0/p/12778982.html