You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 17:48:18