MYSQL存储过程语法遇到的坑(持续更新...)
程序员文章站
2024-01-14 21:25:16
...
判断当前过程是否存在
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';