MySQL  存储过程返回多个值

 

在本教程中,您将学习如何编写/开发返回多个值的存储过程。

MySQL存储函数只返回一个值。要开发返回多个值的存储过程,需要使用带有INOUTOUT参数的存储过程。

返回多个值的存储过程示例

我们看看 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 存储过程返回多个值的更多相关文章

  1. spring mybatis 3.2调用mysql存储过程返回多结果集(完整、亲测、可用)

    最近,有个开发提了个需求,希望中间件支持调用mysql存储过程时支持多结果集返回,因为某些原因我们使用了不少的存储过程,很多复杂的逻辑目前来看交互非常的多,所以从当前的现状来说,这个需求还是蛮合理的. ...

  2. .net下mysql存储过程返回自定义值(原创)

    ado.net方法 public static string ExecuteQueryProc(string sConnStr, string sSql, Hashtable args) { MySq ...

  3. python 调用mysql存储过程返回结果集

    存储过程: delimiter | ),)) begin select * from tb_test where mid = imid and user = iuser; end; | delimit ...

  4. 关于mysql存储过程中传decimal值会自动四舍五入的这个坑

    容我说几句题外话:我的工作日常是用微软系的,SQL SERVICE 存储过程很强大,我也很习惯很喜欢用存储过程.和MySQL结缘,是在五年前,因为一些原因,公司要求用开源免费的数据库.很多时候,用my ...

  5. 解决Java连接MySQL存储过程返回参数值为乱码问题

    先说MySQL的字符集问题.Windows下可通过修改my.ini内的 [mysql] default-character-set=utf8    //客户端的默认字符集 在MySQL客户端工具中输入 ...

  6. mysql存储过程中传decimal值会自动四舍五入,没有小数

    通过 call  proc(0.2,0.5);  查看结果数据库竟然是0  和 1 原因:proc的参数没有设置好 参数:原本是  in a decimal,in b decimal 应该改为:in ...

  7. sql 存储过程返回多个值

    ALTER PROCEDURE your_sp_name    ASBEGIN    DECLARE @a INT, @b INT, @c INT    SELECT @a= COUNT(1) FRO ...

  8. MySQL存储过程(转)

    一.MySQL 创建存储过程 "pr_add" 是个简单的 MySQL 存储过程,这个存储过程有两个 int 类型的输入参数 "a"."b" ...

  9. Mysql存储过程调用

    mysql存储过程实例教程 发布时间:2014-04-09编辑:JB01 这篇文章主要介绍了mysql存储过程的使用方法,mysql存储过程实例教程,有需要的朋友参考下.   1.1create  p ...

随机推荐

  1. 接口自动化框架(java)--3.get,delete请求,Excel管理多种请求类型

    这套框架的报告是自己封装的 每种请求类型放入不同的sheet中,就可以避免新建太多的excel去做数据驱动. XSSFSheet类提供了一个读取sheet的方法,getSheetAt(int),通过下 ...

  2. Cocos Creator 动态设置Canvas的宽度与高度,更改适配

    let c = this.node.getComponent(cc.Canvas);c.fitHeight = true;c.fitWidth = false; let h = 960 * cc.wi ...

  3. Sqlite3入门简记

    一,安装Sqlite3 1.入门时看http://www.runoob.com/sqlite/sqlite-intro.html,说的简单,但是适合入门 2.在终端输入sqlite3,没有返回信息,表 ...

  4. openssl源代码结构

    Openssl整个软件包主要包括三个主要的功能模块:密码算法库,SSL协议库,应用程序: 应用程序:主要包括密钥生成,证书管理,格式转换,数据加密,签名,SSL测试等. evp,对称算法,非对称算法, ...

  5. (转)批量插入sql语句

    为了减少数据库连接的I/O开销,一般会把多条数据插入放在一条SQL语句中一次执行.1.INSERT INTO TABLE(col1, col2) VALUES(val11, val12), (val2 ...

  6. 使用Configuration Extensions读取配置

    使用Configuration Extensions读取配置 Configuration Extensions 是微软基于Configuration的扩展,能够很好的解析系统遇到各种配置文件,包括js ...

  7. 【CSS】css动画及过渡和变换属性

    1.css动画 创建一个动画: @keyframes name{ //动画名字 0% { //动画开始 transform: translateY(0); } 100% { //动画结束 transf ...

  8. 2018-2019-2 网络对抗技术 20165335 Exp3 免杀原理与实践

    一.免杀原理与基础知识: (1)杀软是如何检测出恶意代码的? 检测特征码:特征码就是一般程序都不会有的代码,而后门有的那种特别的数据,而一个程序,应用有这种代码,数据的话,就直接判定为恶意代码. 主流 ...

  9. tinkpad e450c 进入 BIOS

    电脑开机状态下重启电脑,同时连续单击F1 听到"嘟"的一声继续按F1键即可进入BIOS管理界面. 注意:此时Fn要在锁定状态,即Fn键盘灯亮.[可用Fn+Esc切换Fn锁定和未锁定 ...

  10. Java处理对象

    1.打印对象和toString 方法     toString() 方法是Object 类的一个实例方法,所有的Java类都是Object类的子类,因此所有的Java对象都是具有toString()方 ...