怎么执行MySQL的存储过程
admin
2023-01-25 01:40:05
0

下文我给大家简单讲讲关于怎么执行MySQL的存储过程,大家之前了解过相关类似主题内容吗?感兴趣的话就一起来看看这篇文章吧,相信看完怎么执行MySQL的存储过程对大家多少有点帮助吧。

一、存储过程

存储过程是在大型数据库系统中一组为了完成特定功能的SQL语句集,存储在数据库中。存储过程经过第一次编译后,再次调用不需要编译,用户可以通过指定的存储过程名和给出一些存储过程定义的参数来使用它。存储过程就是为以后使用而保存的一条或多条SQL语句,个人理解跟函数类似,一般用的较少。

好处:

  1. 通过把处理封装在一个易用的单元中,可以简化复杂的操作。
    2.不需要反复建立一系列的处理步骤,因而保证了数据的一致性。
    3.简化了对变动的管理,这一点的延伸就是安全性。
    4.存储过程通常以编译过的形式存储,所以DBMS处理命令所需的工作量少,提高了性能。

 缺点:

1.可移植性差
2.对于简单的SQL语句,存储过程没什么优势
4.如果只有一个用户使用数据库,那么存储过程对安全也没什么影响
5.团队开发时需要先统一标准,否则后期维护成本大
6.在大并发量访问的情况下,不宜写过多涉及运算的存储过程
7.业务逻辑复杂时,特别是涉及到对很大的表进行操作的时候,不如在前端先简化业务逻辑

二、存储过程语法格式

一般形式

create procedure [过程名]([in|out|inout] [参数名] [参数类型],...)
begin
    [SQL语句集;]
end

在定义参数部分时in表示传入参数,读取外部变量值赋给内部参数,但内部参数的作用域仅限存储过程;out表示传出参数,将内部参数传递到外部变量;inout既有in的功能,又用out的功能,属于in与out的结合体。在都不写的情况下,默认使用in选项
但是,由于SQL语句集部分一样使用的是分号(;)作为分隔符,所以要在创建存储过程前使用delimiter重新定义分隔符,并在创建完成后将分隔符还原。delimiter [新分隔符]

完整格式

delimiter [新分隔符]
create procedure [过程名]([in|out|inout] [参数名] [参数类型],...)
begin
    SQL语句集;         
end[新分隔符]
delimiter;

三、存储过程创建举例说明:

1.创建单条SQL存储过程select_id(),(没什么实际意义,仅仅举例)

delimiter //
create procedure select_id(inout id_inout int)
begin
    select user_id from user where user_id=id_inout;        
end//
delimiter;
##创建存储过程select_id()

2.创建好存储过程select_id()后,会保存在数据库中。如果创同名的存储过程会报错,若要创建相同名称的存储过程,需要删除后方可创建。

PROCEDURE select_id already exists
  1. 创建多条SQL存储过程select_ids()
delimiter $$
create procedure select_ids()
begin
    select user_id from user;       
        select customer_id from user;       
end$$
delimiter;

四、调用存储过程

调用存储过程很简单,call [过程名](@[外部参数名],.

调用select_id()

set@user_id=62356;
call select_id(@user_id);
或者
call select_id(62356)

调用select_ids()

call select_ids();

 五、查看存储过程

1.查看存储过程具体内容

show create procedure test.select_id;

2.查看存储过程状态

show PROCEDURE status;

     六、删除存储过程

drop procedure [过程名];

drop procedure test.select_id;

 七、SQL语句集延伸说明

1)定义存储过程的内部变量

  定义变量语句:declare [变量名,...] [变量类型] [default 默认值];

  赋值语句:set [变量名]=[表达式];

  可以一次定义多个同类型的变量,并且设置初始值。

2)多层嵌套

mysql> delimiter //
mysql> create procedure select3()
    -> begin
    -> declare name varchar(20) default '学生';
    -> select name;
    -> begin
    -> declare name varchar(20) default '老师';
    -> select name;
    -> end;
    -> end //
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

3)条件语句

if语句

if [判断语句] then
[执行内容]
end if;

if [判断语句] then
[执行内容]
else
[执行内容]
end if;

case语句

case [变量名]
when [值] then
[执行内容]
when [值] then
[执行内容]
...
else
[执行内容]
end case;

循环语句

while语句,先判断后运行

while [判断语句] do
[执行内容]
end while
mysql> create procedure `while`(in num int)
    -> begin
    -> declare var int;
    -> set var=0;
    -> while var set var=var+1;
    -> end while;
    -> select var;
    -> end //

repeat语句,先运行后判断

repeat
[执行内容]
until [判断语句]
end repeat;
mysql> create procedure `repeat`(in num int)
    -> begin
    -> declare var int;
    -> set var=0;
    -> repeat
    -> set var=var+2;
    -> until var>num
    -> end repeat;
    -> select var;
    -> end //

loop语句,运行直到遇到leave

[标签名]:loop
[执行内容]
leave [标签名]
[执行内容]
end loop;
mysql> create procedure `loop`(in num int)
    -> begin
    -> declare var int;
    -> set var=0;
    -> label1:loop
    -> set var=var+2;
    -> if var>num then
    -> leave label1;
    -> end if;
    -> end loop;
    -> select var;

   -> end //

大家觉得怎么执行MySQL的存储过程这篇文章怎么样,是否有所收获。如果想要了解更多相关,可以继续关注我们的行业资讯板块。

相关内容

热门资讯

时隔一年,英国国防大臣斯特里廷... 一年前,当时还是英国卫生大臣的韦斯·斯特里廷(Wes Streeting)曾公开指责以色列犯下战争罪...
微软与Mistral宣布扩大战... 【CNMO科技消息】7月22日,据韩媒报道,微软与法国AI企业Mistral正式宣布大幅扩大双方战略...
东方空间引力一号(遥四)运载火... 本报讯 (记者袁传玺)北京时间7月22日10时54分,东方空间引力一号(遥四)·星联体号运载火箭在我...
“你的手上沾满鲜血”,美防长出... 当地时间21日,美国国防部长赫格塞思在出席国会参议院听证会时表示,根据最新估算,美国对伊朗战事的花费...
Kimi K3让美国羡慕又不甘... 北京时间7月17日凌晨,月之暗面公司发布开源大模型Kimi K3。据报道,该模型总参数规模达2.8万...
对话高正祺:AI五年内或接管芯... 2021 年,高正祺到 MIT 读博士时,ChatGPT 还没有发布。五年后,他已经可以把一份模拟电...
伊朗军方消息人士:若美袭击伊桥... △伊朗霍尔木兹甘省一座桥梁近日遭美军空袭总台记者当地时间22日获悉,一名伊朗军方消息人士针对美方最新...
外国男子在云南跳伞,半空迟迟不... 近日,有视频显示,一名外国男子背着降落伞从玻璃栈道上跳入峡谷,栈道上有游客拍照鼓掌。男子跳下后,以高...
美国人开始在直播间里“抢”东西... 作者 | 竹芒今年夏天,许多美国消费者的手机屏幕上,出现了这样一幅画面:倒计时十五秒,一件商品的价格...
伊朗连炸20座机库,造成数十名... 伊朗公布重大战果。伊朗WANA通讯社转引伊朗伊斯兰革命卫队第31号声明称,在“胜利2号行动”第21轮...