首页 > 解决方案 > OperationalError:(1414,“例程“存储过程名称”的 OUT 或 INOUT 参数 1 不是 BEFORE 触发器中的变量或新伪变量”)

问题描述

我在使用 Airflow mysqlhook 在 python 中调用带有 out 参数的存储过程时遇到问题

存储过程的签名是 CREATE PROCEDURE sp_stage_processdata(out p_status INT)

src_cursor.execute("CALL sp_stage_processdata(%s);", (status,))

我收到错误

OperationalError:(1414,'例程 sp_stage_processdata 的 OUT 或 INOUT 参数 1 不是 BEFORE 触发器中的变量或新伪变量')

在处理上述异常的过程中,又出现了一个异常:

我尝试删除参数,并且程序在 python 中执行得很好,所以没有错。

由于版本问题,我无法使用 cursor.callproc。

标签: stored-proceduresparameter-passingairflowmysql-pythonout

解决方案


使用OUT时需要将 MySQL 变量传递给调用,并且不能直接传递值。

它应该看起来像:

CALL sp_stage_processdata(@p_status)

如果需要处理传递的值,可以有 2 个选项:

  1. 改变OUTtoINOUT和 use SET @p_statusand than 调用你的程序
  2. 拆分您的程序以使用INOUT如下所示:

    sp_stage_processdata(out p_status_out INT, IN p_status)

    所以你可以这样调用你的程序:

    src_cursor.execute("CALL sp_stage_processdata(@p_status_out, %s);", (status,))


推荐阅读