我正在编写一个执行以下操作的存储过程: 在给定表 v_Tablename 中,如果 v_ColumnName 中等于 v_Value 的行数大于 0,则返回 true。否则,返回 false。可以使用此存储过程的一些示例:
这是我的代码:
create
definer = root@localhost procedure CheckValueExists(
IN v_Tablename VARCHAR(100),
IN v_ColumnName VARCHAR(100),
IN v_Value VARCHAR(100),
OUT v_Exists BOOLEAN
)
BEGIN
SET @query = CONCAT('SELECT COUNT(*) FROM ', v_Tablename,
' WHERE ', v_ColumnName, ' = ?');
PREPARE stat FROM @query;
EXECUTE stat USING v_Value;
DEALLOCATE PREPARE stat;
GET DIAGNOSTICS v_Exists = ROW_COUNT > 0;
END;
无论我用多少种方式格式化它,我都会不断收到这些错误:
[42000][1064] 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在 'v_Value; 附近使用的正确语法。 解除分配准备状态; 获取诊断 v_Exists = ROW_COUNT > 0;'在第 13 行
我认为它不喜欢 EXECUTE stat USING v_Value,但我需要这一行,因为它分配 ?到 v_Value 进行检查。 ROW_COUNT > 0 也不喜欢 > 但这就是我检查结果是否 > 0 的方式,它告诉我是否存在值。有谁知道我如何纠正我的商店程序?
这就是问题所在:
使用 v_Value 执行统计;
https://dev.mysql.com/doc/refman/8.0/en/execute.html 说:
参数值只能由用户变量提供...
这是指[MySQL用户定义变量][1],带有
@
标志的那种。
不支持将
IN
参数等局部变量以及在存储例程中使用 DECLARE
声明的局部变量作为 EXECUTE
的参数。
这似乎没有必要,但让它发挥作用的一种方法是:
SET @v_Value = v_Value;
EXECUTE stat USING @v_Value;
SET
语句创建一个与输入参数名称相似的用户定义变量。
[1]:https://dev.mysql.com/doc/refman/8.0/en/user-variables.html