0

老实说,我现在觉得自己很傻。但这根本行不通

场景
我有一个包含输出参数的存储过程。我正在尝试在该参数中选择一个值。这看起来很简单,但它继续给我错误的结果。我检查了许多在线资源,我确信我正在尝试正确地做到这一点。


代码

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”。

4

2 回答 2

1

您的存储过程正在运行。我认为它返回字符'1'的ascii值而不是整数值1。

于 2010-11-27T13:06:01.793 回答
0

我需要学会改变我的测试环境。

我仍然不确定到底是什么问题,但看起来 phpMyAdmin 正在执行它自己的某种类型转换,并且我一直在通过该特定客户端运行我的所有测试。

将我自己的快速 PHP 脚本放在一起并手动调用存储过程(在进一步的测试中,还调用存储的函数)提供了所需的结果。

所以,吸取的教训:永远不要相信客户。一定要记得把它调高一点。

于 2010-11-28T02:27:27.577 回答