MySQL 存储过程返回多个值
MySQL 存储过程返回多个值
在本教程中,您将学习如何编写/开发返回多个值的存储过程。
MySQL存储函数只返回一个值。要开发返回多个值的存储过程,需要使用带有INOUT或OUT参数的存储过程。
返回多个值的存储过程示例
我们看看 orderinfo 表

表中数据

以下存储过程接受点买家姓名,并返回各个状态的订单总数。
-- 手动创建存储过程 CheckOrderStatus
use test;
DROP PROCEDURE IF EXISTS CountOrderByStatus;
DELIMITER $$
use test$$
CREATE PROCEDURE CheckOrderStatus(
IN cust_name VARCHAR(20),
OUT 50Count INT,
OUT 60Count INT,
OUT 80Count INT,
out 90Count INT)
BEGIN
-- 50Count
SELECT count(*) INTO 50Count
FROM orderinfo
WHERE buyer_name = cust_name
AND order_status = ''; -- 60Count
SELECT count(*) INTO 50Count
FROM orderinfo
WHERE buyer_name = cust_name
AND order_status = ''; -- 80Count
SELECT count(*) INTO 50Count
FROM orderinfo
WHERE buyer_name = cust_name
AND order_status = ''; -- 90Count
SELECT count(*) INTO 50Count
FROM orderinfo
WHERE buyer_name = cust_name
AND order_status = ''; END$$
DELIMITER ;
除IN参数之外,存储过程还需要4个额外的OUT参数:50Count, 50Count, 50Count 和 50Count。 在存储过程中,使用带有COUNT函数的SELECT语句根据订单状态获取相应的订单总数,并将其分配给相应的参数。
要使用CountOrderByStatus存储过程,可以传递客户名称和四个用户定义的变量来获取输出值。
执行存储过程后,使用SELECT语句输出变量值。
call CheckOrderStatus('哪吒',@50Count,@60Count,@80Count,@90Count);
SELECT @50Count,@60Count,@80Count,@90Count;

从Python调用返回多个值的存储过程
以下代码片段显示如何从Python程序中调用返回多个值的存储过程。
import pymysql def callProcedure1(name):
'''调用存储过程,
输入参数:姓名,输出:统计状态数;
使用输出参数方式'''
count1 = ''
count2 = ''
count3 = ''
count4 = ''
db = pymysql.connect('127.0.0.1','adil','helloyyj','test',3306,charset='UTF8')
cur = db.cursor()
# 调用 CheckOrderStatus 存储过程,传入4个参数
cur.callproc('CheckOrderStatus', args= (name, count1, count2, count3,count4))
# 以 python 固定格式获取返回的值:@_存储过程名_0, 第一个返回值
t = cur.execute('SELECT @_CheckOrderStatus_0,@_CheckOrderStatus_1,@_CheckOrderStatus_2,@_CheckOrderStatus_3;')
print(t)
data = cur.fetchall()
print(data)
if data :
for rec in data:
for i in range(len(rec)):
print(rec[i])
cur.close()
db.close() def callProcedure12(name):
'''调用存储过程,
输入参数:编号,在线时间,输出:帐号,密码;
使用select返回记录方式''' db = pymysql.connect('127.0.0.1', 'adil', 'helloyyj', 'test1', 3306, charset='UTF8') cur =db.cursor()
# 调用 存储过程
cur.execute('call CheckOrderStatus1("哪吒",@50Count,@60Count,@80Count,@90Count)')
# 执行 select 获取 参数返回值
t1 = cur.execute('SELECT @50Count,@60Count,@80Count,@90Count;')
print(t1)
data=cur.fetchall()
print(data)
if data :
for rec in data:
for i in range(len(rec)):
print(rec[i])
cur.close()
db.close() if __name__=='__main__': # callProcedure1('哪吒')
callProcedure12('哪吒')
遇到的问题:

有上可知,程序执行成功了,但是有一个Warning。
Warning: (3719, "'utf8' is currently an alias for the character set UTF8MB3, but will be an alias for UTF8MB4 in a future release. Please consider using UTF8MB4 in order to be unambiguous.")
result = self._query(query)
# 3719,“3719:'utf8'目前是该别名的别名 字符集UTF8MB3,将来会被UTF8MB4取代 发布。请考虑使用UTF8MB4以明确无误。
所以新建了一个数据库 test1,字符集为:utf8mb4,如下。

