MYSQL在Trigger上的SELECT CASE内调用存储过程

时间:2011-10-24 04:21:00

标签: mysql sql triggers mysql-error-1064

我坚持在Trigger上的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”触发器添加,但当我做一些更新它给我错误“FUNCTION not found”,因为我把它们作为存储过程而不是函数,因为我不会返回任何内容。 ..

非常感谢任何帮助!

2 个答案:

答案 0 :(得分: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;

至少,他们没有为我工作。

答案 1 :(得分:0)

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

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

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