Mysql存储过程

1、 什么是存储过程

简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法;

ps:存储过程跟触发器有点类似,都是一组SQL集,但是存储过程是主动调用的,且功能比触发器更加强大,触发器是某件事触发后自动调用

2、 实现一个简单的存储过程

## 如果已经存在 则删除
drop procedure if exists proc_addre;
delimiter ;; ## 把默认的输入的结束符;替换成;;
    ## 创建一个 求和的 存储过程
  ## DEFINER 创建者 可以省略 DEFINER='root'@'localhost' 默认当前登录人
    CREATE DEFINER='root'@'localhost' PROCEDURE proc_addre(IN a int, IN b int, OUT sum int)
    BEGIN 
        if a is null then set a = 0;
        end if;
        
        if b is null then set b = 0;
        end if;

        set sum = a + b;
    END;;
delimiter ;

SET @b=5; ## 定义变量 b=5
CALL proc_addre(2, @b, @s);  ## 运行存储过程
SELECT @s as sum;  ## 打印 s 变量

 3、IF语句

## 存储过程 IF 语句
DROP     PROCEDURE IF EXISTS proce_if;
delimiter ;;
CREATE PROCEDURE porce_if (IN type INT)
BEGIN ## begin end; 是存储过程的块标示方法,类似PHP函数中的 { }  
    declare c VARCHAR(100); ## 定义一个 变长字符串 c
    IF type = 0 THEN 
        SET c = 'param is 0';
    ELSEIF type = 1 THEN
            SET c = 'param is 1';
    ELSE 
            set c = 'param is others, not 0 or 1';
    END IF;
    SELECT c ;
END;;    
delimiter;
CALL porce_if(1);

 4、 case语句

## 存储过程 case 语句 感觉有点像 PHP 中的 switch 语句
DROP     PROCEDURE IF EXISTS proce_case;
delimiter ;;
CREATE PROCEDURE proce_case (IN type INT)
BEGIN ## begin end; 是存储过程的块标示方法,类似PHP函数中的 { }  
    declare c VARCHAR(100); ## 定义一个 变长字符串 c
    CASE type 
        WHEN 0 THEN    
            SET c = 'param is 0';
        WHEN 1 THEN
            SET c = 'param is 1';
        ELSE 
            set c = 'param is others, not 0 or 1';
    END CASE;
    SELECT c;
END;;    
delimiter;
CALL proce_case(1);

 5、 循环语句 while

## 存储过程 while 循环 
DROP     PROCEDURE IF EXISTS proce_while;
delimiter ;;
CREATE PROCEDURE proce_while (IN n INT)
BEGIN ## begin end; 是存储过程的块标示方法,类似PHP函数中的 { }  
    declare i int;
    declare s int;
    set i=0;
    set s=0;
    WHILE i <= n DO ## i <= n 是判断条件
        set s=s+i;
        set i=i+1;
    END WHILE;
    SELECT s;
END;;    
delimiter;
CALL proce_while(100);

 6、删除存储过程

drop procedure if EXISTS proce_test;

注意事项: 不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程

7、 显示所有的存储过程的状态,分析各列字段含义

SHOW PROCEDURE STATUS; ## 也可以到 mysql 数据库中 proc表查看。 select * from mysql.proc;

 

① db : 对应的数据库名

② name : 存储过程名称

③ type : 类型 这里还有可能是 FUNCTION,函数的话就是function, 存储过程就是procedure。

④ definer 定义者

⑤ modified 修改时间

⑥ create 创建时间

⑦ security_type  创建存储过程的时候可以指定 SQL SECURITY属性,设置为 DEFINER 或者INVOKER,用来告诉mysql在执行存储过程的时候,是以DEFINER用户的权限来执行,还是以调用者的权限来执行。

   默认情况下,使用DEFINER方式,此时调用存储过程的用户必须有存储过程的EXECUTE权限,并且DEFINER指定的用户必须是在mysql.user表中存在的用户。

   DEFINER模式下,默认DEFINER=CURRENT_USER,在存储过程执行时,mysql会检查DEFINER定义的用户'user_name'@'host_name'的权限;

   INVOKER模式下,在存储过程执行时,会检查存储过程调用者的权限。这个列比较重要。

   ##案例一:DEFINER
   CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()
   BEGIN
       SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;
   END;
   ##在这个案例中,不论哪个用户A调用存储过程,存储过程都会以'admin'@'localhost'的权限去执行,即使这个用户A没有查询mysql.user表的权限。
##案例二:INVOKER
   CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()
       SQL SECURITY INVOKER
   BEGIN
       SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;
   END;
   ##在这个案例中,虽然存储过程语句中仍然带有DEFINER参数,但是由于SQL SECURITY指定了INVOKER,所以在存储过程执行的时候,会以调用者的额身份去执行。此时这个存储过程是否能成功执行,取决于调用者是否有mysql.user表的查询权限。

⑧ comment : 注释

⑨ character_set_client : mysql 服务器的接受数据的编码

⑩ collation_connection : sql执行时的校验规则  utf8_general_ci 标示 utf-8不区分大小写

圈圈11 database collation : 数据库的编码规则

8. 查看存储过程的详细信息

SHOW CREATE PROCEDURE porce_if;

① sql_mode 是mysql 中sql执行时的错误级别。这个去百度看看。

② create procedure 是 创建储存过程的代码

原文地址:https://www.cnblogs.com/shaoshao/p/6649815.html