MYSQL在触发器上的SELECT案例中调用存储过程

MYSQL在触发器上的SELECT案例中调用存储过程,mysql,sql,triggers,mysql-error-1064,Mysql,Sql,Triggers,Mysql Error 1064,我在触发器的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

我在触发器的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;
分隔符|
在partidos上更新后创建触发器updpartido
每行
开始
设置@vgls=vgoles(新的.eqvis);
SET@lgls=vgoles(NEW.eqloc);
设置@vglsec=vgolesec(新的.eqvis);
SET@lglsec=vgolesec(NEW.eqloc);
选择案例
当@vgls=@lgls时,则为“emp”
当@vgls>@lgls时,则为“loc”

当@vgls我要冒险寻找答案,即使我不是MySQL的家伙:

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


如果将
CALL
语句分开,我认为应该可以使用。您可以将
下面的检查转换为@…
并调用相应的存储过程。

您可以将过程
emdata
pierde
gana
转换为函数,并按照下面第一个示例中的编码使用:

——有效
设置@st='loc';
选择CASE@st
当“loc”时,则函数为
结束
进入@dat;
选择@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;

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

这有点让人困惑,我想做的是一个触发器,如果一个队的得分高于另一个队,它会增加一个队的胜利,另一个队的失败,还会增加一场比赛。这很容易,那么为什么需要调用另一个存储过程来实现这一点呢?在执行
选择…
之后,为什么要
插入@dat
?@EnriqueBenitez我想这是因为函数不能像存储过程那样更改数据。再说一次,我不是mysql的人,但至少在SQL Server上,你不能更新函数中的数据。“(at)dat”变量只是因为触发器不能返回“dataset”,这就是我为什么这么做的原因。。。