-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( branch varchar(50), totalMark DECIMAL(19,2), comaSeparetedExamIds varchar(200) ) RETURNS int(11) BEG... エラーコード: 1415 関数から結果セットを返すことは許可されていません

私がここで犯した間違い、誰か助けてくれませんか?

4

1 に答える 1

1

@ を使用して入力変数に名前を付けることはできません。@ はユーザー変数、つまり宣言する必要のない接続ローカル変数に使用されます。

また、関数に s を含めることはできませんselect

プロシージャは結果セットを返すことができますが、値を返します。
関数は値を返すことはできますが、結果セットを返すことはできません。

また、使い方も異なります。

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 に答える