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
    ) 中存在电子邮件,则返回,其中
    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 的方式,它告诉我是否存在值。

有谁知道如何更正我的存储过程?

sql mysql stored-procedures
1个回答
2
投票

这就是问题所在:

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
语句创建一个用户定义的变量,其名称与您的输入参数相似(变量的名称并不重要,我只是在本示例中选择了相似的名称)。

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