老铁们,大家好,相信还有很多朋友对于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;
+——–+
| @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).变量范围
当执行结束时,内部变量在其范围内具有更高的优先级。变量,内部变量消失。此时,它超出了它的作用域,并且该变量不再可见。这应该是因为在存储过程之外无法再找到声明的变量,但是您可以传递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;
– 如果结束;
– 结束循环;
-结尾;
– //
原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/125535.html
用户评论
来自火星球的我
终于找到一篇关于存储过程的文章了!我最近在学习数据库,发现它们的功能真的非常强大。特别是存储过程可以重复执行相同的代码块,提高效率简直太棒了~
有5位网友表示赞同!
一生只盼一人
说真的,一开始对存储过程的概念有点懵懂,看这篇的解释还是理解了一大半。感觉用存储过程能让我们写更简洁的SQL语句,而且安全性也能得到保障。
有11位网友表示赞同!
軨倾词
学习数据库就是学着玩新的工具,这次遇到的难题刚好解决!之前一直不知道如何优化代码效率,看来要好好研究一下MySQL存储过程了.
有10位网友表示赞同!
艺菲
这篇博文写的太简略了,关于存储过程的优点和缺点都没有详细分析。更希望作者能再多说一些具体的例子和应用场景,这样对理解更加深刻
有8位网友表示赞同!
昂贵的背影
我也是新手学习数据库,感觉存储过程这个东西看起来有点复杂啊… 能不能多介绍一些具体的步骤和操作方法? 我才能够上手练习!
有11位网友表示赞同!
枫无痕
我一直觉得数据库的设计就像搭积木一样,每一块都能单独使用,也可以组合成更复杂的结构。像是存储过程这种“小模块”,能让我们把代码组织得更加井井有条,非常棒!
有11位网友表示赞同!
灬一抹丶苍白
我之前用过一些第三方库来实现类似的功能,但现在看来MySQL本身提供的存储过程也一样强大啊! 这对我来说是个很大的福音,可以减少代码复杂度。
有11位网友表示赞同!
巷口酒肆
说实话,我对数据库的学习一直停滞不前,感觉太过于抽象。这篇博文的例子让我更加理解了存储过程的作用和优势! 现在我要去练习一下啦!
有9位网友表示赞同!
灼痛
MySQL真厉害!我还以为存储过程只能做些简单的操作,没想到还能实现逻辑复杂的业务处理呢! 之前遇到的那些问题,是不是可以使用存储过程来解决?
有12位网友表示赞同!
柠夏初开
这种讲解方式还是比较浅薄的,希望作者能用更深入的方式解释存储过程的设计思想和优缺点。 比如如何进行性能优化,以及在实际应用中常见的陷阱等等。
有14位网友表示赞同!
红尘烟雨
我的项目最近遇到了一个数据处理效率的问题,看来要学习一下MySQL存储过程来解决! 好像这个概念和之前学习的函数有点类似,但功能更强大。
有14位网友表示赞同!
素颜倾城
这篇博文让我明白了一些mysql存储过程的知识点,感觉它确实可以有效提高SQL代码的执行效率。 不过我还是想了解更多关于优化存储过程性能的小技巧!
有19位网友表示赞同!
愁杀
我之前一直习惯使用单行语句来完成数据库操作,现在想想使用存储过程确实更有优势。 比如批量更新、事务处理等等场景都可以使用存储过程来实现,更安全更高效!
有18位网友表示赞同!
沐晴つ
学习编程真的像是在不断探索新世界,这次又了解了一个新的数据库功能! 感觉越来越喜欢MySQL了,它这么强大实用的工具,一定会成为我未来开发工作的宝贵武器!
有9位网友表示赞同!
最怕挣扎
对于新手来说,这篇博文内容稍微有些深奥,希望能再详细一些。例如存储过程的定义、类型以及常见的运用场景等等,更容易理解!
有17位网友表示赞同!
此生一诺
MySQL虽然强大,但是存储过程也有一定局限性,比如维护难度比较大,需要谨慎使用等等。 希望作者能够多谈一谈存储过程潜在的问题和解决方案。
有18位网友表示赞同!
羁绊你
我觉得存储过程就像数据库里的“小机器人”,可以帮助我们重复执行一些比较复杂的操作步骤。 这真是个神器啊! 以前浪费了不少时间在写重复代码上.
有13位网友表示赞同!