老实说,我现在觉得自己很傻。但这根本行不通。
场景
我有一个包含输出参数的存储过程。我正在尝试在该参数中选择一个值。这看起来很简单,但它继续给我错误的结果。我检查了许多在线资源,我确信我正在尝试正确地做到这一点。
代码
DELIMITER //
CREATE PROCEDURE `spGetId`(
IN ParamA VARCHAR(32),
OUT OutputId INT
)
BEGIN
SELECT `id` INTO OutputId
FROM `Table`
WHERE `column_a` = ParamA;
END//
CALL spGetId('foobar', @Bloop)//
SELECT @Bloop//
结果
我在这个表中有两行,它们的 ID 是“1”和“2”。我得到的结果是 '31',无论 SELECT 语句是否匹配。我尝试了很多变体,包括完全删除 WHERE 子句并让 SELECT 将 COUNT(1) 返回到参数中(尽管只有 2 行,但结果为 '32'),并且我尝试过“声明" 在 sproc 调用中使用 @Bloop 变量之前使用SET @Bloop = 0
.
如果您对为什么会发生这种情况有任何见解,以及我能做些什么来使它返回正确的值,我将非常感激。此外,如果您可以向我展示如何使用存储函数来实现相同的预期结果,并带有返回值,我会更加感激!我想要的方法是使用存储函数,但我遇到了类似的问题,然后放弃并尝试使用存储过程,却发现我得到了类似的结果。
你能提供的任何东西都会有帮助!
编辑:
CREATE TABLE `Table` (
`id` int(11) NOT NULL auto_increment,
`column_a` varchar(32) character set utf8 NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
mysql> SELECT * FROM Table;
+------+----------+
| id | column_a |
+------+----------+
| 1 | asdf |
| 2 | foobar |
+------+----------+
当我用任何参数调用 spGetId() 时,它返回值“31”(即使参数是“foobar”,它应该返回一个整数值“2”(或 ascii 0x32))。如果我修改 spGetId() 以返回 Table 的总行数,而不是返回“2”,它返回“32”。