MySQL定义函数和存储过程
-- 默认为off ,等价于 0
-- 开启binlog日志记录时,是否信任 创建函数
-- 默认情况下,为了防止主机和从机中定义的函数不一致,不允许用户自定义函数
-- 如果希望自定义函数,必须将 log_bin_trust_function_creators=on(1)
SHOW VARIABLES LIKE '%log_bin_trust_function_creators%'
set global log_bin_trust_function_creators=1;
在mysql中定义一个函数:
定义一个一个名为 rand_num的函数,接收两个int类型的参数,返回一个长度不超过11位的int类型的结果!
返回 [from_num, to_num]的一个随机值!
-- /* 注释 */
-- /*!versioncode xxxx */ 当前数据库的版本号 >=versioncode,就执行xxx,否则不执行
-- 50003 等价于 mysql 5.003版本
/*!50003 DROP FUNCTION IF EXISTS `rand_num` */;
SELECT VERSION()
--指定sql语句结束的分隔符,指定$$是一条sql语句的结尾 ,默认;
DELIMITER $$
-- 函数定义的语法:CREATE FUNCTION 函数名(参数列表) RETURNS 返回值类型 BEGIN 函数体 END
/*!50003
--
CREATE DEFINER=`root`@`localhost` FUNCTION `rand_num`(from_num INT ,to_num INT) RETURNS int(11)
BEGIN
-- 声明一个局部变量i,int类型,默认初始值0
DECLARE i INT DEFAULT 0;
-- 改变i的值
SET i = FLOOR(from_num +RAND()*(to_num -from_num+1)) ;
--返回 i
RETURN i;
END
*/$$
DELIMITER ;
存储过程,没有返回值,函数有返回值!
定义一个名为 init_data的存储过程,接收四个参数:
(do_date_string VARCHAR(20),order_incr_num INT,user_incr_num INT,if_truncate BOOLEAN)
do_date_string : 存储过程调用的日期
order_incr_num : 新增多少条订单
user_incr_num : 新增多少个用户
if_truncate: 是否先清空表,再插入!
true,会先清空表,再插入
false: 不清空表
/*!50003 DROP PROCEDURE IF EXISTS `init_data` */;
DELIMITER $$
-- CREATE PROCEDURE 存储过程名(参数列表) BEGIN 存储过程体 END
/*!50003
CREATE DEFINER=`root`@`localhost` PROCEDURE `init_data`(do_date_string VARCHAR(20),order_incr_num INT,user_incr_num INT,if_truncate BOOLEAN)
BEGIN
-- 声明三个变量
DECLARE user_count INT DEFAULT 0;
DECLARE sku_count INT DEFAULT 0;
DECLARE do_date VARCHAR(20) DEFAULT do_date_string;
-- IF 和 END IF 等价于 if(){}
-- 如果if_truncate是true,先清空以下四张表
IF if_truncate THEN
TRUNCATE TABLE order_info ;
TRUNCATE TABLE order_detail ;
TRUNCATE TABLE user_info ;
TRUNCATE TABLE payment_info;
END IF;
-- 如果user_incr_num 不为0 , 调用insert_user存储过程
IF user_incr_num != 0 THEN
-- insert_user 会在do_date日期下,新增 user_incr_num个数量的用户
CALL insert_user(do_date,user_incr_num);
END IF;
-- 先运行 SELECT COUNT(*) FROM user_info,再将结果赋值给 user_count变量!
SELECT COUNT(*) INTO user_count FROM user_info;
-- 调用更新order表,插入订单,插入支付数据三个存储过程
CALL update_order(do_date);
CALL insert_order(do_date,order_incr_num,user_count);
CALL insert_payment(do_date);
END */$$
DELIMITER ;