2016-03-24 34 views
0

我的問題是(是)以下。我試圖使用如果else語句沒有結束,如果和MySQL總是給我語法錯誤。即使這個代碼工作,我只是做不像「必須」通知系統寫入結束的概念,如果指定if-else語句已結束。是否有任何其他方法可以在不使用end的情況下完成相同的代碼?我正在考慮編寫兩個單獨的if子句而不是使用if-else,但我仍然有語法錯誤。是否有替代的if-else語法,而不需要endif

編輯:我刪除了代碼,因爲它提出的問題,對於一些users.The基本的問題更復雜了改變,如果其他結束的格式,如果

+4

這不是一個概念,它是一個語法。不幸的是,如果你不喜歡它,你可以做的不多。 – Loufylouf

+0

'ELSE'是可選的。 「THEN」和「END IF」是強制性的。這不是一個問題。你確定這個程序正在工作嗎?有沒有聲明'max_helper'和'cur_budget'的過程變量的引用。我從來沒有在SQL語句中看到用過程名稱限定的過程參數。這看起來像MySQL語法,但我對這個代碼是如何工作感到困惑。 – spencer7593

回答

1

是的,還有其他方法可以使用IF語句。

舉個例子:

CREATE PROCEDURE check_budget_sp(IN in_department_name VARCHAR(20) 
    ,IN in_salary DECIMAL(8,2),OUT res VARCHAR(1)) 
BEGIN 
    SET res = 'T'; 
    SELECT CASE WHEN d.max_budget>(d.cur_budget + in_salary) THEN 'F' ELSE 'T' END 
    INTO res 
    FROM department d 
    WHERE d.dept_name = in_department_name 
    LIMIT 1; 
END$$ 

如果SELECT不返回行,MySQL是要扔一個警告消息。 (OP過程模式會表現出相同的行爲。)如果我們想避免警告,我們可以輕鬆地做到這一點,但它需要一些額外的代碼。

仿效OP程序then 'F' else 'T'邏輯,在情況下,沒有行查詢返回的,我們只是初始化返回值將被else返回,我們運行查詢之前的值。

此實現不需要任何額外的「幫助程序」過程變量。額外的SET語句僅用於確保過程返回'T'或'F'(當查詢未返回行時)。 還有其他幾種選擇。


對於MySQL的IF聲明中,THENEND IF是強制性的。 ELSE是可選的。

這不是一個真正的問題。

如果你不喜歡END需要作爲CASE表達的一部分,你可以更換CASE表達,與一個MySQL特定的功能...

  IF(d.max_budget>(d.cur_budget + in_salary),'F','T') 
+0

這真的很好 – Curriculaa

+0

如果查詢碰巧返回多行,MySQL會拋出一個錯誤,而不僅僅是一個警告(我認爲)。我在查詢中添加了一個「LIMIT 1」,以保證它不會返回多於一行。 (很可能,'dept_name'在'department'表中是唯一的,如果沒有保證,我會包含LIMIT,我還會添加一個ORDER BY子句來確定結果,但是我省略了這一點,以避免與另一條線路混淆在一起。 – spencer7593

0

此代碼:

if max_helper>(cur_budget + check_budget_sp.salary) then 
    set res="F"; 
else 
    set res="T";    
end if; 

可以是替換爲:

set res = if(max_helper > cur_budget + check_budget_sp.salary, 'F', 'T'); 
+0

我沒有看到聲明的'max_helper'或'cur_budget'變量。用過程名稱限定過程參數是否有效?(也許我很困惑,但我不明白這是如何編譯或運行的。) – spencer7593

+0

@ spencer7593我對工作沒有任何要求。我只提出了一個替代片段的問題,提出了符合問題要求的片段 – Bohemian

+0

你的答案似乎更漂亮,但有一個問題。當max_helper大於總和時,結果爲「T」,因爲在我的代碼中它需要「F」 – Curriculaa

相關問題