MySQL的存储过程和函数

142 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情

存储过程定义

存储过程是一种存储复杂程序,方便外部程序调用的数据库对象。是为了完成某个特定功能的 SQL 语句集合,用户可以通过存储过程的名字和参数进行调用。MySQL 从 5.0 版本开始支持存储过程(Stored Procedure)。

创建存储过程

CREATE PROCEDURE 存储过程名([IN|OUT|INOUT] 参数名 数据类型)
BEGIN …… END

  • IN: 参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不会影响调用环境的数据值;
  • OUT: 该值可在存储过程内部被改变,同时引起调用环境中数据值的改变;
  • INOUT: 调用时指定,兼具 IN 和 OUT 类型参数的特点。

以 BEGIN 和 END 对过程体的开始和结束进行标识。
需要强调一点,MySQL 中存储过程默认以 ; 作为结束符,如果不改变结束符,编译器会把存储过程当成 SQL 语句进行处理,因此编译过程会报错。所以要事先用 DELIMITER // 声明当前的分隔符,其目的是让编译器把两个 // 之间的内容当作一个存储过程,使用 DELIMITER ; 则恢复结束符为 ;

DELIMITER //    # 声明结束符
CREATE PROCEDURE demo1()
BEGIN
要求的函数,一般selectxxx;
END //    # 存储过程定义结束

CALL demo1() // # 注意此时“//”才是结束符

DELIMITER //  # 声明分隔符
CREATE PROCEDURE demo3(IN n INT, OUT m INT)
BEGIN
SET m = n * n;
END //    # 存储过程定义结束

调用 demo3 查看结果如下:

CALL demo3(9, @result) // 注意这里我们使用 @result 接收从存储过程中返回的值
SELECT @result //

删除存储过程

DROP PROCEDURE 存储过程名; DROP PROCEDURE demo2 //

函数

CREATE FUNCTION 函数名([变量名1 变量类型1, ……, 变量名n 变量类型n])
RETURNS 数据类型
BEGIN sql语句;
RETURN 值;
END;
ps:MySQL 安装完成后默认不允许创建自定义函数,需要在 my.cnf 配置文件中增加 log-bin-trust-FUNCTION-creators=1,然后重启数据库,使其具有创建函数的权限。也可以在 MySQL 命令行中输入以下命令来解决。 SET GLOBAL log_bin_trust_function_creators = 1;

  • 最简单的函数,仅有一条语句,如下所示:
DELIMITER ;    # 恢复结束符
CREATE FUNCTION myfunc1() RETURNS INT RETURN 123;

调用 myfunc1() 函数,结果如下:

SELECT myfunc1();

输出结果:

1

  • 自定义函数,实现日期固定格式输出,其 SQL 语句如下:
DELIMITER //
CREATE FUNCTION dateDemo(fdate DATETIME)
RETURNS VARCHAR(255)
BEGIN
DECLARE x VARCHAR(255) DEFAULT '';
SET x = date_format(fdate, '%Y年%m月%d日%h时%i分%s秒');
RETURN x;
END//
DELIMITER ;

SELECT dateDemo(now());

删除函数

DROP FUNCTION 函数名; DROP FUNCTION dateDemo;