Mysql之 存储过程 & 函数

一、存储过程

定义:一组可编程的函数,是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。

优点:
1.简化重复调用
2.批量处理
3.统一接口,保证数据安全

1、创建和调用

详情可见:https://www.cnblogs.com/geaozhang/p/6797357.html

一、创建与调用 

1.创建

mysql> delimiter $$  #将语句的结束符号从分号;临时改为两个$$(可以是自定义)
mysql> CREATE PROCEDURE delete_matches(IN p_playerno INTEGER)
-> BEGIN
->   DELETE FROM MATCHES
-> WHERE playerno = p_playerno;
-> END$$
Query OK, 0 rows affected (0.01 sec)

mysql> delimiter ;  #将语句的结束符号恢复为分号

2.调用 CALL ...

 call delete_matches(57); 

3.存储过程体

BEGIN
  BEGIN
    BEGIN
      statements; 
    END
  END
END

4.为语句块贴标签————增强代码可读性

label1: BEGIN
  label2: BEGIN
    label3: BEGIN
      statements; 
    END label3 ;
  END label2;
END label1

二、存储过程的参数 

0或多个参数
注意点

  1. 如果没有参数,也需要写()
  2. 参数名字不要等于列的名字

建议

  1. 输入使用in
  2. 返回使用out
  3. inout尽量少用

2、变量定义

详情可见:https://www.cnblogs.com/geaozhang/p/6803423.html

一、局部变量

1.语法:

  •  默认NULL
  • 可默认字面量
begin
declare var1 int default 100;
end
  • 可默认标量子查询
begin
declare var2 int default(select count(*) from XXX);
end

2.作用域

  • 在外部块中声明的变量可以在内部块中直接使用;
  • 在内部块中声明的变量只能在内部块中使用。

二、用户变量

  • 连接断开则消失
  • 不可跨连接使用

表示:@
定义

  1. set: set @var1:=999; 
  2. select: select @var2:=199; 

三、系统变量

表示:@@
1)全局变量

  • 修改方式:配置文件(my.ini、my.cnf)
  • 作用域:整个服务器

2)会话变量

  • 修改方式:set @@global_XXX:=123;
  • 作用域:仅限当前会话

3、流程控制

  https://www.cnblogs.com/geaozhang/p/6808867.html

二、函数

定义:函数存储着一系列sql语句,调用函数就是一次性执行这些语句。所以函数可以降低语句重复

注意点:自定义函数不能跨库使用

1.创建 

mysql> DELIMITER //
mysql> CREATE FUNCTION Ver_Compare (n INT, m INT)
-> RETURNS VARCHAR(50) #声明返回的数据类型
-> BEGIN
->   DECLARE s VARCHAR(50);
->   IF n = m THEN SET s = 'equals';
->   ELSE
->     IF n > m THEN SET s = 'greater';
->     ELSE SET s = 'less';
->     END IF;
->     SET s = CONCAT('is ', s, ' than');
->   END IF;
->   SET s = CONCAT(n, ' ', s, ' ', m, '.');
->   RETURN s; #一个实际的返回值
-> END //
mysql> DELIMITER ;

2.调用

调用函数需要有变量接收其结果

set @ax = Ver_Compare(1,2);
select @ax;

3.其他

查看所有自定义函数: show function statusG; 
删除指定自定义函数: drop function func_name; 

三、对比

原文地址:https://www.cnblogs.com/sabertobih/p/13964293.html