mysql函数与mysql存储过程


mysql函数function是mysql内部封装好逻辑的一个数据库对象,一般有返回值。
mysql存储过程procedure与mysql函数类似,是存储复杂程序,编译创建并保存给定参数调用执行的。

mysql 函数 function

查看函数定义:show create function fn_name;
删除函数:drop function fn_name;

函数定义结构体:

CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型 
BEGIN
    函数体
END
  1. 无参数的函数

    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()
  2. 有参数的函数

    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

原文链接:https://blog.yongit.com/note/143526.html