MySql存储过程/函数

MySQL创建函数失败提示1418解决:
	show variables like '%func%'; -- 如果Value处值为OFF,则需将其开启
	set global log_bin_trust_function_creators=1;

函数

  • 创建函数1
-- 按照 p_delimiter 对 p_str 进行分割,返回分割后字符串的个数
CREATE DEFINER=`root`@`%` FUNCTION `fun_demo1`(
	`p_str` varchar(225), -- 参数1
	`p_delimiter` varchar(1) -- 参数2
) RETURNS int(11)
BEGIN
  return 1 + ( length(p_str) - length( replace(p_str, p_delimiter, '') ) ); 
END;
  • 创建函数2
-- 按照 p_delimiter 对 p_str 进行分割,返回 p_index 下标处的字符串
CREATE DEFINER=`root`@`%` FUNCTION `fun_demo2`(
	p_str varchar(1000), -- 参数1
	p_delimiter varchar(5), -- 参数2
	p_index int -- 参数3
) RETURNS varchar(255) CHARSET utf8
BEGIN
  declare result varchar(255) default '';
  set result = reverse(substring_index(reverse(substring_index(f_str,f_delimiter,f_index)),f_delimiter,1));
  return result;
END;

存储过程

  • 创建存储过程1
-- 如果存在就删除
DROP PROCEDURE IF EXISTS pro_demo1;
-- 创建存储过程
CREATE DEFINER=`erp`@`%` PROCEDURE `pro_demo1`(
	IN field_1 int(11), -- 入参1
	IN field_2 decimal(10,3) -- 入参2
)
BEGIN 
	DECLARE done INT DEFAULT 0; -- 自定义全局变量
	DECLARE counter LONG DEFAULT 10000; -- 自定义全局变量
	DECLARE userKey varchar(64); -- 自定义全局变量
	DECLARE userName varchar(32); -- 自定义全局变量
	-- 创建基于demo1表的游标
	DECLARE demo1_sursor CURSOR FOR select user_key,user_name from demo1 order by id asc;
	-- 异常处理
	DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done = 1;
	-- 开启游标
	OPEN demo1_sursor;
		REPEAT
		    -- 读取游标中的数据复制到自定义变量
			FETCH demo1_sursor INTO userkey,userName;
				IF done != 1 THEN
				    -- 修改自定义变量
					set counter = counter + 1;
					-- 查询变量
					-- SELECT field_1,field_2,userkey,userName,groupCode;
					INSERT INTO table1(`counter`, `userKey`, `userName`, `field_1`, `field_2`) 
					VALUES (counter, userKey, userName, field_1, field_2);			
			 END IF;
		UNTIL DONE END REPEAT;
	-- 关闭游标
	CLOSE demo1_sursor ;
END;
  • 创建存储过程2
DROP PROCEDURE IF EXISTS pro_demo2;
CREATE DEFINER=`erp`@`%` PROCEDURE `pro_demo2`()
BEGIN
	DECLARE done INT DEFAULT 0;
	DECLARE field_1 int(6);
	DECLARE field_2 decimal(6);
	DECLARE demo2_sursor CURSOR FOR select field_1,field_2 from demo2;
	--
	DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done = 1;
	--
	OPEN demo2_sursor;
		REPEAT
			FETCH demo2_sursor INTO field_1,field_2;
			IF done != 1 THEN
				call pro_demo1(field_1,field_2); -- 调用pro_demo1存储过程
			END IF;
		UNTIL DONE END REPEAT;
	CLOSE demo2_sursor ;
END;
  • 创建存储过程3
DROP PROCEDURE IF EXISTS pro_demo3;
CREATE DEFINER=`root`@`%` PROCEDURE `pro_demo3`()
BEGIN 
	DECLARE arrayLen INT DEFAULT 0; 
	DECLARE arrayIndex INT DEFAULT 0;
	SET arrayLen = fun_demo1( '1,2,3,4', ','); -- 调用函数
	WHILE arrayIndex < arrayLen -- WHILE循环
	DO
	  SET arrayIndex = arrayIndex + 1;
	  SELECT arrayIndex;
	END WHILE;
END;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大能嘚吧嘚

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

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

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

打赏作者

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

抵扣说明:

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

余额充值