mysql创建存储过程失败_mysql创建存储过程的坑

1.使用的工具:navicat,mysql版本:5.0

2.创建存储过程,注意传的值的大小要定义好,不然会报1064错误:

bb29b7f88a043a852c8a31025523dd05.png

3.navicat创建的过程已经默认定义好了结束标志为空格,不要额外定义//,$$等结束标志了

51b7c5ca807316e06cbf0c988faaaa23.png

4.当需要知道一个sql语句影响的行数时,注意用select 和update/delete时是不一样的。

判断Select得到的行数用found_rows()函数进行判断。

判断Update或Delete影响的行数用row_count()函数进行判断,这里需要注意,如果Update前后的值一样,row_count则为0,而不像SqlServer里的@@rowcount或Oracle里的rowcount,只要update到行,影响的行数就会大于0,而无论update前后字段的值是否发生了变化。

6661cacf182e85b5d701adef999c640a.png

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.游标的跳出本次循环:

ff645b241324e761832aee420020f857.png

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值