zoukankan      html  css  js  c++  java
  • 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 是 创建储存过程的代码

  • 相关阅读:
    ASP.NET Core 中间件(Middleware)详解
    .NET Core 使用RSA算法 加密/解密/签名/验证签名
    【Other】希腊诸神大全-中英文名称
    【架构】分布式追踪系统设计与实现
    【架构】SpringCloud 注册中心、负载均衡、熔断器、调用监控、API网关示例
    【SpringCloud】Netflix源码解析之Ribbon:负载均衡策略的定义和实现
    【Docker】基于docker+etcd+confd + haproxy构建高可用、自发现的web服务
    【架构】Kubernetes和Spring Cloud哪个部署微服务更好?
    【Linux】Linux中 “there are stopped jobs”问题的解决方案
    【架构】分布式系统雪崩效应处理方案
  • 原文地址:https://www.cnblogs.com/shaoshao/p/6649815.html
Copyright © 2011-2022 走看看