一起养成写作习惯!这是我参与「掘金日新计划 · 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();
输出结果:
- 自定义函数,实现日期固定格式输出,其 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;