存储过程中的MySQL结果包含多行

5
我正在处理的存储过程有时会出错。对于特定的JOB_ID_INPUT值,我会收到“结果由多行组成”的错误。我理解这个错误的原因,并且尽可能小心地确保我的返回值在应该是标量时是标量。由于错误是有条件地抛出的,所以让我认为可能存在内存问题或游标重用。我不经常使用游标,所以我不确定错误可能在哪里产生。感谢任何帮助我的人。
DROP PROCEDURE IF EXISTS export_job_candidates;
DELIMITER $$
CREATE PROCEDURE export_job_candidates (IN JOB_ID_INPUT INT(11))
BEGIN

DECLARE candidate_count INT(11) DEFAULT 0;
DECLARE candidate_id INT(11) DEFAULT 0;

# these are the ib variables
DECLARE _overall_score DECIMAL(5, 2) DEFAULT 0.0;

# declare the cursor that will be needed for this SP
DECLARE curs CURSOR FOR SELECT user_id FROM job_application WHERE job_id = JOB_ID_INPUT;

# this table stores all of the data that will be returned from the various tables that will be joined together to build the final export
CREATE TEMPORARY TABLE IF NOT EXISTS candidate_stats_temp_table (
    overall_score_ib DECIMAL(5, 2) DEFAULT 0.0
) engine = memory;

SELECT COUNT(job_application.id) INTO candidate_count FROM job_application WHERE job_id = JOB_ID_INPUT;

OPEN curs;

# loop controlling the insert of data into the temp table that is retuned by this function
insert_loop: LOOP

    # end the loop if there is no more computation that needs to be done
    IF candidate_count = 0 THEN 
        LEAVE insert_loop;
    END IF;

    FETCH curs INTO candidate_id;

    # get the ib data that may exist for this user
    SELECT
        tests.overall_score
    INTO 
        _overall_score
    FROM 
        tests
    WHERE
        user_id = candidate_id;

    #build the insert for the table that is being constructed via this loop 
    INSERT INTO candidate_stats_temp_table (
        overall_score
    ) VALUES (
        _overall_score
    );

    SET candidate_count = candidate_count - 1;

END LOOP;

CLOSE curs;

SELECT * FROM candidate_stats_temp_table WHERE 1;

END $$
DELIMITER ;
2个回答

4
我认为您想要使用:

 LIMIT 1

在你的选择中,不是


 WHERE 1

除了使用这个安全网,您还应该了解您的数据,以找出为什么会得到多个结果。如果没有看到数据,我很难猜测。

4
WHERE 1(正如@cdonner指出的那样)看起来肯定不正确,但我相信这个错误发生是因为你的SELECT ... INTO命令之一返回了多行。

这个应该没问题,因为它是一个没有GROUP BY的聚合函数,总是返回一行:

SELECT COUNT(job_application.id) INTO candidate_count
  FROM job_application WHERE job_id = JOB_ID_INPUT;

所以很可能是这一个:
# get the ib data that may exist for this user
SELECT
    tests.overall_score
INTO 
    _overall_score
FROM 
    tests
WHERE
    user_id = candidate_id;

尝试确定是否可能返回多行结果,如果是的话,如何解决。一种方法是对总分数进行MAX操作。

SELECT MAX(tests.overall_sore) INTO _overall_score
  FROM tests
  WHERE user_id = candidate_id

这是由于我的一个select...into语句需要一个LIMIT CASE引起的问题。谢谢。我一直盯着这个存储过程看了很久,以至于忽略了像这样简单的东西。 - usumoio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接