首页 > 数据库 >编写mysql存储过程

编写mysql存储过程

时间:2022-10-12 15:58:40浏览次数:43  
标签:语句 存储 END -- param statement mysql 编写 PROCEDURE

https://blog.csdn.net/weixin_45577435/article/details/120499496

一、存储过程定义
​ 存储过程(Stored Procedure):一组为了完成特定功能的SQL语句集,存储在数据库中,经过一次编译后不需要再次编译。

二、存储过程特点
1、可以完成复杂的判断和运算

2、执行速度快

3、可重复使用

4、减少网络之间的数据传输,节省开销

通过代码调用存储过程时只需要传存储过程名称以及所需参数即可

三、存储过程语法
1、创建

delimiter $$ --定义存储过程结束标记,可自定义
--创建 使用procedure
create procedure [procedure_name]([param_type][param_name][data_type],...)
begin
[存储体];--分号不可少
end $$
delimiter;

-- 创建存储过程示例
delimiter $$
create procedure getUserById(in userId int)
begin
select * from tb_user where user_id=userId;
end $$
delimiter;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
delimiter:表示sql语句执行的结束

参数类型说明:param_type[in|out|inout]

IN:表示调用者需要对存储过程传入参数。
OUT:表示调用者到一个或多个返回值。
INOUT:表示调用者既要传入值,又要传出值。
2、删除

-- 删除procedure
drop procedure if exists [procedure_name];

-- 示例
drop procedure if exists getUserById;
1
2
3
4
5
3、调用

-- 无参
call procedure_name();
-- 有参
call procedure_name(param1,param2,...)
1
2
3
4
四、定义变量
变量声明语句必须放在存储体的开始部分

-- 定义变量 declare
-- 语法
-- declare [declare_name][type][default_value(可选)]
declare userId int default 66;
declare userId int;
-- 变量赋值
-- set declare_name=new_value;
set userId=77;
1
2
3
4
5
6
7
8
五、流程控制语句
1、条件控制语句
1、IF语句
语法

IF search_condition_1 THEN statement_list_1
[ELSEIF search_condition_2 THEN statement_list_2] ...
[ELSE statement_list_n]
END IF
1
2
3
4
实例

DROP PROCEDURE IF EXISTS get_max_num ;

DELIMITER $$
CREATE PROCEDURE get_max_num (IN a INT, IN b INT, OUT c)
BEGIN
IF a>b
THEN set c = a ;

ELSE set c = b;

END IF ;

END $$
DELIMITER ;

SELECT @a;
CALL get_max_num(3,4);
SELECT @a;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2、case语句
存储程序的CASE语句实现一个复杂的条件构造。如果search_condition 求值为真,相应的SQL被执行。如果没有搜索条件匹配,在ELSE子句里的语句被执行

语法

CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list] ...
[ELSE statement_list]
END CASE
Or:

CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END CASE

1
2
3
4
5
6
7
8
9
10
11
12
13
实例

-- case 语句的使用
DROP PROCEDURE test_case;

DELIMITER $$
CREATE PROCEDURE test_case (IN param INT)
BEGIN
DECLARE result VARCHAR (10) ;
CASE param
WHEN param = 1
THEN SET result = "星期一" ;
WHEN param = 2
THEN SET result = "星期二" ;
WHEN param = 3
THEN SET result = "星期三" ;
ELSE SET result = "error";
END CASE ;
SELECT result AS "星期" ;
END $$
DELIMITER ;

CALL test_case(11);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2、循环控制语句
1、while语句
WHILE语句内的语句或语句群被重复,直至search_condition 为真。

WHILE语句可以被标注。 除非begin_label也存在,end_label才能被用,如果两者都存在,它们必须是一样的

先判断,后执行

语法

[begin_label:] WHILE search_condition DO
statement_list
END WHILE [end_label]
1
2
3
实例

-- while语句
DROP PROCEDURE IF EXISTS test_while;
DELIMITER $$

CREATE PROCEDURE test_while (IN a INT)
BEGIN
DECLARE param INT DEFAULT 5 ;
SET param=a;
SELECT "yyyy";
WHILE
param > 0 DO
SELECT
param ;
SET param = param - 1 ;

END WHILE ;

END $$
DELIMITER ;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2、repeat
REPEAT语句内的语句或语句群被重复,直至search_condition 为真。

先执行,后判断

语法

[begin_label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label]
1
2
3
4
实例

