欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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';