mysql 存储过程

存储过程procedure是实现特定功能的语句集合,编译后存在数据库中。

通过存储过程的名字,并给定参数来调用。

procedure

delimiter

declare

创建

1
2
3
4
5
6
7
drop procedure if exists p1; --如果过程存在,删除。
delimiter $$ -- 定义存储过程边界符
  create procesure p1(in a1 varchat(50),in a2 int,out b1 int
  begin
  end
$$ -- 执行
delimiter; -- 还原边界符
  •  通常在创建之前先删除过程。drop procedure if exists 过程名
  • 使用delimiter定义标识符。delimiter $$
  • 存储过程结束后还原标识符。delimiter ;
  • 参数 IN|OUT|INOUT参数名称 数据类型
    • IN,输入参数,修改参数的值不能被返回
    • OUT,输出参数,可被更改并返回
    • INOUT,输入输出参数,可被更改并返回
  • 结构体在BEGIN和END之间。可以定义变量和逻辑。

结构体

变量

  • 定义 declare
    • declare i int default 0;
    • declare s varchar(50) default '';
    • declare x,y int;
  • 赋值 可以是固定值,或者数据表查询后赋值。
    • set i=9;
    • set str='hello';
    • select salary into i from person where name='张三';

循环

  • 1
    2
    3
    while 条件 do
      ……
    end while;
    复制代码
    /* 循环插入数据 */
    CREATE TABLE IF NOT EXISTS student(id int ,sname VARCHAR(20)); 
    drop procedure if exists p1;
    
    delimiter $$
    CREATE procedure p1(in i int) #!!这里不能加分号
    BEGIN
        declare x int;
        set x=1;
        WHILE x<i+1 do
            INSERT INTO student VALUES(x,'测试');
            set x=x+1;
        end WHILE;
    END
    $$
    delimiter;
    
    call p1(12);
    SELECT * from student;
    复制代码

      

  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    loop_name: loop
      if 条件1 then
        leave loop_name;  /* 相当于 break */
      end if;
       
      if 条件2 then
        iterate loop_name;  /* 相当于 continue */
      end if;
     
      语句;
    end loop loop_name;

      

  • 1
    2
    3
    4
    repeat
      语句;
    until 条件;
    end repeat;

      

 

条件

  • 1
    2
    3
    if (a<5) then
        ……
    end if;
  • 1
    2
    3
    4
    5
    6
    7
    if(a>10)then
        ……
    elseif (a>5) then
        ……
    else
        ……
    end if;

 

  • 输入两个数字,比较大小并输出结果。
    复制代码
    drop procedure if exists t1;
    delimiter $$
    CREATE procedure t1(in a1 int,in a2 int,out a3 VARCHAR(20))
    BEGIN
        if a1>a2 then 
            set a3='A1大';
        ELSEIF a1<a2 then 
            set a3='A2大';
        ELSE
            SET a3='一样大';
        end if;
    END
    $$
    delimiter;
    call t1(22,22,@S);
    SELECT @s
    复制代码

     

  • 1
    2
    3
    4
    5
    case 判断条件
    when 条件1 then 结果1;
    when 条件2 then 结果2;
    else 结果3;
    end case;

      

  • 输入成绩,判断是否及格。
    复制代码
    drop procedure if exists t2;
    delimiter $$
    CREATE procedure t2(in score DOUBLE,out x VARCHAR(20))
    BEGIN
        case
            when score >80 then 
                set x='优秀';
            when score >60 then 
                set x='及格';
            ELSE
                set x='不及格';
        end case; 
    END
    $$
    delimiter;
    call t2(60.22,@S);
    SELECT @s
    复制代码

     

  • 判断星期几

    复制代码
    drop procedure if exists t3;
    delimiter $$
    CREATE procedure t3(in d int,out x VARCHAR(20))
    BEGIN
        case d
            when 1 then 
                set x='星期一';
            when 2 then 
                set x='星期二';
            when 3 then 
                set x='星期三';
            when 4 then 
                set x='星期四';
            ELSE
                set x='不知道';
        end case; 
    END
    $$
    delimiter;
    call t3(2,@S);
    SELECT @s
    复制代码

其他

1
2
3
4
5
查看[指定数据库]已创建的存储过程:
show PROCEDURE STATUS WHERE db='db_test'
 
/* 查看存储过程定义内容 */
SHOW CREATE PROCEDURE 数据库.存储过程名;

 

posted @   系统显示名称已被使用  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示