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. JVM TI

    JVM TI JVM TI全名Java Virtual Machine Tool Interface,是开发虚拟机监控工具使用的编程接口,它可以监控JVM内部时间的执行,也可以控制JVM的某些行为,可 ...

  2. js常用的400个特效

    JavaScript实现可以完全自由拖拽的效果,带三个范例     http://www.sharejs.com/showdetails-501.aspx javascript实现可以自由拖动的树形列 ...

  3. 一个spinner控件使用的实例

    布局文件 <?xml version="1.0" encoding="utf-8"?><android.support.constraint. ...

  4. C#-----线程安全的ConcurrentQueue<T>队列

     ConcurrentQueue<T>队列是一个高效的线程安全的队列,是.Net Framework 4.0,System.Collections.Concurrent命名空间下的一个数据 ...

  5. 【JavaScript】数组

    [声明一个数组]var a=[1,1,1]; [定义数组的长度]var a=new Array(2); [特殊数组]arguments[0][可以不用声明,当数组内没有东西时可以直接通过方法的参数自动 ...

  6. laravel5.7 前后端分离开发 实现基于API请求的token认证

    最近在学习前后端分离开发,发现 在laravel中实现前后台分离是无法无法使用 CSRF Token 认证的.因为 web 请求的用户认证是通过Session和客户端Cookie的实现的,而前后端分离 ...

  7. laravel-admin 上传图片过程中遇到的问题

    1. 报错 Disk [admin] not configured, please add a disk config in `config/filesystems.php`. 在config/fil ...

  8. linux下的CPU、内存、IO、网络的压力测试

    linux下的CPU.内存.IO.网络的压力测试  要远程测试其实很简单了,把结果放到一个微服务里直接在web里查看就可以了,或者同步到其他服务器上 一.对CPU进行简单测试: 1.通过bc命令计算特 ...

  9. java面试经常问到的计算机网络问题

    GET 和 POST 的区别 GET请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的:/test/demo_form.asp?name1=value1&name2=val ...

  10. centos6.9 PHP的编译安装并连接nginx

    1.安装yum -y install libxml2-devel openssl-devel bzip2-devel libmcrypt-devel 解决php包的依赖关系,可能libmcrypt会报 ...