MySQL 数据库存储过程

MySQL 5.0 版本开始支持存储过程。存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。存储过程是

老铁们,大家好,相信还有很多朋友对于MySQL 数据库存储过程和的相关问题不太懂,没关系,今天就由我来为大家分享分享MySQL 数据库存储过程以及的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!

存储过程是一组完成特定功能的SQL语句。它们被编译、创建并保存在数据库中。用户可以通过指定存储过程的名称并给出参数(需要时)来调用和执行它们。

存储过程的概念很简单,就是数据库SQL语言层面的代码封装和复用。

优势

存储过程可以封装和隐藏复杂的业务逻辑。存储过程可以返回值并接受参数。存储过程不能使用SELECT 指令运行,因为它是子例程,与查找表、数据表或用户定义函数不同。存储过程可用于数据验证、执行业务逻辑等。缺点

由于支持的编程语言不同,存储过程通常是针对特定数据库定制的。当改用其他厂家的数据库系统时,需要重写原来的存储过程。存储过程的性能调优和编写受到各种数据库系统的限制。 1.存储过程的创建和调用

存储过程是一段带有名称的代码,用于完成特定的功能。创建的存储过程保存在数据库的数据字典中。创建存储过程

创造

[定义者={用户| CURRENT_USER}]

PROCEDURE sp_name ([proc_parameter[,]])

[特征.]routine_body

proc_parameter:

[ 在|输出| INOUT ] param_name 类型

特征:

评论“字符串”

|语言SQL

| [不是]确定性

| { 包含SQL |没有SQL |读取SQL 数据|修改SQL 数据}

| SQL 安全性{ 定义器|祈求者}

例程_body:

有效的SQL 例程语句

[begin_label:] 开始

[声明_列表]

……

MYSQL存储过程中的关键语法

创建数据库并备份数据表进行示例操作:

mysql 创建数据库db1;

mysql使用db1;

mysql 创建表PLAYERS 作为select * from TENNIS.PLAYERS;

mysql 创建表MATCHES as select * from TENNIS.MATCHES;

以下是删除给定玩家玩过的所有游戏的存储过程示例:

mysql delimiter $#将语句的结束符号由分号改为;暂时到两块钱(可定制)

mysql CREATE PROCEDURE delete_matches(IN p_playerno INTEGER)

– 开始

-从匹配中删除

– WHERE 玩家编号=p_playerno;

查询正常,0 行受影响(0.01 秒)

mysql delimiter;#将语句的结束符号恢复为分号

分析:默认情况下,存储过程是与默认数据库关联的。如果要指定存储过程在特定数据库下创建,则在过程名称前加上数据库名称前缀。定义过程时,使用DELIMITER $命令暂时将语句的结束符号由分号改为;改为两个$,这样过程体中使用的分号就直接传递到服务器端,而不需要客户端(如mysql)解释。

调用存储过程:

call sp_name[(参数)];mysql select * from MATCHES;

+———+——–+———-+—–+—–+

|匹配号|团队|玩家号|赢得|迷失|

+———+——–+———-+—–+—–+

| 1 | 1 | 6 | 3 | 1 |

| 7 | 1 | 57 | 57 3 | 0 |

| 8 | 1 | 8 | 0 | 3 |

| 9 | 2 | 27 | 27 3 | 2 |

| 11 | 11 2 | 112 | 112 2 | 3 |

+———+——–+———-+—–+—–+

5 行一组(0.00 秒)

mysql 调用delete_matches(57);

查询正常,1 行受影响(0.03 秒)

mysql 从匹配中选择*;

+———+——–+———-+—–+—–+

|匹配号|团队|玩家号|赢得|迷失|

+———+——–+———-+—–+—–+

| 1 | 1 | 6 | 3 | 1 |

| 8 | 1 | 8 | 0 | 3 |

| 9 | 2 | 27 | 27 3 | 2 |

