MySQL结果由存储过程上的多行组成

MySQL结果由存储过程上的多行组成,mysql,stored-procedures,cursor,Mysql,Stored Procedures,Cursor,我正在处理的这个存储过程有时会出错。我得到的结果包含多行错误,但仅针对某些作业ID\u输入值。我知道是什么导致了这个错误,所以我一直非常小心地确保我的返回值是标量值,而它们应该是标量值。很难了解存储过程,因此我不确定会在哪里生成错误。由于错误是有条件抛出的,因此我认为内存可能是一个问题,或者游标重用。我不经常使用游标,所以我不确定。感谢所有帮助你的人 DROP PROCEDURE IF EXISTS export_job_candidates; DELIMITER $$ CREATE PROCE

我正在处理的这个存储过程有时会出错。我得到的
结果包含多行
错误,但仅针对某些
作业ID\u输入
值。我知道是什么导致了这个错误,所以我一直非常小心地确保我的返回值是标量值,而它们应该是标量值。很难了解存储过程,因此我不确定会在哪里生成错误。由于错误是有条件抛出的,因此我认为内存可能是一个问题,或者游标重用。我不经常使用游标,所以我不确定。感谢所有帮助你的人

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 ;

我想你想用

 LIMIT 1
在您的选择中,不是

 WHERE 1
除了使用这个安全网,你还应该了解你的数据,找出为什么你会得到多个结果。在没有看到数据的情况下,我很难做出猜测。

其中的
1
(正如@cdonner所指出的)看起来肯定不正确,但我很确定发生了此错误,因为您的
选择了一个。。。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

这是我的一个选择引起的问题。。。进入需要限制条件的语句。非常感谢。我盯着这个SP看了太久,以至于忽略了像这样简单的东西。