mysql 内置功能 存储过程 创建有参存储过程
对于存储过程,可以接收参数,其参数有三类: #in 仅用于传入参数用 #out 仅用于返回值用 #inout 既可以传入又可以当作返回值
传入参数使用格式 in 变量 数据类型
返回值使用格式 out 变量 数量类型
类似于python的函数
要在类似于python的函数的传值,但传值格式不同
delimiter // # 设置mysql结束符合为// create procedure p2(in n1 int,in n2 int,out res int) # 创建程序固定procedure 和p1是存储过程名字 BEGIN select * from db2.teacher where tid >n1 and tid <n2 ; # sql语句 # 调用一个执行成功与否的返回值 set res = 1; # 设置一个变量返回值 为1 ;结束 end // delimiter ;
#在mysql中调用
# 设置一个返回的初始值 初始值为0 如果sql语句执行完存储过程创建好后,返回值就为1
0代表假(执行失败),1代表真(执行成功)
set @x=0;
# 传参
@x的值 传给res
call p2(2,4,@x);
select * from db2.teacher where tid >2 and tid <4
mysql> set @x=0; Query OK, 0 rows affected (0.07 sec) mysql> call p2(2,4,@x); +-----+-----------------+ | tid | tname | +-----+-----------------+ | 3 | 刘海燕老师 | +-----+-----------------+ 1 row in set (0.11 sec) Query OK, 0 rows affected (0.13 sec)
查看返回值 @x
mysql> select @x; +------+ | @x | +------+ | 1 | +------+ 1 row in set (0.00 sec)
在python中基于pymysql调用:
0 相当于 set @x=0 直接传0就可以了
callproc('p2',(2,4,0))
import pymysql mysql_host = '192.168.0.108' port = 3306 mysql_user = 'root' mysql_pwd = '123' encoding = 'utf8' # 建立 连接mysql服务端 conn = pymysql.connect( host=mysql_host, # mysql服务端ip port=port, # mysql端口 user=mysql_user, # mysql 账号 password=mysql_pwd, # mysql服务端密码 db='db2', # 操作的库 charset=encoding # 读取字符串编码 ) # 拿到游标对象 cur = conn.cursor(pymysql.cursors.DictCursor) ''' 游标是给mysql提交命令的接口 mysql> 把sql语句传递到这里 ''' # 执行sql语句 cur.callproc('p2',(2,4,0)) # 打印查询结果 print(cur.fetchall()) # 执行完sql语句要关闭游标和mysql连接 cur.close() conn.close() ''' [{'tid': 3, 'tname': '刘海燕老师'}] '''
callproc()传参时候 涉及这几个参数
@_存储过程名字 _0 代表第一个参数 _1 第二个参数
@_p2_0=2,@_p2_1=4,@_p2_2=0
pymysql 查看返回值
用到 callproc传参的 @_p2_2
import pymysql mysql_host = '192.168.0.108' port = 3306 mysql_user = 'root' mysql_pwd = '123' encoding = 'utf8' # 建立 连接mysql服务端 conn = pymysql.connect( host=mysql_host, # mysql服务端ip port=port, # mysql端口 user=mysql_user, # mysql 账号 password=mysql_pwd, # mysql服务端密码 db='db2', # 操作的库 charset=encoding # 读取字符串编码 ) # 拿到游标对象 cur = conn.cursor(pymysql.cursors.DictCursor) ''' 游标是给mysql提交命令的接口 mysql> 把sql语句传递到这里 ''' # 执行sql语句 cur.callproc('p2',(2,4,0)) # 打印查询结果 print(cur.fetchall()) # 查看返回值 cur.execute('select @_p2_2;') # 打印查询结果 print(cur.fetchall()) # 执行完sql语句要关闭游标和mysql连接 cur.close() conn.close() ''' [{'tid': 3, 'tname': '刘海燕老师'}] [{'@_p2_2': 1}] '''