首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用更新多列创建存储过程

问使用更新多列创建存储过程
EN

Stack Overflow用户
提问于 2020-12-02 20:51:04
回答 2查看 73关注 0票数 0

我的代码中有以下错误:

MySQL说:文档 1064 -您的SQL语法有错误;请检查与您的MySQL服务器版本对应的手册,以便在第20行使用接近“END”的正确语法。

代码语言:javascript
复制
CREATE PROCEDURE updateUser(
    IN firstname VARCHAR(20), 
    IN Vlastname VARCHAR(20), 
    IN Vemail VARCHAR(50), 
    IN Vpassword VARCHAR(100), 
    IN Vyear INT(5), 
    IN Vgender VARCHAR(10), 
    IN Vprefer VARCHAR(200), 
    IN Vinterested VARCHAR(200), 
    IN Vabout VARCHAR(200), 
    IN Vid INT(11)
) 
BEGIN
    UPDATE users SET 
        name = (CASE WHEN firstname IS NOT NULL THEN firstname ELSE name
            END),
        lastname = (CASE WHEN vlastname IS NOT NULL THEN vlastname ELSE lastname
            END)
WHERE id = Vid
END;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-02 21:32:12

在MySQL中开发存储过程时,必须设置与;不同的分隔符,以正确结束存储的程序语句。这允许使用;来描述过程中的多个语句。

每个MySQL 25.1定义存储程序文档

如果使用mysql客户端程序定义包含分号字符的存储程序,则会出现问题。默认情况下,mysql本身将分号识别为语句分隔符,因此必须临时重新定义分隔符,以使mysql将整个存储的程序定义传递给服务器。

因此,请考虑以下调整:

代码语言:javascript
复制
DELIMITER //                        -- TEMPORARILY CHANGE DELIMITER FROM ;

CREATE PROCEDURE updateUser (
    IN firstname VARCHAR(20), 
    IN Vlastname VARCHAR(20), 
    IN Vemail VARCHAR(50), 
    IN Vpassword VARCHAR(100), 
    IN Vyear INT(5), 
    IN Vgender VARCHAR(10), 
    IN Vprefer VARCHAR(200), 
    IN Vinterested VARCHAR(200), 
    IN Vabout VARCHAR(200), 
    IN Vid INT(11)
) 
BEGIN
    UPDATE `users` 
    SET 
        `name` = CASE WHEN `firstname` IS NOT NULL THEN `firstname` ELSE `name` END,
        `lastname` = CASE WHEN `vlastname` IS NOT NULL THEN `vlastname` ELSE `lastname` END
     WHERE `id` = Vid;              -- SEMICOLON HERE TO SEPARATE STATEMENTS
END
//                                  -- PROPERLY END PROCEDURE STATEMENT

DELIMITER ;                         -- RESET DELIMITER BACK TO ;
票数 0
EN

Stack Overflow用户

发布于 2020-12-02 21:29:16

在WHERE子句之后缺少分号,可以将其简化。

代码语言:javascript
复制
DELIMITER //
CREATE PROCEDURE updateUser(
    IN firstname VARCHAR(20), 
    IN Vlastname VARCHAR(20), 
    IN Vemail VARCHAR(50), 
    IN Vpassword VARCHAR(100), 
    IN Vyear INT(5), 
    IN Vgender VARCHAR(10), 
    IN Vprefer VARCHAR(200), 
    IN Vinterested VARCHAR(200), 
    IN Vabout VARCHAR(200), 
    IN Vid INT(11)
) 
BEGIN
    UPDATE users SET 
        name = COALESCE (firstname, name),
        lastname = COALESCE (vlastname,lastname)
    WHERE id = Vid;
END//
DELIMITER ;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65115939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档