MariaDB如何在一个存储过程中调用另一存储过程的返回结果
错误原因
你当前的写法存在三个问题,直接导致报错和逻辑不生效:
- 修改后的
MonthlyTransfer定义了2个参数(1个IN入参、1个OUT出参),调用时未传入对应数量的参数,直接触发#1318 参数数量不匹配错误。 - 存储过程参数名不能使用
@前缀,@开头的是用户会话变量,和存储过程内的局部参数是完全独立的对象,就算调用AbonamentStart也不会给这个入参赋值。 - 原
AbonamentStart是通过结果集返回计算出的日期,没有通过输出参数传值,其他存储过程内部调用时无法直接获取返回的日期值;且原存储过程全用@开头的会话变量,并发调用时容易出现值互相覆盖的问题。
修复方案
前置操作
执行新的存储过程创建语句前,先执行以下两条语句删除旧版本,避免定义冲突:
DROP PROCEDURE IF EXISTS AbonamentStart; DROP PROCEDURE IF EXISTS MonthlyTransfer;
第一步:修改AbonamentStart存储过程
将返回值改为OUT参数输出,把内部变量改为局部变量避免会话变量污染:
DELIMITER $$ CREATE DEFINER=`admin2`@`localhost` PROCEDURE `AbonamentStart`(OUT `abonamentstart` DATE) BEGIN DECLARE currentday INT; DECLARE plusminus INT; DECLARE plusminustemp DATE; DECLARE plusminusday INT; SET currentday = DAYOFMONTH(CURRENT_DATE); SET plusminus = IF(currentday < 22, 1, 0); SET plusminustemp = ADDDATE(CURRENT_DATE, INTERVAL -plusminus MONTH); SET plusminusday = DAYOFMONTH(plusminustemp); SET abonamentstart = ADDDATE(plusminustemp, INTERVAL (22 - plusminusday) DAY); END$$ DELIMITER ;
第二步:重写MonthlyTransfer存储过程
移除多余的入参,内部直接调用AbonamentStart获取计费起始日期,完成统计:
DELIMITER $$ CREATE DEFINER=`admin2`@`localhost` PROCEDURE `MonthlyTransfer`() BEGIN DECLARE start_date DATE; -- 调用AbonamentStart获取计费起始日期,存入局部变量 CALL AbonamentStart(start_date); SELECT SUM(TotalDay) AS total_transfer FROM TRANSFER WHERE DayDate > start_date; END$$ DELIMITER ;
Python调用示例
直接调用无参的存储过程即可拿到统计结果,不需要额外传入日期参数:
import pymysql # 替换为实际的数据库连接信息 conn = pymysql.connect( host='localhost', user='admin2', password='你的数据库密码', database='RUTER', cursorclass=pymysql.cursors.DictCursor ) try: with conn.cursor() as cursor: cursor.callproc('MonthlyTransfer') result = cursor.fetchone() print(f"符合条件的TotalDay总和为: {result['total_transfer']}") finally: conn.close()
内容的提问来源于stack exchange,提问作者Edyward
相关产品推荐
相关产品推荐