| 11 | 11 2 | 112 | 112 2 | 3 |

+———+——–+———-+—–+—–+

4 行一组(0.00 秒)

分析:存储过程中设置了需要作为参数传递的变量p_playerno。调用存储过程时,通过传递参数的方式将57赋值给p_playerno,然后执行存储过程中的SQL操作。

存储过程体

过程体格式:以begin开头,以end结束(可嵌套) label1: BEGIN

标签2:开始

标签3: 开始

声明;

标签有两个用途:

1.增强代码的可读性2.在某些语句中(如:leave、iterate语句)需要使用标签2.存储过程的参数

存储过程的定义中使用了MySQL存储过程的参数。参数类型有IN、OUT 和INOUT 三种,其形式为:

CREATEPROCEDURE 存储过程名称([[IN |OUT |INOUT ] 参数名称数据类型.])IN 输入参数:表示调用者向进程传入一个值(传入的值可以是文字或变量) OUT输出参数:表示进程向调用者传递一个值(可以返回多个值)(传出值只能是变量) INOUT 输入输出参数:表示调用者向进程传递一个值,表示进程向调用者传递一个值(值只能是变量) 1. 在输入参数中

mysql 分隔符$

mysql 创建过程in_param(in p_in int)

-开始

– 选择p_in;

– 设置p_in=2;

– 选择P_in;

-结束$

mysql 分隔符;

mysql 设置@p_in=1;

mysql 调用in_param(@p_in);

+——+

| p_in |

+——+

| 1 |

+——+

+——+

| P_in |

+——+

| 2 |

+——+

mysql 选择@p_in;

+——–+

| @p_in |

+——–+

| 1 |

+——–+

从上面可以看出,存储过程中修改了p_in,但是并不影响@p_id的值,因为前者是局部变量,后者是全局变量。

2.out输出参数

mysql 分隔符//

mysql 创建过程out_param(out p_out int)

-开始

– 选择p_out;

– 设置p_out=2;

– 选择p_out;

– 结尾

– //

mysql 分隔符;

mysql设置@p_out=1;

mysql 调用out_param(@p_out);

+——–+

| p_输出|

+——–+

|空|

+——–+

#因为out向调用者输出参数,不接收输入参数,所以存储过程中的p_out为null。

+——–+

| p_输出|

+——–+

| 2 |

+——–+

mysql 选择@p_out;

MySQL 数据库存储过程

+——–+

| @p_out |

+——–+

| 2 |

+——–+

#调用out_param存储过程,输出参数,并改变p_out变量的值

3.inout输入参数

mysql 分隔符$

mysql 创建过程inout_param(inout p_inout int)

-开始

– 选择p_inout;

– 设置p_inout=2;

– 选择p_inout;

– 结尾

– $

mysql 分隔符;

mysql 设置@p_inout=1;

mysql 调用inout_param(@p_inout);

+———+

| p_inout |

+———+

| 1 |

+———+

+———+

| p_inout |

+———+

| 2 |

+———+

mysql 选择@p_inout;

+———-+

| @p_inout |

+———-+

| 2 |

+———-+

#调用inout_param存储过程,接受输入参数,也输出参数,并改变变量

注意:

1. 如果过程没有参数,则必须在过程名称后面加上括号。例子:

创建过程sp_name ([proc_parameter[,]]) .2.确保参数名称不等于列名称,否则在过程体中,参数名称将被视为列名称。

建议:

输入值使用in参数。返回值使用out参数。尽可能少地使用inout 参数。 3. 变量

1.变量定义

例如:

声明l_int int 无符号默认值4000000;

声明l_numeric number(8,2) 默认9.95;

声明l_date 日期默认“1999-12-31”;

声明l_datetime日期时间默认’1999-12-31 23:59:59′;

DECLARE l_varchar varchar(255) DEFAULT ‘这不会被填充’;

2. 变量赋值

