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

  • 如果Person表(v_Tablename)中存在人员,其中Age(v_ColumnName)为23(v_Value),则返回
  • 如果员工表(v_Tablename)中存在邮箱,则返回testing123@gmail.com

这是我的代码:

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语法有错误;请判断与您的SQL服务器版本对应的手册,了解使用"v_Value附近的正确语法; 取消收件箱统计; 得到诊断v_SEARCH s = ROW_SEARCH 0;'第13行

我认为它不喜欢EXECUTE stat USING v_Value,但我需要这一行,因为它分配了?到v_Value进行判断. ROW_RST 0也不喜欢,但这就是我判断结果是否为0的方式,这告诉我是否存在值.有人知道如何纠正我的store 程序吗?

推荐答案

这就是问题:

EXECUTE stat USING v_Value;

https://dev.mysql.com/doc/refman/8.0/en/execute.html says:

参数值只能由用户变量提供.

这指的是MySQL user-defined variables,带有@印记的那种.

不支持IN参数等局部变量以及在存储的 routine 中声明的带有DECLARE的局部变量作为EXECUTE的参数.

这似乎是不必要的,但让它发挥作用的一种方法是:

SET @v_Value = v_Value;
EXECUTE stat USING @v_Value;

SET声明创建一个用户定义的变量,其名称与输入参数相似(变量的名称并不重要,我只是在这个例子中 Select 了一个类似的名称).

Mysql相关问答推荐

拒绝非超级用户访问停靠的MariaDB(超级用户工作)

在MySQL CLI中,是否有自动完成过程的方法?

查询具有JSON对象数组的列时,JSON_CONTAINS的MySQL语法错误

在两个日期之间生成每个月的1行数据.

如何在 SQL 中迭代所有名称和排名排列

Mysql时间序列数据的最小值和最大值

Select 最高等级最多的部门名称

谁能帮我优化where子句

MySQL 每组最大 n 只适用于多行

非常规字符的不正确字符串值错误

MySQLi count(*) 总是返回 1

加快 MySQL 中的行计数

终止空闲的mysql连接

PDO:MySQL 服务器已消失

MySQL 整数与日期时间索引

使用 PHP 和 MySQL 存储和显示 unicode 字符串 (हिन्दी)

在 MySQL 中找不到 outfile 创建的文件

将mysql查询输出存储到shell变量中

MySQL:唯一字段需要是索引吗?

在 PHP 中运行 MySQL *.sql 文件