最近有用到MySQL函数创建问题以及存储过过程,踩坑记录一下
1、首先是函数创建总是报错
网上查了查,需要开启MySQL全局函数创建功能
-- 查看是否开启创建函数功能
show variables like '%func%';
-- 关闭创建函数的功能
set global log_bin_trust_function_creators = 0;
set global log_bin_trust_function_creators = false;
-- 开启创建函数功能
set global log_bin_trust_function_creators = 1;
set global log_bin_trust_function_creators = true;
2、函数创建、调用、删除
1、函数创建必须声明返回值类型
2、函数体内部返回值类型必须和函数声明的返回值类型一致
案例一
-- 创建一个简单函数,并声明返回值类型 DATETIME
CREATE FUNCTION myTime() RETURNS DATETIME
BEGIN
-- 函数体
RETURN NOW();
END
-- 调用函数
SELECT myTime()
案例二
-- 创建函数 并声明返回值类型为 VARCHAR(20)
CREATE FUNCTION MyTimePlus() RETURNS VARCHAR(20)
BEGIN
-- 声明变量mytime 为varchar(20)
DECLARE mytime VARCHAR(20) DEFAULT "默认时间";
-- 为mytime完成赋值
SELECT DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%S') INTO mytime;
-- 返回结果
RETURN mytime;
END
-- 执行函数
SELECT MyTimePlus()
函数删除
DROP FUNCTION myTime
3、存储过程创建、调用、删除
-- 声明存储过程
CREATE PROCEDURE createPerson()
BEGIN
-- 存储过程方法体逻辑,创建表、添加数据
CREATE TABLE person(
uname VARCHAR(10),
pass VARCHAR(10)
);
INSERT INTO person (uname, pass) VALUES ("jack", "123"),("ivan", "456");
END;
-- 执行存储过程
CALL createPerson()
-- 删除存储过程
DROP PROCEDURE createPerson
-- 声明存储过程,并声明方法参数类型
CREATE PROCEDURE queryPersons(name VARCHAR(20))
BEGIN
-- 存储过程方法体逻辑
SELECT * FROM person WHERE uname = name;
END
-- 执行存储过程
CALL queryPersons("jack")
4、区别
存储过程本质上没有太大区别,本质都是一些sql集合组成的一个方法体,并且可以被调用
声明上关键字不一样:function与procedure
执行不一样:函数直接用select可以调用,存储过程则是call关键字调用
使用范围不一样:函数可以直接用在sql语句中的Select调用,存储过程则不行
参考资料
MySQL 的存储过程 procedure 与 函数 function 的区别和使用方法_mysql 存储过程和方法的区别_xlxxcc的博客-CSDN博客