再次创建存储过程 CheckOrderStatus1,执行程序即可,不在产生警告。
MySQL 存储过程返回多个值的更多相关文章
- spring mybatis 3.2调用mysql存储过程返回多结果集(完整、亲测、可用)
最近,有个开发提了个需求,希望中间件支持调用mysql存储过程时支持多结果集返回,因为某些原因我们使用了不少的存储过程,很多复杂的逻辑目前来看交互非常的多,所以从当前的现状来说,这个需求还是蛮合理的. ...
- .net下mysql存储过程返回自定义值(原创)
ado.net方法 public static string ExecuteQueryProc(string sConnStr, string sSql, Hashtable args) { MySq ...
- python 调用mysql存储过程返回结果集
存储过程: delimiter | ),)) begin select * from tb_test where mid = imid and user = iuser; end; | delimit ...
- 关于mysql存储过程中传decimal值会自动四舍五入的这个坑
容我说几句题外话:我的工作日常是用微软系的,SQL SERVICE 存储过程很强大,我也很习惯很喜欢用存储过程.和MySQL结缘,是在五年前,因为一些原因,公司要求用开源免费的数据库.很多时候,用my ...
- 解决Java连接MySQL存储过程返回参数值为乱码问题
先说MySQL的字符集问题.Windows下可通过修改my.ini内的 [mysql] default-character-set=utf8 //客户端的默认字符集 在MySQL客户端工具中输入 ...
- mysql存储过程中传decimal值会自动四舍五入,没有小数
通过 call proc(0.2,0.5); 查看结果数据库竟然是0 和 1 原因:proc的参数没有设置好 参数:原本是 in a decimal,in b decimal 应该改为:in ...
- sql 存储过程返回多个值
ALTER PROCEDURE your_sp_name ASBEGIN DECLARE @a INT, @b INT, @c INT SELECT @a= COUNT(1) FRO ...
- MySQL存储过程(转)
一.MySQL 创建存储过程 "pr_add" 是个简单的 MySQL 存储过程,这个存储过程有两个 int 类型的输入参数 "a"."b" ...
- Mysql存储过程调用
mysql存储过程实例教程 发布时间:2014-04-09编辑:JB01 这篇文章主要介绍了mysql存储过程的使用方法,mysql存储过程实例教程,有需要的朋友参考下. 1.1create p ...
随机推荐
- JVM TI
JVM TI JVM TI全名Java Virtual Machine Tool Interface,是开发虚拟机监控工具使用的编程接口,它可以监控JVM内部时间的执行,也可以控制JVM的某些行为,可 ...
- js常用的400个特效
JavaScript实现可以完全自由拖拽的效果,带三个范例 http://www.sharejs.com/showdetails-501.aspx javascript实现可以自由拖动的树形列 ...
- 一个spinner控件使用的实例
布局文件 <?xml version="1.0" encoding="utf-8"?><android.support.constraint. ...
- C#-----线程安全的ConcurrentQueue<T>队列
ConcurrentQueue<T>队列是一个高效的线程安全的队列,是.Net Framework 4.0,System.Collections.Concurrent命名空间下的一个数据 ...
- 【JavaScript】数组
[声明一个数组]var a=[1,1,1]; [定义数组的长度]var a=new Array(2); [特殊数组]arguments[0][可以不用声明,当数组内没有东西时可以直接通过方法的参数自动 ...
- laravel5.7 前后端分离开发 实现基于API请求的token认证
最近在学习前后端分离开发,发现 在laravel中实现前后台分离是无法无法使用 CSRF Token 认证的.因为 web 请求的用户认证是通过Session和客户端Cookie的实现的,而前后端分离 ...
- laravel-admin 上传图片过程中遇到的问题
1. 报错 Disk [admin] not configured, please add a disk config in `config/filesystems.php`. 在config/fil ...
- linux下的CPU、内存、IO、网络的压力测试
linux下的CPU.内存.IO.网络的压力测试 要远程测试其实很简单了,把结果放到一个微服务里直接在web里查看就可以了,或者同步到其他服务器上 一.对CPU进行简单测试: 1.通过bc命令计算特 ...
- java面试经常问到的计算机网络问题
GET 和 POST 的区别 GET请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的:/test/demo_form.asp?name1=value1&name2=val ...
- centos6.9 PHP的编译安装并连接nginx
1.安装yum -y install libxml2-devel openssl-devel bzip2-devel libmcrypt-devel 解决php包的依赖关系,可能libmcrypt会报 ...