MySQL 存储过程和标识符

标签 mysql sql stored-procedures prepared-statement

我正在学习编写MySQL存储过程,遇到了一些困难。这里我有两个存储过程:

第一个存储过程:

CREATE PROCEDURE sp1 (IN `username` TEXT, OUT `user_id` INT)
BEGIN
    DECLARE rowcount INT;

    SELECT count(`User ID`) INTO rowcount FROM user WHERE `Username`=username;

    SET user_id = rowcount;
END|

第二个存储过程:

CREATE PROCEDURE sp2 (IN `doc_id` INT, IN `content` LONGTEXT)
BEGIN
    UPDATE doc SET `Content`=content WHERE `Doc ID`=doc_id;
END|

(分隔符为|。)

问题:

我观察到第一个存储过程的结果与调用 SELECT count(`User ID`) FROM user; 相同。但是,第二个存储过程完成其工作并使用新内容更新内容。

那么为什么第一个存储过程将 `Username`username 视为相同的标识符,而第二个存储过程将 `Content`content 作为不同的标识符?两种情况下的两个标识符除了第一个字母的大写之外都是相同的。

最佳答案

我在阅读关于the scope of local variables的MySQL官方文档后明白了这一点.

它指出:

A local variable should not have the same name as a table column. If an SQL statement, such as a SELECT ... INTO statement, contains a reference to a column and a declared local variable with the same name, MySQL currently interprets the reference as the name of a variable.

关于MySQL 存储过程和标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34868294/

相关文章:

PHP fork 处理MySQL数据库无冲突

sql - 使用 SQL IN 和 SQL OR 运算符的 Rails 3 ActiveRecord 查询

MySQL - 获取字段值小于 5 个字符的行

javascript - Nodejs bcrypt库

mysql - 改进查询

java存储过程与sql存储过程

python - 如何像使用 Python 一样使用 SQL,通过复制行同时更改该行中的一个值(其中该值源自不同的列)?

mysql 不想要变量分配后的结果

mysql - 考虑到 NodeJS,MySQL 和 MySQL2 有什么区别

mysql - 如何在mysql中获取自月份开始以来的累计计数