MySQL 存储过程抛出 [42000][1064] EXECUTE stat USING 语句的 SQL 语法有错误

问题描述 投票:0回答:1

我正在编写一个执行以下操作的存储过程: 在给定表 v_Tablename 中,如果 v_ColumnName 中等于 v_Value 的行数大于 0,则返回 true。否则,返回 false。可以使用此存储过程的一些示例:

  • 如果 Person 表 (v_Tablename) 中存在年龄 (v_ColumnName) 为 23 (v_Value) 的人员,则返回
  • 如果 Employee 表 (v_Tablename) 中存在电子邮件,则返回,其中电子邮件 (v_ColumnName) 为 [电子邮件受保护] (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 的方式,它告诉我是否存在值。有谁知道我如何纠正我的商店程序?

sql mysql stored-procedures
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.