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 ...
随机推荐
- python之进程,线程,协程简单理解
进程:资源单位,由操作系统控制调度.正在执行的一个程序或者过程,进程之间不共享资源,进程间通讯手段:管道,队列,信号量等.多用于计算密集型场景,如金融计算 线程:是cpu的最小执行单位,由操作系统控制 ...
- Mac截图操作,自定义快捷键
选择system preferences 下面能看到系统定义的快捷键,可以自己修改
- PHP----------php封装的一些简单实用的方法汇总
1.xml转换成array,格式不对的xml则返回false function xml_parser($str){ $xml_parser = xml_parser_create(); i ...
- Linux 常用命令,处理端口和Tomcat,mysql
查看端口占用 1.lsof -i:端口号 2.netstat -tunlp|grep 端口号 都可以查看指定端口被哪个进程占用的情况 kill -9 进程号 强制结束进程 启动 1.使用 ser ...
- sklearn中报错ValueError: Expected 2D array, got 1D array instead:
from sklearn.linear_model import LinearRegression lr = LinearRegression() print(tr_x.shape,tr_y.shap ...
- IDEA 201809 Jrebel安装破解
jrebel介绍: JRebel是一款JAVA虚拟机插件,它使得JAVA程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响.JRebel使你能即时分别看到代码.类和资源的变化, ...
- PAT (Basic Level) Practice (中文)1022 D进制的A+B
1022 D进制的A+B 输入两个非负 10 进制整数 A 和 B (≤2^30^−1),输出 A+B 的 D (1<D≤10)进制数. 输入格式: 输入在一行中依次给出 3 个整数 A.B 和 ...
- day12 python作业:员工信息表
作业要求: 周末大作业:实现员工信息表文件存储格式如下:id,name,age,phone,job1,Alex,22,13651054608,IT2,Egon,23,13304320533,Tearc ...
- RTSP-RTMP-HLS媒体播放管理
近在跟一些做安防行业同学交流中发现,他们对于外网中播放各类视频流觉得各种设置麻烦的很, 好吧,小小的做了一个解决方案. 这个工具从视频监控管理平台剥离出来, 支持对rtsp, rtmp, hls流的管 ...
- uva 10123 - No Tipping dp 记忆化搜索
这题的题意是 在双脚天平上有N块东西,依次从上面取走一些,最后使得这个天平保持平衡! 解题: 逆着来依次放入,如果可行那就可以,记得得有木板自身的重量. /********************** ...