我正在编写一个执行以下操作的存储过程:
在给定表
v_Tablename
中,如果v_ColumnName
中等于v_Value
的行数大于0,则返回true。否则,返回 false。可以使用此存储过程的一些示例:
Person
表 (v_Tablename
) 中存在年龄 (v_ColumnName
) 为 23 (v_Value
) 的人,则返回Employee
表 (v_Tablename
) 中存在电子邮件,则返回,其中 Email
(v_ColumnName
) 是 [email protected]
(v_Value
)。这是我的代码:
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 的方式,它告诉我是否存在值。
有谁知道如何更正我的存储过程?
这就是问题所在:
EXECUTE stat USING v_Value;
https://dev.mysql.com/doc/refman/8.0/en/execute.html 说:
参数值只能由用户变量提供...
这是指MySQL 用户定义变量,带有
@
标志的类型。
不支持将
IN
参数等局部变量以及在存储例程中使用 DECLARE
声明的局部变量作为 EXECUTE
的参数。
这似乎没有必要,但让它发挥作用的一种方法是:
SET @v_Value = v_Value;
EXECUTE stat USING @v_Value;
SET
语句创建一个用户定义的变量,其名称与您的输入参数相似(变量的名称并不重要,我只是在本示例中选择了相似的名称)。