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

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

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
目录
相关文章
|
3月前
|
Java 关系型数据库 MySQL
自动化测试项目实战笔记(一):JDK、Tomcat、MySQL、Jpress环境安装和搭建
这篇文章是关于自动化测试项目实战笔记,涵盖了JDK、Tomcat、MySQL、Jpress环境的安装和搭建过程,以及测试用例和常见问题总结。
67 1
自动化测试项目实战笔记(一):JDK、Tomcat、MySQL、Jpress环境安装和搭建
|
2月前
|
存储 SQL NoSQL
|
3月前
|
存储 SQL 关系型数据库
MySql数据库---存储过程
MySql数据库---存储过程
51 5
|
3月前
|
存储 关系型数据库 MySQL
MySQL 存储过程返回更新前记录
MySQL 存储过程返回更新前记录
78 3
|
3月前
|
存储 SQL 关系型数据库
MySQL 存储过程错误信息不打印在控制台
MySQL 存储过程错误信息不打印在控制台
91 1
|
5月前
|
存储 关系型数据库 MySQL
Mysql表结构同步存储过程(适用于模版表)
Mysql表结构同步存储过程(适用于模版表)
57 0
|
5月前
|
存储 SQL 关系型数据库
MySQL 创建存储过程注意项
MySQL 创建存储过程注意项
59 0
|
5月前
|
SQL 存储 关系型数据库
运维笔记.MySQL.基于mysqldump数据备份与恢复
运维笔记.MySQL.基于mysqldump数据备份与恢复
82 0
|
17天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
42 3
|
17天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
46 3
下一篇
开通oss服务