Исключение MySqlException: Подзапрос возвращает более 1 строки для хранимой процедуры с курсором

#mysql #stored-procedures #cursor #database-cursor

#mysql #хранимые процедуры #база данных-курсор

Вопрос:

Здравствуйте, у меня есть следующая хранимая процедура для MySQL, но когда она выполняется в моем ASP.NET Основное приложение, в котором я получаю подзапрос, возвращает ошибку более 1 строки. Что я здесь делаю не так? Эквивалентная версия SQL Server, используемая для работы без проблем…

 -- System Calculates Candidate’s Matching Score based on a Manager’s Answer Weights
CREATE PROCEDURE spSysCalcCandScore
(
    IN Candidate_ID INT,
    IN Manager_ID INT
)
Begin
    DECLARE ansID INT;
    DECLARE tempSum INT;
    DECLARE Sum INT;
    DECLARE Done INT DEFAULT FALSE;
    DECLARE MyCursor CURSOR FOR
    SELECT Answer_ID FROM Completed_Questionnaire
    WHERE Candidate_ID = Candidate_ID;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET Done = TRUE;
    START TRANSACTION;
        OPEN MyCursor;
        myloop: LOOP
            FETCH  MyCursor INTO ansID;
            IF Done THEN
                LEAVE myloop;
            END IF;
            SET tempSum = (SELECT Weight_Value FROM Weight WHERE (Answer_ID = ansID AND Manager_ID = Manager_ID));
            SET Sum = Sum   tempSum;
        END LOOP;
        CLOSE MyCursor;
        
        IF (Sum IS NULL) THEN
            SET Sum = 0;
        END IF;
        
        UPDATE `Interest`
        SET Matching_Score = Sum
        WHERE (Candidate_ID = Candidate_ID AND Manager_ID = Manager_ID);
    COMMIT;
End//
  

Комментарии:

1. Я сомневаюсь, что вам все равно нужен курсор. Объясните, что вы делаете, и, вероятно, для этого будет один запрос. И эта строка может вызывать ошибку: SET tempSum = (SELECT Weight_Value FROM Weight WHERE (Answer_ID = ansID AND Manager_ID = Manager_ID));

2. И не называйте свои параметры точно так же, как имена столбцов!

3. Хм, я не думаю, что эта строка неверна, поскольку комбинация ответа и идентификатора менеджера для веса таблицы является первичным ключом для этой таблицы, поэтому я должен получить 1 результат при каждом выборе. Здесь я беру идентификатор ответа каждого ответа, представленного кандидатом (хранится в таблице Completed_Questionnaire), а затем беру и добавляю веса, установленные конкретным менеджером для каждого ответа, чтобы вычислить соответствующий балл. Справедливое замечание об именах параметров, я изменю их, спасибо!

4. «итак, я должен получить» — вы действительно должны проверить, верно ли это, и если нет, то top 1

5. @AKaramitsos: Manager_ID = Manager_ID — как БД должна знать, что брать? Столбец с этим именем или переменная с этим именем? Это условие, вероятно, ВЕРНО для ВСЕХ записей, поскольку оно принимает одно и то же дважды, например 1 = 1