MYSQL Вызов хранимых процедур внутри SELECT CASE по триггеру - PullRequest
0 голосов
/ 24 октября 2011

Я застрял при вызове хранимых процедур внутри SELECT CASE в Trigger, это вызывает у меня следующую ошибку:

[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 ]

1 голос
/ 28 декабря 2011

Вы можете преобразовать ваши процедуры empata, pierde и gana в функции и использовать их как закодировано в первом примере ниже:

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

Я протестировал следующие сценарии, и они не 't работа:

-- 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;

По крайней мере, они не работали для меня.

0 голосов
/ 24 октября 2011

Я собираюсь придумать ответ, даже если я не парень из MySQL:

Я не думаю, что вы можете вызывать хранимые процедуры в операторе select, выходные данные которого хранятся в переменной;или в более разговорной речи: вы не можете дуть и сосать одновременно.У вас либо есть оператор выбора, целью которого является возвращение некоторых записей, либо вы выполняете какой-то процесс с вашими данными, но вы не можете связать их оба.

Если вы разделяете операторы CALL, я думаюон должен работать.Вы можете выполнить проверку ниже into @... и вызвать соответствующий сохраненный процесс.

...