SET 变量名=表达式值[, 变量名=表达式.]3.用户变量

在MySQL 客户端中使用用户变量:

mysql 选择“Hello World”到@x;

mysql 选择@x;

+————-+

| @x|

+————-+

|你好世界|

+————-+

mysql SET @y=’再见残酷的世界’;

mysql 选择@y;

+——————–+

| @y |

+——————–+

|再见残酷的世界|

+——————————–+

mysql SET @z=1+2+3;

mysql 选择@z;

+——+

| @z |

+——+

| 6 |

+——+

在存储过程中使用用户变量

mysql 创建过程GreetWorld( ) SELECT CONCAT(@greeting,’World’);

mysql SET @greeting=’你好’;

mysql 调用GreetWorld( );

+————————————–+

| CONCAT(@greeting,’世界’) |

+————————————–+

|你好世界|

+————————————–+

在存储过程之间传递全局范围的用户变量

mysql 创建过程p1() SET @last_procedure=’p1′;

mysql CREATE PROCEDURE p2() SELECT CONCAT(‘最后一个过程是’,@last_procedure);

mysql 调用p1( );

mysql 调用p2( );

+———————————————— -+

| CONCAT(‘最后一个过程是’,@last_proc |

+———————————————— -+

|最后一个程序是p1 |

+———————————————— -+

注:

1、用户变量名一般以@开头2、滥用用户变量会导致程序难以理解和管理4、注释

MySQL存储过程可以使用两种风格的注释

两条横线–:这种风格一般用于单行注释。

c风格:一般用于多行注释。

例如:

mysql 分隔符//

mysql CREATE PROCEDURE proc1 –name 存储过程名称

– (输入参数1 整数)

– 开始

– 声明变量1 CHAR(10);

– IF 参数1=17 THEN

– SET 变量1=’鸟’;

– 别的

– SET 变量1=’野兽’;

– 插入表1 值(变量1);

– //

mysql 分隔符;

MySQL存储过程调用

使用call 后跟您的过程名称和括号。在括号中,根据需要添加参数。参数包括输入参数、输出参数、输入输出参数。具体调用方法请参考上面的例子。

MySQL存储过程查询

如果我们知道一个数据库下有哪些表,我们通常使用showtables;查看它们。所以我们要查看某个数据库下的存储过程。我们也可以使用吗?答案是我们可以查看数据库下的存储过程,但是用另一种方式。

我们可以使用如下语句进行查询:

selectname from mysql.proc where db=’数据库名称’;或从information_schema.routines 中选择routine_name,其中routine_schema=’数据库名称’;或showprocedure status where db=’数据库名称’;如果我们想了解一个存储过程的详细信息,那么我们应该怎么做呢?我也可以使用描述表名来像操作表一样查看它吗?

答案是:我们可以查看存储过程的详细信息,但是我们需要使用另一种方法:

SHOWCREATE PROCEDURE 数据库.存储过程名称;您可以查看当前存储过程的详细信息。

MySQL存储过程的修改

ALTER PROCEDURE 更改使用CREATE PROCEDURE 创建的预先指定的存储过程,而不影响相关的存储过程或存储功能。

删除MySQL存储过程

删除存储过程比较简单,就像删除表一样:

DROPPROCEDURE 从MySQL 表中删除一个或多个存储过程。

MySQL存储过程控制语句

(1).变量范围

MySQL 数据库存储过程

当执行结束时,内部变量在其范围内具有更高的优先级。变量,内部变量消失。此时,它超出了它的作用域,并且该变量不再可见。这应该是因为在存储过程之外无法再找到声明的变量,但是您可以传递out 参数或将其值赋给会话变量。以保存其价值。

mysql 分隔符//

mysql 创建过程proc3()

-开始

– 声明x1 varchar(5) 默认“外部”;

-开始

– 声明x1 varchar(5) 默认“内部”;

– 选择x1;

-结尾;

– 选择x1;

-结尾;

– //

mysql 分隔符;

(2)。条件语句

1. if-then-else 语句

mysql 分隔符//

mysql CREATE PROCEDURE proc2(IN 参数int)

-开始

– 声明var int;

– 设置var=参数+1;

– 如果var=0 那么

– 插入t 值(17);

– 如果结束;

– 如果参数=0则

– 更新t集合s1=s1+1;

-别的

– 更新t集合s1=s1+2;

– 如果结束;

-结尾;

– //

mysql 分隔符;

2.案例陈述:

mysql 分隔符//

mysql CREATE PROCEDURE proc3(在参数int 中)

-开始

– 声明var int;

– 设置var=参数+1;

– 案例变量

– 当0 时

– 插入t 值(17);

– 当1 时

– 插入t 值(18);

-别的

– 插入t 值(19);

– 最终情况;

-结尾;

– //

mysql 分隔符;

案件

当var=0 时

插入t 值(30);

当var0 那么

当var0 那么

别的

最终情况

(3)。循环语句

1. while ····结束while

mysql 分隔符//

mysql 创建过程proc4()

-开始

– 声明var int;

– 设置变量=0;

– 而var6 则这样做

– 插入t 值(var);

– 设置变量=变量+1;

– 结束同时;

-结尾;

– //

mysql 分隔符;

while 条件do — 循环体endwhile2。重复……重复结束

它在执行操作后检查结果,而while 在执行前检查。

mysql 分隔符//

mysql 创建过程proc5 ()

-开始

– 声明v int;

– 设置v=0;

-重复

– 插入t 值(v);

– 设置v=v+1;

– 直到v=5

– 结束重复;

-结尾;

– //

mysql 分隔符;

重复–循环体直到循环条件结束重复;3。循环·····结束循环

Loop循环不需要初始条件,这一点与while循环类似。同时,它不需要像repeat循环那样的结束条件。 leave语句的意思是离开循环。

mysql 分隔符//

mysql 创建过程proc6 ()

-开始

– 声明v int;

– 设置v=0;

-LOOP_LABLE:循环

– 插入t 值(v);

– 设置v=v+1;

– 如果v=5 那么

– 保留LOOP_LABLE;

– 如果结束;

– 结束循环;

-结尾;

– //

mysql 分隔符;

4. LABLES标签:

标签可以用在begin、repeat while 或loop 语句之前,并且语句标签只能在合法语句之前使用。您可以跳出循环,使执行指令到达复合语句的最后一步。

(4)。迭代迭代

ITERATE 通过引用其标签: 重新启动复合语句

mysql 分隔符//

mysql 创建过程proc10 ()

-开始

– 声明v int;

– 设置v=0;

-LOOP_LABLE:循环

– 如果v=3 那么

– 设置v=v+1;

– 迭代循环标签;

– 如果结束;

– 插入t 值(v);

– 设置v=v+1;

– 如果v=5 那么

– 保留LOOP_LABLE;

– 如果结束;

– 结束循环;

-结尾;

– //

用户评论

MySQL 数据库存储过程
来自火星球的我

终于找到一篇关于存储过程的文章了!我最近在学习数据库,发现它们的功能真的非常强大。特别是存储过程可以重复执行相同的代码块,提高效率简直太棒了~

    有5位网友表示赞同!

MySQL 数据库存储过程
一生只盼一人

说真的,一开始对存储过程的概念有点懵懂,看这篇的解释还是理解了一大半。感觉用存储过程能让我们写更简洁的SQL语句,而且安全性也能得到保障。

    有11位网友表示赞同!

MySQL 数据库存储过程
軨倾词

学习数据库就是学着玩新的工具,这次遇到的难题刚好解决!之前一直不知道如何优化代码效率,看来要好好研究一下MySQL存储过程了.

    有10位网友表示赞同!

MySQL 数据库存储过程
艺菲

这篇博文写的太简略了,关于存储过程的优点和缺点都没有详细分析。更希望作者能再多说一些具体的例子和应用场景,这样对理解更加深刻

    有8位网友表示赞同!

MySQL 数据库存储过程
昂贵的背影

我也是新手学习数据库,感觉存储过程这个东西看起来有点复杂啊… 能不能多介绍一些具体的步骤和操作方法? 我才能够上手练习!

    有11位网友表示赞同!

MySQL 数据库存储过程
枫无痕

我一直觉得数据库的设计就像搭积木一样,每一块都能单独使用,也可以组合成更复杂的结构。像是存储过程这种“小模块”,能让我们把代码组织得更加井井有条,非常棒!

    有11位网友表示赞同!

MySQL 数据库存储过程
灬一抹丶苍白

我之前用过一些第三方库来实现类似的功能,但现在看来MySQL本身提供的存储过程也一样强大啊! 这对我来说是个很大的福音,可以减少代码复杂度。

    有11位网友表示赞同!

MySQL 数据库存储过程
巷口酒肆

说实话,我对数据库的学习一直停滞不前,感觉太过于抽象。这篇博文的例子让我更加理解了存储过程的作用和优势! 现在我要去练习一下啦!

    有9位网友表示赞同!

MySQL 数据库存储过程
灼痛

MySQL真厉害!我还以为存储过程只能做些简单的操作,没想到还能实现逻辑复杂的业务处理呢! 之前遇到的那些问题,是不是可以使用存储过程来解决?

    有12位网友表示赞同!

MySQL 数据库存储过程
柠夏初开

这种讲解方式还是比较浅薄的,希望作者能用更深入的方式解释存储过程的设计思想和优缺点。 比如如何进行性能优化,以及在实际应用中常见的陷阱等等。

    有14位网友表示赞同!

MySQL 数据库存储过程
红尘烟雨

我的项目最近遇到了一个数据处理效率的问题,看来要学习一下MySQL存储过程来解决! 好像这个概念和之前学习的函数有点类似,但功能更强大。

    有14位网友表示赞同!

MySQL 数据库存储过程
素颜倾城

这篇博文让我明白了一些mysql存储过程的知识点,感觉它确实可以有效提高SQL代码的执行效率。 不过我还是想了解更多关于优化存储过程性能的小技巧!

    有19位网友表示赞同!

MySQL 数据库存储过程
愁杀

我之前一直习惯使用单行语句来完成数据库操作,现在想想使用存储过程确实更有优势。 比如批量更新、事务处理等等场景都可以使用存储过程来实现,更安全更高效!

    有18位网友表示赞同!

MySQL 数据库存储过程
沐晴つ

学习编程真的像是在不断探索新世界,这次又了解了一个新的数据库功能! 感觉越来越喜欢MySQL了,它这么强大实用的工具,一定会成为我未来开发工作的宝贵武器!

    有9位网友表示赞同!

MySQL 数据库存储过程
最怕挣扎

对于新手来说,这篇博文内容稍微有些深奥,希望能再详细一些。例如存储过程的定义、类型以及常见的运用场景等等,更容易理解!

    有17位网友表示赞同!

MySQL 数据库存储过程
此生一诺

MySQL虽然强大,但是存储过程也有一定局限性,比如维护难度比较大,需要谨慎使用等等。 希望作者能够多谈一谈存储过程潜在的问题和解决方案。

    有18位网友表示赞同!

MySQL 数据库存储过程
羁绊你

我觉得存储过程就像数据库里的“小机器人”,可以帮助我们重复执行一些比较复杂的操作步骤。 这真是个神器啊! 以前浪费了不少时间在写重复代码上.

    有13位网友表示赞同!

原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/125535.html

(0)
小su的头像小su
上一篇 2024年9月1日 下午8:08
下一篇 2024年9月1日 下午8:09

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注