2013-07-04 100 views
-1

我寫了如下的函數。此功能的目的是通過分支中的某個特定考試返回學生的位置。MySql函數創建錯誤

DELIMITER $$  

CREATE FUNCTION `getMerit`(branch VARCHAR(50), totalMark DECIMAL(19,2), comaSeparetedExamIds VARCHAR(200)) RETURNS INT(11) 
BEGIN 
    SET @comaSeparetedExamIds=comaSeparetedExamIds; 
    SET @branch =branch; 
    SET @marks=totalMark; 

    SELECT @place=COUNT(*)+1 
    FROM (
     SELECT SUM(m.marks) marks 
     FROM marksheet m, studentinfo s 
     WHERE exam_id IN (@comaSeparetedExamIds) 
      AND m.student_roll=s.roll_no 
      AND s.branch LIKE CONCAT(@branch,'%') 
     GROUP BY m.student_roll 
    ) AS a 
    WHERE a.marks>@totalMark; 

    RETURN @place; 
    END$$ 

DELIMITER ; 

但它顯示我一個錯誤。錯誤是

查詢:CREATE FUNCTION getMerit(分支VARCHAR(50),totalMark DECIMAL(19,2),comaSeparetedExamIds VARCHAR(200))返回int(11) BEG ...錯誤代碼:1415不允許返回結果集 函數

我在這裏犯了什麼錯誤,任何人都可以幫我嗎?

+1

什麼是錯誤? –

+0

更新了錯誤。 –

回答

1

您不能用@命名輸入變量。 @用於user variables,即不需要聲明的連接局部變量。

此外,您不能在功能select s。

程序可以返回結果集,但返回值。
函數可以返回值但不返回結果集。

它們在使用方式上也有所不同。

select function_name(1) from dual; 
select id, name, funcation_name(id, name) from anyTable; 

call procedure_name(1); 

當分配變量裏面選擇你需要做的:=而不是=。在你的代碼中,你實際上選擇的是真或假,而不是計數。

這應該工作。

DELIMITER $$  

CREATE FUNCTION `getMerit`(branch VARCHAR(50), totalMark DECIMAL(19,2), comaSeparetedExamIds VARCHAR(200)) RETURNS INT(11) 
BEGIN 
    SET @comaSeparetedExamIds=comaSeparetedExamIds; 
    SET @branch =branch; 
    SET @marks=totalMark; 

    SELECT COUNT(*)+1 INTO @place 
    FROM (
     SELECT SUM(m.marks) marks 
     FROM marksheet m, studentinfo s 
     WHERE exam_id IN (@comaSeparetedExamIds) 
      AND m.student_roll=s.roll_no 
      AND s.branch LIKE CONCAT(@branch,'%') 
     GROUP BY m.student_roll 
    ) AS a 
    WHERE a.marks>@totalMark; 

    RETURN @place; 
    END$$ 

DELIMITER ; 
+0

我改變了@但仍然出現錯誤。我添加了錯誤。 –

+0

那麼,我該如何返回計數? 有什麼辦法可以從這個函數返回計數結果嗎? –

+0

嘗試在我的答案中的建議,這是未經測試的,但我已經將值放入@place使用'select ... into',這將抑制結果集被返回。 –