yangli-1128

mysql 存储过程

1.变量赋值:

方式一:set @memid = (SELECT member_id from member_info where member_account = memberAccount limit 1);

方式二:select fund_id ,balance_income into @fundid, @balanceincome from member_fundinfo where member_id=@memid and identity_type = 1 limit 1 ;

2.终止运行

使用leave

label_pro:BEGIN

    select fund_id ,balance_income into @fundid, @balanceincome from member_fundinfo where member_id=@memid and identity_type = 1;

    IF @fundid is null || @balanceincome is null THEN

         SELECT 'fundid balanceincome 错误' as error,@fundid as fundid,@balanceincome as balanceincome;

         leave label_pro;

    END IF;

END

3.输入参数使用

不能带@符号;

CREATE DEFINER=`root`@`%` PROCEDURE `addmoney`(IN memberAccount varchar(30),in memberId bigint(20),in money decimal(18,2),in dingdingNo varchar(50))

label_pro:BEGIN

-- 会员查找

    set @memid = (SELECT member_id from member_info where member_account = memberAccount limit 1);

      IF @memid is null || @memid != memberId THEN

         SELECT 'memberId 错误' as error,@memid as dataid,memberId as inputid;

         leave label_pro;

    END IF;

END

4.异常处理

方式一:一直运行在最后进行rollback

  DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=-1;

--------------------------

  IF t_error = -1 THEN  

    SELECT '执行失败';

    ROLLBACK;  

  ELSE  

    SELECT '执行成功';

    COMMIT;  

  END IF;

-------------------------------

方式二:未测试

DECLARE errno INT;

DECLARE msg TEXT;

DECLARE EXIT HANDLER FOR SQLEXCEPTION

BEGIN

--5.6之后才可以使用

    GET DIAGNOSTICS CONDITION 1 errno = MYSQL_ERRNO, msg = MESSAGE_TEXT;

    SELECT '执行异常',@errno,@msg;

    ROLLBACK;

END;

https://dev.mysql.com/doc/refman/5.6/en/get-diagnostics.html

https://dev.mysql.com/doc/refman/5.7/en/get-diagnostics.html

5.事务处理

开启事务

    START TRANSACTION;

回滚

    ROLLBACK;

提交

    COMMIT;  

事务中请不要使用 create table等会执行隐式事务提交的命令,否则在会导致隐式提交事务,而不会回滚操作。


6.手动触发异常

SIGNAL SQLSTATE '45001'SET MYSQL_ERRNO=2000,MESSAGE_TEXT='故意触发异常';

7.临时表

START TRANSACTION;

insert into test_table(name) values('张三');

drop temporary table if exists tmp_table;  -- 如果这里替换为 drop table if exists tmp_table同样可以删除临时表,但是会导致事务自动提交

create temporary table tmp_table select * from test_table;

ROLLBACK;

https://www.cnblogs.com/sdlz/p/9061144.html

上一篇 下一篇
评论
©yangli-1128 | Powered by LOFTER