MySQL存储过程

2024-04-09 1558阅读

-- MySQL存储过程(属于数据对象)(Java 方法)(优点:1:编译好存储在服务器

MySQL存储过程
(图片来源网络,侵删)

-- (1:执行效率高(存储过程的语句都是先编译(创建存储过程时候就编译好了)))

--  2:安全性高(把不公开的数据或者业务封装在存储过程中,外部不需要知道内部的实现细节)

--  3:减少网络流量

--  4:支持模块化)

SHOW PROCEDURE STATUS;//显示数据库中所有的存储过程

SHOW CREATE PROCEDURE proc;//显示某个存储过程的详细信息(proc为存储过程名称)

DROP PROCEDURE IF EXISTS proc;//删除某个存储过程(proc为存储过程名称)

CALL proc();//调用存储过程(proc为存储过程名称)

结构:

    DROP PROCEDURE IF EXISTS proc;

    DELIMITER //

    CREATE PROCEDURE proc()

    BEGIN

      SELECT '存储过程';

    END //

示例:

1)

    DELIMITER //

    CREATE PROCEDURE proc()

    BEGIN

      DECLARE num INT(3);

      SET num=10;

      SELECT num+20;

    END //

调用存储过程:CALL proc(); =>21

2)

    DROP PROCEDURE IF EXISTS proc;

    DELIMITER //

    CREATE PROCEDURE proc()

    BEGIN

      DECLARE num INT(3) DEFAULT 1;

      SELECT num+20;

    END //

调用存储过程:CALL proc(); =>21

3)

    -- in 参数(参数输入模式)

    DROP PROCEDURE IF EXISTS proc;

    DELIMITER //

    CREATE PROCEDURE proc(i INT(3),j INT(3))

    BEGIN

      SELECT i+j;

    END //

调用存储过程:CALL proc(1, 1); =>2

4)

    --  out 参数(参数输出模式)

    DROP PROCEDURE IF EXISTS proc;

    DELIMITER //

    CREATE PROCEDURE proc(i INT(3),j INT(3),OUT result INT(3))

    BEGIN

      SET result=i+j;

    END //

调用存储过程:SET @result=10;//在此处还没有发现此步骤的用处

              CALL proc(1, 1, @result);

              SELECT @result; =>2

5)

    -- inout 参数(即为输入参数也是输出参数)

    DROP PROCEDURE IF EXISTS proc;

    DELIMITER //

    CREATE PROCEDURE proc(i INT(3),j INT(3),INOUT result INT(3))

    BEGIN

      SELECT result AS result计算之前的值;

      SET result=i+j;

    END //

调用存储过程:SET @result=10;

              CALL proc(1, 1, @result); =>10(result计算之前的值)

              SELECT @result; =>2

6)

    -- IF 语句

    DROP PROCEDURE IF EXISTS proc;

    DELIMITER //

    CREATE PROCEDURE proc(i INT(3))

    BEGIN

      IF i10 THEN SELECT '大于10';

      ELSE SELECT '等于10';

      END IF;

    END //

调用存储过程:CALL proc(8); =>小于10

              CALL proc(10); =>等于10

              CALL proc(18); =>大于10

7)

    -- CASE 语句

    DROP PROCEDURE IF EXISTS proc;

    DELIMITER //

    CREATE PROCEDURE proc(i INT(3))

    BEGIN

      CASE i 

         WHEN 1 THEN SELECT '星期一';

         WHEN 2 THEN SELECT '星期二';

         WHEN 3 THEN SELECT '星期三';

         WHEN 4 THEN SELECT '星期四';

         WHEN 5 THEN SELECT '星期五';

         WHEN 6 THEN SELECT '星期六';

         WHEN 7 THEN SELECT '星期天';

         ELSE SELECT '错误的数据';

      END CASE;

    END //

调用存储过程:CALL proc(5); =>星期五

8)

    -- LOOP 循环

    8.1)

        DROP PROCEDURE IF EXISTS proc;

        DELIMITER //

        CREATE PROCEDURE proc(i INT(3))

        BEGIN

            DECLARE num INT(3) DEFAULT 10; -- 定义局部变量(循环的次数)

            myloop:LOOP -- 定义循环的块名称

                IF num>i THEN LEAVE myloop;  -- 判断循环次数是否大于传递进来的参数,大于则退出 myloop 循环块

                END IF;  -- 判断结束

                SELECT num; -- 循环没有结束 输出

                SET num=num+1; -- 循环变量递增

            END LOOP myloop; -- myloop块的结束

        END //

    调用存储过程:CALL proc(11); =>10

                  CALL proc(9); =>[SQL]CALL proc(9);受影响的行: 0时间: 0.000s(现在还不是很懂什么意思)

    8.2)

        DROP PROCEDURE IF EXISTS proc;

        DELIMITER //

        CREATE PROCEDURE proc(i INT(3))

        BEGIN

         DECLARE num INT(3) DEFAULT 10; -- 定义局部变量(循环的次数)

         myloop:LOOP -- 定义循环的块名称

           SELECT num; -- 循环没有结束 输出

           SET num=num+1; -- 循环变量递增

           IF numi -- 循环的条件(当条件满足则退出循环)

      END REPEAT;

    END //

调用存储过程:CALL proc(3); =>10(还不太懂)

11)

    -- 函数(不能有select语句) 必须定义返回值 在函数体内必须有return语句

    DROP FUNCTION IF EXISTS myfun;

    DELIMITER //

    CREATE FUNCTION myfun(i INT(3)) RETURNS INT(3)

    BEGIN

      DECLARE mysum INT DEFAULT 0;

      DECLARE num INT DEFAULT 1;

      WHILE num10

-- 在创建函数时报1418错误

SET GLOBAL log_bin_trust_function_creators=TRUE;

-- mysql中遇到;就开始执行

-- 函数(不能有select语句) 必须定义返回值 在函数体内必须有return语句

DROP FUNCTION IF EXISTS myfun;

DELIMITER //

CREATE FUNCTION myfun(i INT(3)) RETURNS INT(3)

BEGIN

  DECLARE mysum INT DEFAULT 0;

  DECLARE num INT DEFAULT 1;

  WHILE num8

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]