2011-10-24 74 views
0

IM停留在呼籲一個觸發一個SELECT CASE內部存儲過程中的SELECT CASE內部存儲過程,它gaves我下面的錯誤:MYSQL調用上觸發

[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 @[email protected] 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 [email protected],[email protected] WHERE id=NEW.eqvis; 
     UPDATE equipos SET [email protected],[email protected] WHERE id=NEW.eqloc; 
    END; 

|

但是,如果我刪除了「CALL」觸發器添加,但是當我做一些更新時,它給了我「功能找不到」的錯誤,因爲我把它們作爲存儲過程,而不是作爲函數,因爲我不會返回什麼...

任何幫助非常感謝!

回答

1

你可以把你的程序empatapierde,並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; 

至少,他們沒有爲我工作。

0

我要冒險的答案,即使我不是一個MySQL的傢伙:

我不認爲你可以調用一個select語句的輸出被存儲在一個變量中存儲過程;或更通俗地說:你不能同時吹和吸。你可能有一個select語句,其目的是返回一些記錄,或者你對數據執行某種處理,但是你不能把它們交織在一起。

如果你分開CALL陳述,我認爲它應該工作。您可以在into @...下面執行檢查並調用相應的存儲過程。

+0

它有點混亂,我想要做的是一個觸發器,如果​​一個球隊比另一個球員有更多的得分,它增加了一個勝利,併爲其他球員輸了,還增加了一場比賽 –

+0

我讓它工作只是改變功能:) –

+0

這很容易,所以爲什麼你需要調用另一個存儲過程來做到這一點?你爲什麼在'select ...'之後插入@ dat'? – Icarus