2012-01-19 4 views
0

私はmysqlデータベースを使用しています。私は関数を作成しました。その関数では、ローカル変数を設定しています。私はテーブルからレコードをフェッチする必要があるので、これでCURSORを使用しています。mysqlデータベースで関数を作る際にループを使ってCURSORを使ってローカル変数を設定する方法

フェッチされたレコードに基づいて、ファンクションは実際のデータ型をif条件から戻します。

私は、mysql関数でカーソルのforループを作成する方法の手順を説明してください。 私のコードは次のようである: -

DELIMITER $$; 
    CREATE FUNCTION score_exam (e integer) 
    RETURNS real 
    BEGIN 
    Declare t float ; 
    Declare c float; 
    Declare d int; 
    Declare e int; 
    Declare f int; 
    Declare g int; 
    Declare h int; 
    DECLARE done INT DEFAULT FALSE; 
    DECLARE r CURSOR FOR SELECT num, quen_n, cha_nu, sele_anr, cor_ans FROM equestion WHERE exm_nm = e; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 
    set t=0.0; 
     set c=0.0; 
    OPEN r; 
    read_loop: LOOP 
FETCH r INTO d,e,f,g,h; 
IF done THEN 
    LEAVE read_loop; 
    END IF; 
set t = t + 1.0; 
    IF g = h THEN 
    set c = c + 1.0; 
    END IF; 
END LOOP; 
    IF t > 0.0 THEN 
    RETURN c/t; 
ELSE 
    RETURN 0.0; 
END IF; 
CLOSE r; 
END $$ 

誰も私を助けてしまう場合は、私は彼にGREATFULになります。

+2

いくつかのコードを入れて、これまでに何をしていますか? –

答えて

0

あなたがしようとしているのは、e-Question(試験)に基づいて得点を得ることだけです。テストのためのトータルの質問と正しい答えの数を探してください...テストに質問がない場合は、0で除算するのを防ぐために0を返してください。それは、単一のクエリで実行できるような複雑な関数を書くためには、あまりにも多くのフープを実行しているように見えます。また、計算する試験用に "e"という入力パラメータがあります"quen_n"をeに取り込んで取り込みを止めさせるでしょうか?私は説明のためにパラメータの名前を変更します。余分な要素のクエリは使用されていないようで、 "num"はテーブルの行番号またはpk id、Quen_nは試験の質問番号などと解釈します。そこにいくつの質問があったのか、そしてどれくらい正しいのかということです。だから、ここで私が書くと答えを得るだけの質問です。

SELECT 
     count(*) as TotalQuestions, 
     sum(if(sele_anr = cor_ans, 1, 0)) as CorrectAnswers 
    FROM 
     equestion 
    WHERE 
     exm_nm = ExamToScore 

これをあなたのフェッチとして持って帰ります。結果から返されたレコードがない場合は、0を返します.1つのレコードが返された場合は、除算を行い、それを返します。

関連する問題