【问题标题】:OUT or INOUT parameter not workingOUT 或 INOUT 参数不起作用
【发布时间】:2012-06-29 19:31:08
【问题描述】:

如果我在 MySQL 中使用 OUT 或 INOUT 参数创建存储过程,它就不起作用。即使我将存储过程留空。 DDL 如下:

CREATE DEFINER=`root`@`localhost` PROCEDURE `testing_inout`(`a` int,INOUT `b` int)
BEGIN

END

第一个参数是一个常规的 IN 参数。第二个是 INOUT 参数(即使设置为 OUT,同样的问题仍然存在)

当我调用此存储过程时,我收到一条错误消息:

例程 db_name.testing_inout 的 OUT 或 INOUT 参数 2 不是 BEFORE 触发器中的变量或 NEW 伪变量。

即使代码写入存储过程中,此错误仍然存​​在。我正在运行 mysql 版本 5.1.41。

这对我来说是个大问题,因为这个错误我无法输出递归存储过程的结果。

【问题讨论】:

  • 您可能应该显示调用该过程的语句。
  • 我认为问题不在于 SP,而是来自调用 SP 的 BEFORE 触发器。
  • 我同意问题一定出在调用 SP 的 BEFORE 触发器上。当我通过 Navicat 运行 SP 时发生此错误。但是当我从另一个 SP 调用 SP 时,我没有收到错误消息。结论:Navicat 的运行按钮调用 SP 的方式不适用于 OUT 和 INOUT 参数。

标签: mysql stored-procedures arguments out


【解决方案1】:

对我有用

mysql> CREATE DEFINER=`root`@`localhost` PROCEDURE `testing_inout`(`a` int,INOUT `b` int)
    -> BEGIN
    -> 
    -> END
    -> ;
Query OK, 0 rows affected (0.00 sec)

第二个参数因为是inout所以需要是变量:

mysql> set @c:=1;
Query OK, 0 rows affected (0.00 sec)

mysql> call testing_inout(1,@c);
Query OK, 0 rows affected (0.00 sec)

如果您尝试这样做,它将返回 1:

delimiter |
CREATE DEFINER=`root`@`localhost` PROCEDURE `testing_inout`(`a` int,INOUT `b` int)
BEGIN
select b;
END
|
delimiter ;

mysql> call testing_inout(1,@c);
+------+
| b    |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

【讨论】:

  • OP 说:'当我调用这个存储过程时,我得到一个错误'。问题可能根本不在于定义。
  • @prince:是的,这适用于 jcho360,jcho360 已经证明 what 对他们有效。但是你没有展示在你的情况下什么对你不起作用。我的意思是,您还没有向我们展示调用您的存储过程的语句。
猜你喜欢
  • 2012-11-17
  • 1970-01-01
  • 2011-07-29
  • 2013-01-08
  • 2014-07-27
  • 1970-01-01
  • 2013-01-25
  • 2023-03-31
  • 1970-01-01
相关资源
最近更新 更多