【问题标题】:MYSQL Calling stored procedures inside an SELECT CASE on a TriggerMYSQL 在触发器上的 SELECT CASE 内调用存储过程
【发布时间】:2011-10-24 04:21:00
【问题描述】:

我坚持在触发器的 SELECT CASE 内调用存储过程,它给了我以下错误:

[Err] 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 'empata(NEW.eqvis))
            WHEN 'loc' THEN pierde(NEW.eqvis)
            WHEN 'vis' THEN g' at line 16

代码如下:

DELIMITER |
CREATE TRIGGER updpartido AFTER UPDATE ON partidos
FOR EACH ROW
    BEGIN
        SET @vgls = vgoles(NEW.eqvis);
        SET @lgls = vgoles(NEW.eqloc);
        SET @vglsec = vgolesec(NEW.eqvis);
        SET @lglsec = vgolesec(NEW.eqloc);
        SELECT CASE 
            WHEN @vgls=@lgls THEN "emp"
            WHEN @vgls>@lgls THEN "loc"
            WHEN @vgls<@lgls THEN "vis" 
        END
        INTO @st;

        SELECT CASE @st
            WHEN 'emp' THEN CALL empata(NEW.eqvis)
            WHEN 'loc' THEN CALL pierde(NEW.eqvis)
            WHEN 'vis' THEN CALL gana(NEW.eqvis)
        END
        INTO @dat;

        SELECT CASE @st
            WHEN 'emp' THEN CALL empata(NEW.eqloc)
            WHEN 'vis' THEN CALL pierde(NEW.eqloc)
            WHEN 'loc' THEN CALL gana(NEW.eqloc)
        END
        INTO @dat2;

        UPDATE equipos SET gf=@vgls,gc=@vglsec WHERE id=NEW.eqvis;
        UPDATE equipos SET gf=@lgls,gc=@lglsec WHERE id=NEW.eqloc;
    END;

|

但是,如果我删除触发器添加的“CALL”,但是当我进行一些更新时,它会给我“未找到功能”的错误,因为我将它们作为存储过程而不是作为函数,因为我不会返回任何内容。 ..

非常感谢任何帮助!

【问题讨论】:

    标签: mysql sql triggers mysql-error-1064


    【解决方案1】:

    您可以将您的过程empatapierdegana 转换为函数并按照下面第一个示例中的代码使用:

    -- works
    SET @st = 'loc';
    SELECT CASE @st
      WHEN 'loc' THEN function_(@st)
    END
    INTO @dat;
    SELECT @dat;
    

    我测试了以下场景,但它们不起作用:

    -- won't work
    SET @st = 'loc';
    IF @st = 'loc' THEN
        function_(@st);
    END IF;
    
    -- won't work
    SET @st = 'loc';
    SELECT CASE @st
      WHEN 'loc' THEN CALL stored_procedure_(@st)
    END
    INTO @dat;
    SELECT @dat;
    
    -- won't work
    SET @st = 'loc';
    IF @st = 'loc' THEN
        CALL stored_procedure_(@st);
    END IF;
    

    至少,它们对我不起作用。

    【讨论】:

      【解决方案2】:

      即使我不是 MySQL 专家,我也会冒险回答:

      我认为您不能在输出存储在变量中的 select 语句中调用存储过程。或更通俗地说:你不能同时吹和吸。您要么有一个 select 语句,其目的是返回一些记录,要么您对数据执行某种处理,但您不能将两者交织在一起。

      如果您将CALL 语句分开,我认为它应该可以工作。您可以在into @... 下方进行检查并调用相应的存储过程。

      【讨论】:

      • 有点混乱,我想做的是一个触发器,如果​​一支球队的得分高于另一支球队,它会增加一个胜利,另一个失败,还增加一场比赛
      • 这很容易,那么为什么需要调用另一个存储过程来做到这一点呢?为什么你在select...之后还要insert into @dat
      • @EnriqueBenitez 我认为这是因为函数不能像存储过程那样更改数据。再说一次,我不是 mysql 人,但至少在 SQL Server 上你不能更新函数内的数据。
      • “(at)dat”变量只是因为触发器不能返回“数据集”,这就是我这样做的原因......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多