首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法识别的语句接近IF - usage IF with Exists

问无法识别的语句接近IF - usage IF with Exists
EN

Stack Overflow用户
提问于 2019-07-26 15:27:36
回答 1查看 86关注 0票数 0

如果date_in和date_out都为空,我想更新roomstatus表中的行,其中room_id = @id。否则,我需要插入新行,比如where room_id = @id,date_in = @dateIn,date_out = @dateIN

代码语言:javascript
复制
IF ((SELECT date_in FROM roomstatus WHERE room_id = @id)= NULL AND (SELECT date_out FROM roomstatus WHERE room_id = @id)= NULL ) THEN 
    UPDATE roomstatus SET date_in = @dateIN, date_out = @dateOut WHERE roomid = @id
ELSE
    INSERT INTO roomstatus (room_id,date_in,date_out) VALUES (@id,@dateIn,@dateOut)
END IF;

MySQL说:

代码语言:javascript
复制
> #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use
> near 'IF ((SELECT date_in FROM roomstatus WHERE room_id = @id)= NULL
> AND (SELECT date_' at line 1
EN

回答 1

Stack Overflow用户

发布于 2019-07-26 19:38:17

你的过程有一些错误1)每条语句都需要一个结束符2) MYSQL不能区分列名和参数名,例如room_id = roomID - (mysql会将列与自身进行比较)你必须提供该信息3)结束begin的结尾需要有结束分隔符。下面的语法是正确的

代码语言:javascript
复制
DROP PROCEDURE IF EXISTS P;

DELIMITER // 
CREATE PROCEDURE P(IN INdateIn DATETIME(6) , IN INdateOut DATETIME(6), IN INroomID INT(11)) 
BEGIN 
    IF EXISTS (SELECT room_id FROM roomstatus WHERE room_id = INroomID AND date_in = NULL AND date_out = NULL ) THEN
     UPDATE roomstatus 
        SET date_in = INdateIn , date_out = INdateOut 
         WHERE room_id = INroomID ;
    ELSE 
        INSERT INTO roomstatus (room_id,date_in,date_out) VALUES (INroomID,INdateIn,INdateOut); 
    END IF;
END //
DELIMITER ; 

在功能上我不是很确定,没有错误检查来确保你已经设置了参数来实现你想要做的事情。例如,您没有测试indateout,因此代码可能会进入更新逻辑,将indateout设置为null,将indatein设置为有效值-下次调用过程时,您可能会进入插入逻辑,并可能以重复结束。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57215108

复制
相关文章

相似问题

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