mysql函数与mysql存储过程
mysql函数function是mysql内部封装好逻辑的一个数据库对象,一般有返回值。
mysql存储过程procedure与mysql函数类似,是存储复杂程序,编译创建并保存给定参数调用执行的。
mysql 函数 function
查看函数定义:show create function fn_name;
删除函数:drop function fn_name;
函数定义结构体:
CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
BEGIN
函数体
END
无参数的函数
DELIMITER $$ DROP FUNCTION IF EXISTS `blog_max_id`; CREATE DEFINER = `root`@`localhost` FUNCTION `blog_max_id`() RETURNS int(11) COMMENT '获取博客最大的id值' BEGIN #Routine body goes here... # 定义 DECLARE fid int; # 赋值 SELECT MAX(`id`) FROM `sdb_blog` INTO fid; # 返回 RETURN fid; END $$ DELIMITER ;
直接调用的使用方法:
SELECT blog_max_id()
有参数的函数
DELIMITER $$ DROP FUNCTION IF EXISTS `blog_densen_nums`; CREATE DEFINER = `root`@`localhost` FUNCTION `blog_densen_nums`(dense varchar(64)) RETURNS int(11) COMMENT '获取指定权限类型的博客数' BEGIN #Routine body goes here... # 定义 DECLARE fid int default 0; # 赋值 SELECT COUNT(*) FROM `sdb_blog` AS b WHERE b.dense=dense INTO fid; # 返回 RETURN fid; END $$ DELIMITER ;
传参的使用方法:
SELECT blog_densen_nums('opened')
mysql 存储过程 procedure
存储过程入参有三种参数类型,分别是:
IN 输入参数,传入值给过程
OUT 输出参数,返回多个变量传出值
INOUT 输入输出,同一个变量
创建:
DELIMITER $$
DROP PROCEDURE IF EXISTS `clear_blog`;
CREATE DEFINER = CURRENT_USER PROCEDURE `clear_blog`(IN blog_type VARCHAR(64))
COMMENT '清除符合条件的博客'
BEGIN
-- Routine body goes here...
DELETE FROM `sdb_blog` WHERE dense = blog_type;
END $$
DELIMITER ;
调用方式:CALL clear_blog('itype');
mysql> set @blog_type = 'itype';
Query OK, 0 rows affected
mysql> CALL clear_blog(@blog_type);
Query OK, 2 rows affected
mysql>
OUT 和 INOUT 类似,三种用法主要是体现在内部及返回对变量的影响。
附一个循环体:
CREATE DEFINER=`jroot`@`%` PROCEDURE `generateUser`()
BEGIN
#Routine body goes here...
declare i int;
set i = 3000;
while i < 5000 do
INSERT INTO `sdb_user` (`realname`, `username`, `password`, `mobile`, `email`, `remark`, `modtime`, `addtime`) VALUES
('', i, FLOOR(RAND() * 100000), '', '', '2021-10-22 20:20:20', NULL, '2021-10-22 20:20:20');
set i = i + 1;
end while;
# UPDATE `sdb_user` SET `realname` = CONCAT('u',`id`) WHERE `addtime` = '2021-10-22 20:20:20';
# UPDATE `sdb_user` SET `username` = CONCAT('user',`id`) WHERE `addtime` = '2021-10-22 20:20:20';
# UPDATE `sdb_user` SET `password` = FLOOR( 100000 + RAND() * (999999 - 100000)) WHERE `addtime` = '2021-10-22 20:20:20';
END