Я бы поместил обработчик исключений вокруг фрагмента кода, который фактически вызывает ошибку.Если email_id
равно NULL, UPDATE
не будет обновлять строки, а SELECT
не будет возвращать строки.
PROCEDURE sp_GetNextEmailFromQueue (pAgentId IN NUMBER, pRecs OUT recordSet)
IS
EMAIL_ID INTEGER;
BEGIN
BEGIN
SELECT id
INTO EMAIL_ID
FROM (SELECT id, is_replied_to, is_being_worked, date_received
FROM SSQ_EMAILS
WHERE is_replied_to = 0 AND is_being_worked =0
ORDER BY date_received ASC)
WHERE rownum = 1;
EXCEPTION
WHEN no_data_found
THEN
email_id := null;
END;
UPDATE SSQ_EMAILS x
SET x.is_being_worked = 1,
x.agent_id = pAgentId,
x.work_started_date = SYSDATE
WHERE x.id = EMAIL_ID;
OPEN pRecs FOR
SELECT x.id,
x.message_id,
x.to_email,
x.from_email,
x.subject,
x.message,
x.date_received,
x.href_link,
x.is_being_worked,
x.work_started_date,
x.is_replied_to
FROM SSQ_EMAILS x
WHERE x.id = EMAIL_ID;
END;
Однако следует помнить, что этот код не предотвращает двух разных вызывающихработать на одном ряду.Если два сеанса вызывают эту процедуру одновременно, вполне возможно, что оба выберут одну и ту же строку.Если вы хотите предотвратить это, SELECT
необходимо заблокировать строку, выбранную с помощью предложения FOR UPDATE
.