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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 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,如需转载请自行联系原作者

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
20天前
|
关系型数据库 MySQL
【MySQL实战笔记】07 | 行锁功过:怎么减少行锁对性能的影响?-01
【4月更文挑战第18天】MySQL的InnoDB引擎支持行锁,而MyISAM只支持表锁。行锁在事务开始时添加,事务结束时释放,遵循两阶段锁协议。为减少锁冲突影响并发,应将可能导致最大冲突的锁操作放在事务最后。例如,在电影票交易中,应将更新影院账户余额的操作安排在事务末尾,以缩短锁住关键行的时间,提高系统并发性能。
15 4
|
21天前
|
关系型数据库 MySQL 数据库
【MySQL实战笔记】 06 | 全局锁和表锁 :给表加个字段怎么有这么多阻碍?-01
【4月更文挑战第17天】MySQL的锁分为全局锁、表级锁和行锁。全局锁用于全库备份,可能导致业务暂停或主从延迟。不加锁备份会导致逻辑不一致。推荐使用`FTWRL`而非`readonly=true`因后者可能影响其他逻辑且异常处理不同。表级锁如`lock tables`限制读写并限定操作对象,常用于并发控制。元数据锁(MDL)在访问表时自动加锁,确保读写正确性。
69 31
|
29天前
|
存储 关系型数据库 MySQL
【MySQL实战笔记】 04 | 深入浅出索引(上)-01
【4月更文挑战第8天】这篇文章除了介绍索引的作用和提高查询效率的原理,还探讨了三种常见的数据结构:哈希表、有序数组和搜索树。哈希表适合等值查询,但不支持范围查询;有序数组利用二分查找实现快速等值查询,但更新成本高;二叉搜索树保持平衡时查询高效,但磁盘存储时效率低。文章指出,由于磁盘读取延迟,实际数据库索引设计需考虑减少磁盘访问次数。
34 5
|
1月前
|
存储 SQL NoSQL
mysql存储过程和存储函数
mysql存储过程和存储函数
|
1月前
|
SQL 安全 关系型数据库
【MySQL实战笔记】03.事务隔离:为什么你改了我还看不见?-01
【4月更文挑战第6天】MySQL事务的隔离性确保数据操作的完整性和一致性,ACID原则包括原子性、一致性、隔离性和持久性。事务隔离级别有四种:读未提交、读提交、可重复读和串行化,分别解决并发问题如脏读、不可重复读和幻读。不同隔离级别在效率和安全性间权衡,例如读未提交允许未提交变更可见,而串行化通过锁保证安全但可能降低效率。在不同隔离级别下,事务看到的数据状态会有所变化,例如在可重复读级别,事务始终看到初始数据,而在串行化级别,事务会等待其他事务完成再继续,避免数据冲突。
278 10
|
5天前
|
存储 SQL 关系型数据库
MySQL万字超详细笔记❗❗❗
MySQL万字超详细笔记❗❗❗
43 1
MySQL万字超详细笔记❗❗❗
|
9天前
|
SQL 关系型数据库 MySQL
【MySQL系列笔记】MySQL总结
MySQL 是一种关系型数据库,说到关系,那么就离不开表与表之间的关系,而最能体现这种关系的其实就是我们接下来需要介绍的主角 SQL,SQL 的全称是 Structure Query Language ,结构化的查询语言,它是一种针对表关联关系所设计的一门语言,也就是说,学好 MySQL,SQL 是基础和重中之重。SQL 不只是 MySQL 中特有的一门语言,大多数关系型数据库都支持这门语言。
183 8
|
9天前
|
SQL 关系型数据库 MySQL
【MySQL系列笔记】常用SQL
常用SQL分为三种类型,分别为DDL,DML和DQL;这三种类型的SQL语句分别用于管理数据库结构、操作数据、以及查询数据,是数据库操作中最常用的语句类型。 在后面学习的多表联查中,SQL是分析业务后业务后能否实现的基础,以及后面如何书写动态SQL,以及完成级联查询的关键。
164 6
|
9天前
|
存储 关系型数据库 MySQL
【MySQL系列笔记】InnoDB引擎-数据存储结构
InnoDB 存储引擎是MySQL的默认存储引擎,是事务安全的MySQL存储引擎。该存储引擎是第一个完整ACID事务的MySQL存储引擎,其特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读,同时被设计用来最有效地利用以及使用内存和 CPU。因此很有必要学习下InnoDB存储引擎,它的很多架构设计思路都可以应用到我们的应用系统设计中。
159 4
|
10天前
|
SQL 存储 关系型数据库
【MySQL系列笔记】SQL优化
SQL优化是通过调整数据库查询、索引、表结构和配置参数等方式,提高SQL查询性能和效率的过程。它旨在减少查询执行时间、减少系统资源消耗,从而提升数据库系统整体性能。优化方法包括索引优化、查询重写、表分区、适当选择和调整数据库引擎等。
189 3