-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 @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不允许从函数返回结果集

我在这里犯了什么错误,有人可以帮助我吗?

4

1 回答 1

1

您不能用@ 命名输入变量。@ 用于用户变量,即不需要声明的连接局部变量。

你也不能select在函数中有 s 。

过程可以返回结果集但返回值。
函数可以返回值,但不能返回结果集。

它们的使用方式也不同。

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

call procedure_name(1);

并且在选择内部分配变量时,您需要做:=而不是=。在您的代码中,您实际上是在选择 true 或 false 而不是计数。

这应该有效。

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 ;
于 2013-07-04T08:10:35.827 回答