MYSQL存储过程语法遇到的坑(持续更新...)

判断当前过程是否存在

DROP PROCEDURE IF EXISTS `proc_test`;

创建PROCEDURE

CREATE PROCEDURE `proc_test` (
	IN report_year VARCHAR (50),
	#;//报表年份
	IN date_type VARCHAR (50),
	#;//日期范围
	IN report_date VARCHAR (50),
	#;//报表日期
	IN finance_status VARCHAR (50),
	#报表维度预测或者实际
	IN subject_type VARCHAR (50),
	# Excel模版类型
	IN user_id VARCHAR (200),
    #用户id
    OUT o_err_code VARCHAR (50),
	#错误编码
	OUT o_err_msg VARCHAR (4000)
	#错误信息
)

声明游标、变量


# --声明游标 纯sql语法,可以多列,(多列对应多个接收参数)
DECLARE cur_index CURSOR FOR SELECT t.xx_name FROM xx_table t;
# 游标接收用参数
DECLARE vc_name VARCHAR (500);
/*标识指针是否走完*/
DECLARE is_down INT DEFAULT FALSE;
# 错误标识

声明变量、给变量赋值

####--------声明遍历并赋值 @开头 --------------------
SET @l_id = null;
####--------输出参数赋值--------------------
SET o_err_code = '0';
SET o_err_msg = '运行成功';

异常捕获

# 游标为空则修改标识
DECLARE CONTINUE HANDLER FOR NOT FOUND SET is_done = TRUE;
#异常 下面这两个是重点,捕捉MySQL的错误代码和内容,(可以自行写入日志表)
-- -------------------------------------------------------------------
declare CONTINUE handler for sqlwarning 
begin 
    GET DIAGNOSTICS condition 1 o_err_code = RETURNED_SQLSTATE, o_err_msg= MESSAGE_TEXT;
    select o_err_code,o_err_msg;
end;

declare CONTINUE handler for sqlexception 
begin 
    GET DIAGNOSTICS condition 1 o_err_code = RETURNED_SQLSTATE, o_err_msg= MESSAGE_TEXT;
     select o_err_code,o_err_msg;
end;

打开、遍历、关闭游标


#--打开游标
OPEN cur_index;
read_loop :LOOP
	FETCH cur_index INTO vc_name;
# 标识判断是否结束游标
IF is_done THEN
	LEAVE read_loop;
END IF;
#---此处逻辑依据业务情况而定
IF is_flag THEN
SET is_flag = FALSE;

ELSE
 SELECT concat('vc_name ==',vc_name);
END IF;
END LOOP;
CLOSE cur_index;

打开事务管理

START TRANSACTION;

IF o_err_code = 1 THEN    
   ROLLBACK;    
ELSE    
   COMMIT;    
END IF;    

获取插入主键(特殊情况)

SELECT auto_increment INTO @l_id
FROM information_schema.`TABLES` 
WHERE TABLE_SCHEMA= DATABASE() 
AND TABLE_NAME='xx_table';  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小狐狸和小兔子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值