暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL存储过程

全栈精英 2021-07-27
481

存储过程写法

格式:

     create procedure 存储过程名字
    (
    [in|out|inout] 参数 数据类型
    )
    begin
    MySQL 语句;
    end;

    说明:

    MySQL 存储过程参数分为:

    • in  :输入参数

    • out :输出参数

    • inout :输入和输出参数

    如果不显式指定“in”、“out”、“inout”,则默认为“in”

    注意:

    • MySQL 存储过程名字后面的“()”是必须的,即使没有一个参数,也需要“()”

    • MySQL 存储过程参数,不能在参数名称前加“@”,如:“@a int”(在 SQL Server 中是正确的)

    • MySQL 存储过程中的变量,不需要在变量名字前加“@”,但是 MySQL 客户端用户变量要加个“@”

    • MySQL 存储过程中的每条语句的末尾,都要加上分号 “;”

    • return 不能在 MySQL 存储过程中使用,return 只能出现在函数中。SQL Server可以在存储过程写return

    • MySQL 存储过程的参数不能指定默认值。而SQL Server 可以

    • MySQL 存储过程不需要在 正文前面加 “as”。而 SQL Server 存储过程必须加 “as” 关键字

    • 如果 MySQL 存储过程中包含单条或者多条 MySQL 语句,都需要 begin end 关键字

    • 存储过程的注释使用 **/ 或 -- (注意打空格)

    例:查询订单的总金额

      delimiter  //   --  修改当前的结束符号为//而不是; 这样可以在存储过程中用;
      create procedure aa  -- 创建新的存储过程aa
      (
      out total float; -- 输出参数是金额(小数类型)
      )
      begin
      select sum(amount) into total from orders; -- 查询订单表并统计金额
      end//          -- 结束
      delimiter ;    -- 将结束符号还原为;


      call aa(@t);   -- 调用存储过程
      select @t;     -- 输出执行结果


      show create procdure aa; -- 查看存储过程的定义 


      drop procdure aa;  -- 删除存储过程

      例:计算两个数字之和 

        drop procedure if exists pr_add;
        delimiter  //
        create procedure pr_add
        (
        a int,
        b int
        )
        begin
        declare c int;
           if a is null then
        set a = 0;
        end if;
        if b is null then
        set b = 0;
        end if;
        set c = a + b;
        select c as sum;
        end//
        delimiter ;
        call pr_add(10,20);

        注意:如果执行 MySQL 存储过程要使用变量,需要为 MySQL 用户变量:

           set @a = 10;
          set @b = 20;
          call pr_add(@a, @b);

          MySQL语句

          if-then -else

           
             delimiter  
            create procedure p12
            (
            parameter int
            )
            begin
            if parameter=0 then
            update t set s1=s1+1; -- parameter为0,则s1的值加1
            else
            update t set s1=s1+2; -- 否则s1的值加2
            end if;
            end//
            delimiter ;
                               

            case

            如果需要进行更多条件真假的判断我们可以使用case语句 

               delimiter  
              create procedure p13
              (
              parameter int
              )
              begin
              declare var int;
              set var=parameter+1;
              case var
              when 0 then insert into t values(17);
              when 1 then insert into t values(18);
              else insert into t values(19);
              end case;
              end//
              delimiter ;

              while ···· end while

              循环语句 

                 delimiter // 
                create procedure p14()
                begin
                declare var int;
                set var=0;
                while var<6 do
                insert into t values(var);
                set var=var+1;
                end while;
                end//
                delimiter ;

                repeat···· end repeat

                它在执行操作后检查结果,而while则是执行前进行检查 

                   delimiter // 
                  create procedure p15()
                  begin
                  declare v int;
                  set v=0;
                  repeat
                  insert into t values(v);
                  set v=v+1;
                  until v>=5
                  end repeat;
                  end//
                  delimiter ;

                  loop ·····end loop

                  loop 循环不需要初始条件,这点和while 循环相似,同时和repeat循环一样不需要结束条件, leave语句的意义是离开循环

                     delimiter // 
                    create procedure p16()
                    begin
                    declare v int;
                    set v=0;
                    loop_lable:loop
                    insert into t values(v);
                    set v=v+1;
                    if v >=5 then
                    leave loop_lable;
                    end if;
                    end loop;
                    end//
                    delimiter ;
                    说明:lables 标号可以用在begin repeat while 或者loop 语句前,语句标号只能在合法的语句前面使用。可以跳出循环,使运行指令达到复合语句的最后一步。

                    视图 

                      -- 定义视图
                      create or replace view 视图名
                      as
                      select …..

                      -- 调用:
                      select * from 视图名

                      -- 查看视图的定义:
                      describe 视图名

                      -- 查看所有视图的定义:
                      select * from information_schema.views;

                      -- 删除视图:
                      drop view if exists 视图名;
                      注意:关于视图的编辑
                         -- 编辑视图数据:
                        update 视图名 set 字段=值;
                        -- 删除视图数据:
                        delete from 视图名 where 主键=值;
                         说明:更新视图的时候是通过基本表执行更新



                        文章转载自全栈精英,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                        评论