2015-01-08 67 views
0

是否可以在if語句中編寫複合語句-mysql?在編寫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 'DECLARE n INT unsigned DEFAULT 0; 
    DECLARE i INT unsigned DEFAULT 0; 
    DECL' at line 40 

Sombody請幫助

下面是該查詢我使用

........................................... 
    IF(tarif='LT') 
    THEN 

    CREATE TABLE costSlabs SELECT `Start`,`End`,Cost FROM energy_slabs where SiteId=NEW.SiteID and `Start` < totalUnits; 
    DECLARE n INT DEFAULT 0; 
    DECLARE i INT DEFAULT 0; 
    DECLARE newStart INT; 
    DECLARE newEnd INT; 
    DECLARE newCost DOUBLE; 
    DECLARE finalCost DOUBLE DEFAULT 0; 

    SELECT COUNT(*) FROM costSlabs INTO n; 
    SET i=0; 
    WHILE i<n DO 
    SELECT `Start`, `End`,Cost INTO newStart,newEnd,newCost FROM costSlabs LIMIT i,1 ; 

IF(newEnd<totalUnits) 
THEN 
SET finalCost = finalCost + ((newEnd-newStart) * newCost); 

ELSE 
........................................... 

回答

0

IF語句的範圍內有效一個MySQL存儲程序(存儲過程,函數或觸發器)。在MySQL存儲程序的上下文之外,它不是有效的SQL語句。

我們沒有看到這些語句的上下文中,但基於SQL SELECT的參考NEW.,沒有命名NEW任何表或表的別名,我會以爲這是SQL中的上下文一個CREATE TRIGGER聲明。

我懷疑你遇到的問題是由於分號分隔符,它有效地結束CREATE TRIGGER語句。爲了創建包含分號字符的觸發器,有必要指定一個不同的語句分隔符。例如:

DELIMITER $$ 

CREATE TRIGGER mytrig 
BEFORE INSERT ON mytable 
FOR EACH ROW 
BEGIN 
    SET NEW.col1 = 'foo'; 
    SET NEW.col2 = 'bar'; 
END$$ 

DELIMITER ; 

第一語句指定$$將用作定界符以結束的聲明。使用該集合,以下語句將作爲單個語句一起閱讀,直到遇到$$分隔符。這將結束聲明,並允許執行。這基本上可以防止觸發器體內的分號過早地「結束」語句。

一旦語句完成,您可以將分隔符更改回分號。

發佈在問題中的SQL文本塊本身無效。我懷疑語法錯誤是從CREATE TRIGGER陳述的執行中返回的,但這只是一個猜測,因爲問題中沒有足夠的上下文來做出結論。

而且,我相信,MySQL存儲程序中(例如觸發器),所有DECLARE語句必須出現其他語句,如CREATE TABLE

+0

感謝您的回答,像這樣嘗試,但現在顯示錯誤 [Err] 1422 - 存儲函數或觸發器中不允許顯式或隱式提交。任何想法 ..? – user1844105

+0

類似於「CREATE TABLE」語句的DDL語句導致隱式提交;這在觸發器的情況下是不允許的。在你的觸發器的設計中還有其他一些重要的問題:循環通過一系列'SELECT ... LIMIT i,1'效率低下,沒有order by子句,因此要返回的行不是確定性的(每次執行該SELECT語句可以每次返回完全相同的行,並且在規範內);整個混亂應該用遊標循環代替。有一個對'totalUnits'的引用,但是這並沒有在任何地方聲明。 – spencer7593

+0

我們不知道這個觸發器應該做什麼,最終結果應該是什麼。無論如何,這個觸發器做錯了。 – spencer7593