zoukankan      html  css  js  c++  java
  • SQL存储过程

    存储过程
    存储过程就是具有名字的一段代码,用来完成一个特定的功能
    
    — SETDECLARE 定义变量的区别:
    CREATE DEFINER=`root`@`localhost` PROCEDURE `p_test`()
    这里写个注解,可以增强代码可读性: BEGIN -- 开始
    -- declare定义的变量为局部变量,仅在方法中生效。即只在存储过程中的begin和end之间生效。
    -- @set定义的类似全局变量
     DECLARE b INT DEFAULT 1;
     SET @a = @a + 1;
     SET b = b + 1;
     SELECT @a,b;
    END -- 结束
    
    mysql> set @a = 1;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> call p_test();
    +------+------+
    | @a   | b    |
    +------+------+
    |    2 |    2 |
    +------+------+
    1 row in set (0.00 sec)
    
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> call p_test();
    +------+------+
    | @a   | b    |
    +------+------+
    |    3 |    2 |
    +------+------+
    1 row in set (0.00 sec)
    
    Query OK, 0 rows affected (0.00 sec)
    
    — 可以看到a一直增加,b一直没变;
    
    
    — IN OUT INOUT  参数区别:
    
    — IN e.g1
    
    CREATE DEFINER=`root`@`localhost` PROCEDURE `p_test2`(IN a INT)
    测试IN: BEGIN
     SELECT a;
    END
    
    mysql> call p_test2(1);
    +------+
    | a    |
    +------+
    |    1 |
    +------+
    1 row in set (0.00 sec)
    
    Query OK, 0 rows affected (0.00 sec)
    
    — IN e.g2
    
    CREATE DEFINER=`root`@`localhost` PROCEDURE `p_test2`(IN a INT)
    测试IN: BEGIN
     SET a = a + 1;
     SELECT a;
    END
    
    
    mysql> set @a =3;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> call p_test2(@a);
    +------+
    | a    |
    +------+
    |    4 |
    +------+
    1 row in set (0.00 sec)
    
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select @a;
    +------+
    | @a   |
    +------+
    |    3 |
    +------+
    1 row in set (0.00 sec)
    
    
    — OUT e.g1
    —  注: 传出值只能是变量,下面的参数a 是传出值
    CREATE DEFINER=`root`@`localhost` PROCEDURE `p_test3`(OUT a INT)
    测试OUT: BEGIN
     SELECT a;
     SET a = 1;
     SELECT a;
    END
    
    — call p_test3(123); 会报错 ERROR 1414
    Call p_test(@abc);  
    
    mysql> call p_test3(@abc);
    +------+
    | a    |
    +------+
    | NULL | — 因为不接收输入值
    +------+
    1 row in set (0.00 sec)
    
    +------+
    | a    |
    +------+
    |    1 |
    +------+
    1 row in set (0.00 sec)
    
    mysql> select @abc; -- 打印出上面的存储过程的传出值(变量@abc)
    +------+
    | @abc |
    +------+
    |    1 |
    +------+
    1 row in set (0.00 sec)
    
    — INOUT e.g1  输入输出值也必须为变量
    
    mysql> set @abc = 10;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> call p_test4(@abc);
    +------+
    | a    |
    +------+
    |   10 |
    +------+
    1 row in set (0.00 sec)
    
    +------+
    | a    |
    +------+
    |   11 |
    +------+
    1 row in set (0.00 sec)
    
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select @abc;
    +------+
    | @abc |
    +------+
    |   11 |
    +------+
    1 row in set (0.00 sec)
    
    — 可以看到 输入变量值@abc 10 最后经过存储过程改变成了输出变量@abc 11,即改变了变量;
    
    
    — 条件循环语句  
    
    — if then else end if  语句
    
    CREATE DEFINER=`root`@`localhost` PROCEDURE `p_test5`(IN a INT)
    测试条件和循环语句: BEGIN
        if a > 10 then 
          SELECT 'a大于10';
        else
            SELECT 'a小于10';
        end if;    
    END
    
    mysql> call p_test5(100);
    +-----------+
    | a大于10   | — 列头
    +-----------+
    | a大于10   |
    +-----------+
    1 row in set (0.00 sec)
    
    — case when then end case 语句
    
    mysql> call p_test6(10);
    +----------------+
    | 你输入了10     |
    +----------------+
    | 你输入了10     |
    +----------------+
    1 row in set (0.00 sec)
    
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> call p_test6(11);
    +----------------+
    | 你输入了11     |
    +----------------+
    | 你输入了11     |
    +----------------+
    1 row in set (0.00 sec)
    
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> call p_test6(12);
    +---------------------------------+
    | 你输入了10、11之外的数          |
    +---------------------------------+
    | 你输入了10、11之外的数          |
    +---------------------------------+
    1 row in set (0.00 sec)
    
    Query OK, 0 rows affected (0.00 sec)
    
    
    — while do end while 循环
    
    CREATE DEFINER=`root`@`localhost` PROCEDURE `p_test7`(IN a INT)
    测试条件和循环语句: BEGIN
        while a < 3 do 
            SELECT concat('我循环了', a,'');
        SET a=a + 1;
        end while;
    END
    
    mysql> call p_test7(1);
    +---------------------------------+
    | concat('我循环了', a,'')      |
    +---------------------------------+
    | 我循环了1次                     |
    +---------------------------------+
    1 row in set (0.00 sec)
    
    +---------------------------------+
    | concat('我循环了', a,'')      |
    +---------------------------------+
    | 我循环了2次                     |
    +---------------------------------+
    1 row in set (0.00 sec)
    
    Query OK, 0 rows affected (0.00 sec)
    
    
    — repeat end repeat 执行操作后检查结果,while 则是执行前进行检查
    
    CREATE DEFINER=`root`@`localhost` PROCEDURE `p_test8`(IN a INT)
    测试条件和循环语句: BEGIN
        repeat 
            SELECT '我循环了';    
            SET a = a + 1;
        until a > 3
        end repeat;
    END
    
    mysql> call p_test8(1);
    +--------------+
    | 我循环了     |
    +--------------+
    | 我循环了     |
    +--------------+
    1 row in set (0.00 sec)
    
    +--------------+
    | 我循环了     |
    +--------------+
    | 我循环了     |
    +--------------+
    1 row in set (0.00 sec)
    
    +--------------+
    | 我循环了     |
    +--------------+
    | 我循环了     |
    +--------------+
    1 row in set (0.00 sec)
    
    Query OK, 0 rows affected (0.00 sec)
    
    
    — 其他 
    
    mysql> select 100 into @abc;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select @abc;
    +------+
    | @abc |
    +------+
    |  100 |
    +------+
    1 row in set (0.00 sec)
  • 相关阅读:
    Linux 添加Nginx 到 service 启动
    PHP编译安装时常见错误解决办法,php编译常见错误
    7 适配器模式
    6 单例模式及其多线程问题
    5 简单工厂、工厂、抽象工厂
    4 装饰者模式
    3 观察者模式
    2 策略模式
    1 UML基础
    代码操作Word时,目录自动更新的两种方法
  • 原文地址:https://www.cnblogs.com/leyi/p/12074053.html
Copyright © 2011-2022 走看看