-- repeat语句
DROP PROCEDURE IF EXISTS test_repeat;
DELIMITER $$
CREATE PROCEDURE test_repeat(IN param INT)
BEGIN
SET @param=1;
REPEAT
SET @param=@param+1;
SELECT @param;
UNTIL @param>param
END REPEAT;
END $$
DELIMITER;

CALL test_repeat(2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
3、loop语句
LOOP允许某特定语句或语句群的重复执行,实现一个简单的循环构造。在循环内的语句一直重复直循环被退出,退出通常伴随着一个LEAVE 语句。

LOOP语句可以被标注。除非begin_label存在,否则end_label不能被给出,并且如果两者都出现,它们必须是同样的。

语法

[begin_label:] LOOP
statement_list
END LOOP [end_label]
1
2
3
实例

-- loop语句
DROP PROCEDURE test_loop;
DELIMITER$$
CREATE PROCEDURE test_loop (IN param INT)
BEGIN
f_loop :
LOOP
IF param < 1
THEN LEAVE f_loop ;
ELSE SET param = param - 1 ;
SELECT
param ;
END IF ;
END LOOP f_loop ;
END $$

DELIMITER;
CALL test_loop(4);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
4、leave语句
这个语句被用来退出任何被标注的流程控制构造。它和BEGIN … END或循环一起被使用

5、iterate
ITERATE只可以出现在LOOP, REPEAT, 和WHILE语句内。ITERATE意思为:“再次循环。”

CREATE PROCEDURE doiterate(p1 INT)
BEGIN
label1: LOOP
SET p1 = p1 + 1;
IF p1 < 10 THEN ITERATE label1; END IF;
LEAVE label1;
END LOOP label1;
SET @x = p1;
END

标签:语句,存储,END,--,param,statement,mysql,编写,PROCEDURE
From: https://www.cnblogs.com/zhoading/p/16784754.html

相关文章

  • MySQL详解
    MySQL1.初识mysqlJavaEE:企业级Java开发Web前端(页面:展示:数据)后台(连接点:连接数据库JDBC,连接前端(控制视图跳转,给前端传递数据))数据库(存数据,Txt,Excel,Word)只会写......
  • MySQL 中NULL和空值的区别
    NULL和空值NULL也就是在字段中存储NULL值,空值也就是字段中存储空字符('')。1、占用空间区别mysql>selectlength(NULL),length(''),length('1');+--------------+------......
  • HDFS、Ceph、GFS、GPFS、Swift、Lustre……容器云选择哪种分布式存储更好?
    HDFS、Ceph、GFS、GPFS、Swift、Lustre……容器云选择哪种分布式存储更好?-51CTO.COM   容器云在使用分布式存储时,HDFS、CEPH、GFS、GPFS、Swift等分布式存储哪种更......
  • mysql 插入Timestamp 少8个小时
    转:mysql插入timeStamp类型数据时间相差8小时的解决办法 mysql插入时间少八个小时 MySQL插入时间差八小时问题的解决方法如果时间和你本地当前时间一致说明mysql的时......
  • Mysql中的MVCC
     Mysql到底是怎么实现MVCC的?这个问题无数人都在问,但google中并无答案,本文尝试从Mysql源码中寻找答案。 在Mysql中MVCC是在Innodb存储引擎中得到支持的,Innodb为每行记录都......
  • Mysql主主同步配置方法
    环境服务器a:172.16.0.123服务器b:172.16.0.132Mysql版本:5.6.22SystemOS:CentOSrelease6.3创建同步用户服务器a和b分别建立一个同步用户:mysql>grantreplications......
  • MySQL存储IP地址的方法
    IP转数字函数inet_aton()mysql>selectinet_aton('192.168.1.1');+--------------------------+|inet_aton('192.168.1.1')|+--------------------------+|3232......
  • MySQL的语句执行顺序
    MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作。其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只是这些虚......
  • 关于mysql archive存储引擎
    政府还有一个让数据库专家摊上更多事情的职能,就是安全控制和数据审计。那些管理着海量数据仓库的企业官员常常得回答诸如“何人何时修改了什么”或者“何人何时查看了什么”......
  • mysql给表的字段加索引
    1、添加普通索引ALTERTABLE`table_name`ADDINDEXindex_name(`column`)2、添加主键索引ALTERTABLE`table_name`ADDPRIMARYKEY(`column`)3、添加唯一索引(UNIQ......