#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