14.存储过程

定义

存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql,类似于python中的自定义函数

基本使用

delimiter $$
create procedure p1()
begin
select * from user;
end $$
delimiter ;

调用

call p1()

三种开发模型

第一种

应用程序:只需要开发应用程序的逻辑
mysql:编写好存储过程,以供应用程序调用
优点:开发效率,执行效率都高
缺点:考虑到人为因素、跨部门沟通等问题,会导致扩展性差

第二种

应用程序:除了开发应用程序的逻辑,还需要编写原生sql
优点:比方式1,扩展性高(非技术性的)
缺点:
1、开发效率,执行效率都不如方式1
2、编写原生sql太过于复杂,而且需要考虑到sql语句的优化问题

第三种

应用程序:开发应用程序的逻辑,不需要编写原生sql,基于别人编写好的框架来处理数据,ORM
优点:不用再编写纯生sql,这意味着开发效率比方式2高,同时兼容方式2扩展性高的好处
缺点:执行效率连方式2都比不过

创建存储过程的代码展示

delimiter $$
create procedure p2(
in m int, # in表示这个参数必须只能是传入不能被返回出去
in n int,
out res int # out表示这个参数可以被返回出去
)
begin
select tname from teacher where tid > m and tid < n;
set res=0; # 用来标志存储过程是否执行
end $$
delimiter ;

针对res需要先提前定义

set @res=10; 定义 res=10
select @res; 查看
call p2(1,5,@res) 调用
select @res 查看

使用存储过程例子

前提条件:存储过程在哪个库下面创建的只能在对应的库下面才能使用!!!

1、直接在mysql中调用
set @res=10 # res的值是用来判断存储过程是否被执行成功的依据,所以需要先定义一个变量@res存储10
call p1(2,4,10); # 报错
call p1(2,4,@res);
# 查看结果
select @res; # 执行成功,@res变量值发生了变化

2、在python程序中调用
pymysql链接mysql
产生的游表cursor.callproc('p1',(2,4,10))
# 内部原理:@_p1_0=2,@_p1_1=4,@_p1_2=10;
cursor.excute('select @_p1_2;')

posted @ 2023-07-17 16:34  苙萨汗  阅读(32)  评论(0)    收藏  举报