【问题标题】:MySQL Stored procedure with input and output parameters not working with string input具有输入和输出参数的 MySQL 存储过程不适用于字符串输入
【发布时间】:2017-10-01 22:32:20
【问题描述】:

我有一个带有两个 varchar 输入参数和一个 int 输出参数的存储过程。这个想法是我传入表名和一个唯一的字符串,检查表以查看表中是否已经存在该字符串,如果存在则返回该记录的 id。目前的存储过程看起来像:

BEGIN 
SET @getID = CONCAT('SELECT `id` as id_Out FROM ',tablename_In,' WHERE `formSecret`=',formSecret_In);
PREPARE stmt FROM @getID; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
END

如果我传入一个数字,一切正常,我会得到一个记录 ID。如果我传入一个完整的字母数字字符串(这是唯一 ID),它会失败,告诉我该列不存在。

例如:call sp_GetRecordID(123456,'tbl_justsaythanks',@id_Out); 将返回一个我想要的记录 ID。

但是如果我从表中尝试一个真正的 id,那就是一个字符串......

`call sp_GetRecordID('fc66d9a82ba717e0931462370e64baff','tbl_justsaythanks',@id_Out);`

我得到“错误代码:1054。'where 子句'中的未知列'fc66d9a82ba717e0931462370e64baff'”

由于我是 MySQL 新手,所以我不确定我在这方面的立场 - 我怀疑这与在查询中应用刻度线来指定列有关,但我看不到就在此刻。

所以,如果能帮助我指出正确的方法,我们将不胜感激。

【问题讨论】:

  • 我认为你需要交换你的两个输入参数:调用 sp_GetRecordID('tbl_justsaythanks','fc66d9a82ba717e0931462370e64baff',@id_Out);

标签: mysql stored-procedures


【解决方案1】:

尝试如下存储过程:

DROP PROCEDURE IF EXISTS `sp_GetRecordID`;

DELIMITER //

CREATE PROCEDURE `sp_GetRecordID`(
  `tablename_In` VARCHAR(64),
  `formSecret_In` VARCHAR(32),
  OUT `id_Out` BIGINT UNSIGNED
)
BEGIN
  SET @`query` := CONCAT('SELECT `id` INTO @`id_Out`
                          FROM ', `tablename_In` ,' 
                          WHERE `formSecret` = \'', `formSecret_In`, '\'');
  PREPARE `stmt` FROM @`query`;
  EXECUTE `stmt`;
  SET `id_Out` := @`id_Out`,
       @`query` := NULL;
  DEALLOCATE PREPARE `stmt`;
END//

DELIMITER ;

参见db-fiddle 示例。

【讨论】:

  • 先生 - 这绝对是我所需要的。那里有很多垃圾,所以以正确的方式完成工作真是太棒了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多