13 MySQL--存储过程

时间:2023-03-09 18:52:53
13 MySQL--存储过程

1、存储过程的介绍

  对于存储过程,可以接收参数,其参数有三类:
in 仅用于传入参数用
out 仅用于返回值用
inout 既可以传入又可以当作返回值
存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql。
优点:
1. 用于替代程序写的SQL语句,实现程序与sql解耦
2. 基于网络传输,传别名的数据量小,而直接传sql数据量大
缺点:
1. 程序员扩展功能不方便
补充:
程序与数据库结合使用的三种方式
#方式一:
MySQL:存储过程
程序:调用存储过程
评论:
应用程序与数据库解开耦合,效率高,发存储过程名就可以了,
但是实际情况:扩展性低,人为因素造成得! #方式二:
MySQL:
程序:纯SQL语句
评论:
通常用这种方式,运行效率低一些,但扩展性方便。 #方式三:
MySQL:
程序:类和对象,即ORM(本质还是纯SQL语句),Django框架里面有ORM框架,本质:应用程序控制sql
评论:
运行效率低,相比方式二,因为要转换,发送。
开发效率高,面向对象,可维护性高。

2、准备表

13 MySQL--存储过程

创建存储过程

无参数存储过程

#1、无参存储过程
delimiter //
create procedure p1()
BEGIN
select * from db7.teacher;
END //
delimiter ; # MySQL中调用
call p1(); # Python中调用
cursor.callproc('p1')

# 在MySQL中调用

13 MySQL--存储过程

删除创建的存储过程:

13 MySQL--存储过程

在pycharm开发环境中调用

13 MySQL--存储过程

((1, '张磊老师'), (2, '李平老师'), (3, '刘海燕老师'), (4, '朱云海老师'), (5, '李杰老师'))

有参数存储过程

#2、有参存储过程
in n1 int,in n2 int,out res int
in
指的是传入参数
out 指的是传出参数

delimiter //
create procedure p2(in n1 int,in n2 int,out res int)
BEGIN
select * from db7.teacher where tid > n1 and tid < n2;
set res = 1;
END //
delimiter ; # MySQL中调用
# 设定初始值
set @x=0
call p2(2,4,@x);
select @x; # Python中调用
cursor.callproc('p2',(2,4,0))# @_p2_0=2,@_p2_1=4,@_p2_2=0
cursor.execute('select @_p3_2')
cursor.fetchone()

13 MySQL--存储过程

 # MySQL中调用# 设定初始值

13 MySQL--存储过程

13 MySQL--存储过程

在pycharm开发环境中

13 MySQL--存储过程

((3, '刘海燕老师'),)
(1,)

删除存储过程drop procedure proc_name;