【问题标题】:MySQL Stored Procedure and IdentifiersMySQL 存储过程和标识符
【发布时间】:2016-01-19 04:01:08
【问题描述】:

我正在学习编写 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 视为不同的标识符?除了首字母大写外,这两种情况下的两个标识符都是相同的。

【问题讨论】:

  • @RyanVincent 如果我将 IN 参数更改为 doc id,然后将 WHERE 子句更改为 Doc ID=doc id,则每条记录都会更新,就像 WHERE 子句一样在第一个 SP。我刚刚阅读了有关局部变量范围的官方 MySQL 文档,它只是回答了我的问题。

标签: mysql sql stored-procedures prepared-statement


【解决方案1】:

我是在阅读了有关the scope of local variables 的官方 MySQL 文档后才知道的。

它指出:

局部变量不应与表列同名。如果 SQL 语句,例如 SELECT ... INTO 语句,包含对列的引用和同名的已声明局部变量,则 MySQL 当前将引用解释为变量的名称

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    相关资源
    最近更新 更多