【问题标题】:MySQL Stored procedure SELECT var wrong value after INSERTMySQL存储过程SELECT var INSERT后错误值
【发布时间】:2017-02-24 01:00:12
【问题描述】:

我在 MySQL 存储过程上遇到了问题,已经用 IF THEN ELSE 做了另一个逻辑,但我仍然有一些我无法理解的问题......

该过程包含两个用户输入:user_idmeet_id。该过程定义了一个名为 'ue' 的变量,它存储了一系列验证的结果(如果用户存在,如果事件存在,如果事件日期仍然有效,等等。) .

之后,它会在 IF THEN ELSE 选择器中插入和更新多个表上的一些数据,并根据验证选择 1(或 0)作为结果。

但我的问题是:它总是将 0 作为“结果”返回给我,就好像我执行 INSERT 时我的验证变量为 0...如果我删除 INSERT [...] ;代码行,它会正确返回验证值(1 或 0)。

程序的代码是这样的:

CREATE DEFINER=`nwouserf`@`localhost` 
PROCEDURE `join_event`(IN `user_id` BIGINT(64), IN `event_id` INT) 
NOT DETERMINISTIC MODIFIES SQL DATA SQL SECURITY DEFINER 

begin 
DECLARE ue INT; 
SET ue = EXISTS(SELECT 1 FROM users WHERE fb_uid=user_id) 
         AND EXISTS(SELECT 1 FROM meetup WHERE meet_id=event_id) 
         AND EXISTS(SELECT 1 FROM meetup WHERE date > NOW() AND meet_id = event_id) 
         AND EXISTS(SELECT 1 FROM meetup WHERE meet_id = event_id AND participants <= max_participants) 
         AND NOT EXISTS(SELECT 1 FROM meetup_participation WHERE fb_uid = user_id AND meet_id = event_id); 

IF ue = 1 THEN 

    INSERT INTO meetup_participation (fb_uid, meet_id) VALUES (user_id, event_id); 
    UPDATE users SET events_participated = events_participated + 1 WHERE fb_uid=user_id; 
    UPDATE meetup SET participants = participants + 1 WHERE meet_id=event_id; 
    SELECT 1 AS result; 

ELSEIF ue = 0 THEN 
    SELECT 0 AS result; 
ELSE 
    SELECT null AS result; 
END IF; 
end

提前致谢! 我已经被困了一段时间了,不知道为什么。

【问题讨论】:

    标签: mysql sql stored-procedures


    【解决方案1】:

    您应该定义 OUT 参数。添加

    ", OUT 结果 INT"

    紧接在最后一个 IN 参数之后。

    【讨论】:

    • 我认为仍然不是正确的解决方案,因为它可以在没有 OUT 参数和 INSERT 参数的情况下工作...但是我对您的答案进行了解决,就像我在创建的其他程序中所做的一样。 . 只好把 SELECT 改成 SET,再做双重查询。唯一的问题是在 PHP 上,我认为多查询不是一个好主意,因为我必须调用过程并选择输出变量,它可能会在查询中失败并继续下一个。
    • 那你为什么不把它创建为一个函数呢?从我听到的消息来看,它看起来好多了。
    • 我是 MySQL 新手,我可能错了,但从我目前所读到的内容来看,当您修改表上的数据时不应使用函数(不允许插入、更新)。 link
    • 两者都是套路。你在哪里读到的,对我来说听起来不对?查看此链接以了解有关 difference between procedure and function 的更多信息。
    • 你是对的,我最后给出的链接是 SQL Server,而不是 MySQL...阅读 MySQL 文档我找不到任何相关内容,所以我对其进行了测试,它成功了,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 2014-08-17
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 2016-02-08
    • 2023-03-23
    相关资源
    最近更新 更多