我坚持在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”,因为我把它们作为存储过程而不是函数,因为我不会返回任何内容。 ..
非常感谢任何帮助!
答案 0 :(得分:1)
您可以将您的程序empata
,pierde
和gana
转换为函数,并按照下面第一个示例中的编码使用:
-- 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 @...
下方进行检查,并调用相应的存储过程。