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

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介:

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操作。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
存储 Java 关系型数据库
java调用mysql存储过程
在 Java 中调用 MySQL 存储过程主要借助 JDBC(Java Database Connectivity)。其核心原理是通过 JDBC 与 MySQL 建立连接,调用存储过程并处理结果。具体步骤包括:加载 JDBC 驱动、建立数据库连接、创建 CallableStatement 对象、设置存储过程参数并执行调用。此过程实现了 Java 程序与 MySQL 数据库的高效交互。
|
6月前
|
关系型数据库 MySQL 索引
MySQL多表练习笔记
链接可行,多表查询语法
160 0
|
12月前
|
存储 关系型数据库 MySQL
【YashanDB知识库】MySQL返回结果集的存储过程的改写方法
本文介绍了将MySQL存储过程改写至YashanDB的解决方案。由于MySQL存储过程可直接返回结果集,而YashanDB需通过返回SYS_REF_CURSOR的函数实现类似功能,因此需要对代码进行转换。示例中展示了如何将MySQL存储过程`proc1`改写为YashanDB函数,并调整JDBC应用代码以适配REF_CURSOR输出参数,从而正确获取查询结果。此方法确保了跨数据库场景下的兼容性与功能性。
|
Java 关系型数据库 MySQL
自动化测试项目实战笔记(一):JDK、Tomcat、MySQL、Jpress环境安装和搭建
这篇文章是关于自动化测试项目实战笔记,涵盖了JDK、Tomcat、MySQL、Jpress环境的安装和搭建过程,以及测试用例和常见问题总结。
370 1
自动化测试项目实战笔记(一):JDK、Tomcat、MySQL、Jpress环境安装和搭建
|
存储 SQL NoSQL
|
存储 SQL 关系型数据库
MySql数据库---存储过程
MySql数据库---存储过程
225 5
|
存储 关系型数据库 MySQL
MySQL 存储过程返回更新前记录
MySQL 存储过程返回更新前记录
260 3
|
存储 SQL 关系型数据库
MySQL 存储过程错误信息不打印在控制台
MySQL 存储过程错误信息不打印在控制台
317 1
|
6月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
456 158
|
6月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。

推荐镜像

更多