(016)mysql 技巧 * 自定义函数与存储过程

自定义函数

语法:

create function 函数名([参数列表]) returns 数据类型
begin
    sql语句;
    return 值;
end;

例1:无参数函数

-- 最简单的仅有一条sql的函数
CREATE FUNCTION f1() 
RETURNS VARCHAR(30)
RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点%i分%s秒')

select f1(); -- 调用函数

例2:带参数函数

-- 带参数函数(参数需要声明类型)
CREATE FUNCTION f2(a INT,b INT)
RETURNS INT
RETURN a + b;

select f2(1,2); -- 调用函数

例3:sql 语句体

-- sql 语句体
CREATE FUNCTION f3(name VARCHAR(30))
RETURNS INT
BEGIN
	INSERT INTO user(username) VALUES (name );
	RETURN LAST_INSERT_ID();
END

select f3('atong'); -- 调用函数
-- 多个语句需要执行时使用 begin/end 形成聚合体

其它

  • 参数可以零个或多个,return 值只能一个
  • 可在 sql 语句中调用 select * from user where id=f2(1,2);
  • 查看函数创建语句:show create function 函数名;
  • 查看所有函数:show function status [like 'pattern'];
  • 删除函数:drop function 函数名;

存储过程(Stored Procedure)

通常的,我们编写好的SQL语句提交给MySQL服务器之后,MySQL服务器将经历以下过程:

MySQL引擎检查语法是否标准 -> sql 无错误时编译该语句 -> 执行编译后的语句 -> 返回结果

存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,调用存储过程时可省去了 检测语法及编译 过程直接执行语句,从而提高效率。

例1:无参数的存储过程:

-- 最简单的仅有一条sql的存储过程
CREATE PROCEDURE a() 
SELECT VERSION();

CALL a(); -- 调用存储过程

例2: 带参数的存储过程

-- 带参数的存储过程
CREATE PROCEDURE removeUserById(uid INT)
BEGIN
    DELETE FROM `user` WHERE `id` = uid;
END

CALL removeUserById(1); -- 执行存储过程

MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT,形式如:

CREATEPROCEDURE 存储过程名([[IN |OUT |INOUT ] 参数名 数据类形...])
  • IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
  • OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
  • INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)

例3:IN/OUT 修饰参数

 -- IN uid 参数为传入参数,OUT nums 参数为传出参数
 -- OUT 可以多个,即存储过程可返回多个值
CREATE PROCEDURE test(IN uid INT,OUT nums INT)
BEGIN
  DELETE FROM `user` WHERE id = uid;
  SELECT COUNT(uid) FROM `user` INTO nums;
end

-- 调用
CALL test(7,@param); -- @param 相当于传入变量去接受数据
SELECT @param;

mysql 变量

-- into
SELECT 'Hello World' into @x;
SELECT @x; 

-- set
SET @y='Goodbye Cruel World';  
SELECT @y; 

更多:https://www.runoob.com/w3cnote/mysql-stored-procedure.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章