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  苙萨汗  阅读(14)  评论(0)    收藏  举报