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 ...
随机推荐
- jmeter压测mysql报can not be represented as java.sql.Timestame错误解决方法
JDBC Request 测试mysql时报以下问题? jmeter报错信息: 解决方法: 在数据库url后拼接上字符串?characterEncoding=utf8&zeroDateTim ...
- 关于最小生成树(并查集)prime和kruskal
适合对并查集有一定理解的人. 新手可能看不懂吧.... 并查集简单点说就是将相关的2个数字联系起来 比如 房子 1 2 3 4 5 6 ...
- /etc/resolv.conf
/etc/resolv.conf它是DNS客户机配置文件,用于设置DNS服务器的IP地址及DNS域名,还包含了主机的域名搜索顺序.该文件是由域名解析 器(resolver,一个根据主机名解析IP地址的 ...
- git宝典—应付日常工作使用足够的指北手册
最近公司gitlab又迁移,一堆git的命令骚操作,然鹅git命令,感觉还是得复习下——其实,git现在界面操作工具蛮多,比如intellij 自带的git操作插件就不错,gitlab github ...
- CentOS 7 安装Redis4.0
redis是一种内存型的NoSQL数据库,优点是快,常用来做缓存用 redis存储数据的方法是以key-value的形式 value类型支持字符串,列表,哈希等多种类型 环境 : CnetOS7 ...
- eclipse导出可供项目引用的jar
有两种,一种是导出直接可以运行的jar,一种是导出来供其他项目引用的.在这里,说的是第二种,第一种在我博客上面也有一篇转载的.1选中项目,选择Export 2选择JAR file 然后Next 3 s ...
- Excel VBA附合导线平差自动计算表
这是6,7年前做的一个excel vba自动计算附合导线平差的表格. 对于做测绘的朋友来说,附合导线平差是最基础的技能,目前来说,能平差的软件和工具也很多,像南方的平差易,科傻平差.清华三维平差等,但 ...
- uva 10123 - No Tipping dp 记忆化搜索
这题的题意是 在双脚天平上有N块东西,依次从上面取走一些,最后使得这个天平保持平衡! 解题: 逆着来依次放入,如果可行那就可以,记得得有木板自身的重量. /********************** ...
- Hibernate的工作原理及使用的原因
一.工作原理: 1.读取并解析配置 2.读取并解析映射信息,创建Session Factory 3.打开Session 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Sess ...
- ubuntu上传到百度网盘
1 2 亲测可以上传