zoukankan      html  css  js  c++  java
  • 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

    我不是程序员,我只是程序的搬运工
  • 相关阅读:
    Centos 7 开放查看端口 防火墙关闭打开
    idea将项目导出为war包
    webstorm 注册服务器
    centos 6.4系统双网卡绑定配置详解
    centos所有版本镜像下载地址
    浅谈Nginx负载均衡与F5的区别
    勒索病毒应急响应计划
    Python网络编程常用代码
    Flask debug 模式 PIN 码生成机制安全性研究笔记
    Pythonic定义
  • 原文地址:https://www.cnblogs.com/keith0/p/12778982.html
Copyright © 2011-2022 走看看