Mysql Storage Programs(存储过程)简笔记

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

1、什么是存储过程

1
2
3
4
5
6
7
8
9
mysql> delimiter ;
mysql>  create  procedure  proc1( out  int
    ->  begin
    ->  select  count (*)  into  from  mysql. user ;
    ->  end
    -> //
mysql> delimiter ;
mysql> call proc1(@s);
mysql>  select  @s;

2、创建存储过程

create procedure([[in] |out |inout])

2.1、in values

1
2
3
4
5
6
7
8
9
10
11
12
mysql> delimiter;
mysql>  create  procedure  pin( in  p_in  int
    ->  begin
    ->  select  p_in;
    ->  set  p_in=2;
    ->  select  p_in;
    ->  end
    -> //
mysql> delimiter ;
mysql>  set  @p_in=1;
mysql> call pin(@p_in);
mysql>  select  @p_in;

2.2、out values

example 1:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> delimiter;
mysql>  create  procedure  pout( out  p_out  int
    ->  begin
    ->  select  p_out;
    ->  set  p_out=2;
    ->  select  p_out;
    ->  end
    -> //
mysql> delimiter ;
mysql>  set  @p_out=1;
mysql> call pout(@p_out);
mysql>  select  @p_out

example 2:

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> delimiter;
mysql>  create  procedure  pinout(inout p_out  int
    ->  begin
    ->  select  p_inout;
    ->  set  p_inout=2;
    ->  select  p_inout;
    ->  end
    -> //
mysql> delimiter ;
mysql>  set  @p_inout=1;
mysql>  select  @p_inout
mysql> call pinout(@p_inout);
mysql>  select  @p_inout

2.3、null values

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> delimiter;
mysql>  create  definer=`root`@`localhost`  procedure  `test1`(n1  int
    ->  begin ;
    ->  set  @x=0;
    -> repeat  set  @x=@x+1;
    ->  insert  into  world.t3  values  (@x);
    -> until @x>n1
    ->  end  pepeat
    ->  end ;
    -> //
mysql> delimiter ;
mysql> call test1(10) 
mysql>  select  @p_inout


2、循环插入语句

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> show  create  tables t3\G;
mysql> delimiter //
mysql>  create  procedure  t3(n1  int )
   ->  begin
   ->  set  @x=0;
   -> repeat  set  @x=@x+1;
   ->  insert  int  t3  values  (@x);
   -> until @x>n1
   ->  end ;
   -> //
mysql> delimiter ;
mysql> call t3(10);
mysql>  select  from  t3;

3、变量定义

declare variable_name [,variable_name...] datatype [default value];

datatype:int,float,date,varchar(length)

1
2
3
4
decalare l_int  int  unsigned  default  4000000;
decalare l_numeric number(8,2)  default  9.95;
decalare l_datetime datetime  default  '1999-12-31 23:59:59' ;
decalare l_varchar  varchar (255)  default  'This will not be padded' ;

4、变量赋值

set 变量名 = 表达式值 [,variable_name = expression ...]

1
2
3
4
mysql>  create  procedure  p1()  set  @last_procedure = 'p1' ;
mysql>  create  procedure  p2()  set  selcet coucat( 'Last procedure was' ,@last_procedure);
mysql> call p1();
mysql> call p2();

5、变量的作用域



6、注解

--

/*...*/


7、结构化


7.1、if

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql > delimiter //
mysql >  create  procedure  proc2( in  p1  int )
   --> begin
   --> declare var int;
   --> set var=p1+1;
   --> if var=1 then insert into t values(11);
   --> end if;
   --> if var=2 then insert into t values(22);
   --> else insert into t varlues(33);
   --> end if;
   --> end;
   --> //
mysql >  delimiter ;

7.2、case

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql > delimiter //
mysql >  create  procedure  proc3( in  p1  int )
   --> begin
   --> declare var int;
   --> set var=p1+1;
   --> case var
   --> when 1 then insert into t values(17);
   --> when 2 then insert into t values(18);
   --> else insert into t values(19);
   --> end case;
   --> end;
   --> //
mysql >  delimiter ;

7.3、while

1
2
3
4
5
6
7
8
9
10
11
12
mysql > delimiter //
mysql >  create  procedure  proc4( in  p1  int )
   --> begin
   --> declare var int;
   --> set var=0;
   --> while var<6 do
   --> insert into t values(var);
   --> set var=var+1
   --> end while;
   --> end;
   --> //
mysql >  delimiter ;

7.4、repeat

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql > delimiter //
mysql >  create  procedure  proc5( in  p1  int )
   --> begin
   --> declare v int;
   --> set v=0;
   --> repeat
   --> insert into t values(v);
   --> set v=v+1;
   --> until v>=5
   --> end repeat;
   --> end;
   --> //
mysql >  delimiter ;

7.5、loop

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql > delimiter //
mysql >  create  procedure  proc6( in  p1  int )
   --> 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;
   --> //
mysql >  delimiter ;

7.6、iterate

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql > delimiter //
mysql >  create  procedure  proc7()
   --> begin
   --> declare v int default 0;
   --> loop_lable:loop
   --> set v=v+1;
   --> if v<10 then insert loop_lable;
   --> elseif v>20 then leave loop_lable;
   --> else select 'v is between 10 and 20';
   --> end if;
   --> end loop loop_lable;
   --> end;
   --> //
mysql >  delimiter ;

8、查看存储过程状态

1
2
3
4
5
mysql >  show  procedure  status  like  'p%' \G;
mysql >   select  from  information_schema.Routines
   ->  where  routine_name =  'p1'
   ->  and
   ->routing_type= 'procedure' \G;

9、查看存储过程内容

1
mysql >  show  create  procedure  p2\G;

10、修改存储过程

alter procedure proc_name [characteristic ...]

characteristic:

    comment 'sting'

 | language sql

 | {contains sql | no sql | reads sql data | modifies sql data}

 | sql security { definer | invoker}


11、删除存储过程

1
mysql >   drop  procedure  p2;


12、总结

目前,mysql不支持对已存在的存储过程修改代码,只能先drop掉重写。

存储过程可以调用其他存储过程

存储过程的参数不要与数据表中的字段同名

存储过程的参数可以使用在中文,不顾需要在定义是加上character set gbk,例如:

1
mysql >   create  procedure  p1( in  u_name  varchar (30)  character  set  gbk, out  u_score  int )








本文转自 tanzhenchao 51CTO博客,原文链接:http://blog.51cto.com/cmdschool/1696843,如需转载请自行联系原作者

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
存储 Java 关系型数据库
java调用mysql存储过程
在 Java 中调用 MySQL 存储过程主要借助 JDBC(Java Database Connectivity)。其核心原理是通过 JDBC 与 MySQL 建立连接,调用存储过程并处理结果。具体步骤包括:加载 JDBC 驱动、建立数据库连接、创建 CallableStatement 对象、设置存储过程参数并执行调用。此过程实现了 Java 程序与 MySQL 数据库的高效交互。
|
4月前
|
存储 SQL 关系型数据库
[MySQL]存储过程
本文介绍了存储过程的概念、优点和缺点,并通过具体示例详细讲解了存储过程的创建、使用和调用方法。此外,还介绍了游标的定义和使用,帮助读者更好地理解和应用存储过程。文章旨在为读者提供一个学习和使用存储过程的实用指南。
458 18
[MySQL]存储过程
|
5月前
|
Java 关系型数据库 MySQL
自动化测试项目实战笔记(一):JDK、Tomcat、MySQL、Jpress环境安装和搭建
这篇文章是关于自动化测试项目实战笔记,涵盖了JDK、Tomcat、MySQL、Jpress环境的安装和搭建过程,以及测试用例和常见问题总结。
128 1
自动化测试项目实战笔记(一):JDK、Tomcat、MySQL、Jpress环境安装和搭建
|
4月前
|
存储 SQL NoSQL
|
5月前
|
存储 SQL 关系型数据库
MySql数据库---存储过程
MySql数据库---存储过程
79 5
|
5月前
|
存储 关系型数据库 MySQL
MySQL 存储过程返回更新前记录
MySQL 存储过程返回更新前记录
118 3
|
5月前
|
存储 SQL 关系型数据库
MySQL 存储过程错误信息不打印在控制台
MySQL 存储过程错误信息不打印在控制台
119 1
|
7月前
|
存储 关系型数据库 MySQL
Mysql表结构同步存储过程(适用于模版表)
Mysql表结构同步存储过程(适用于模版表)
79 0
|
2天前
|
关系型数据库 MySQL 数据库连接
docker拉取MySQL后数据库连接失败解决方案
通过以上方法,可以解决Docker中拉取MySQL镜像后数据库连接失败的常见问题。关键步骤包括确保容器正确启动、配置正确的环境变量、合理设置网络和权限,以及检查主机防火墙设置等。通过逐步排查,可以快速定位并解决连接问题,确保MySQL服务的正常使用。
98 82
|
2月前
|
关系型数据库 MySQL 数据库连接
数据库连接工具连接mysql提示:“Host ‘172.23.0.1‘ is not allowed to connect to this MySQL server“
docker-compose部署mysql8服务后,连接时提示不允许连接问题解决