#sql #oracle
#sql #Oracle
Вопрос:
В моем приложении есть миниатюрный компонент, подобный ORM, который обрабатывает генерацию запросов для базовых операций обновления / удаления, но мне нужно обеспечить некоторую безопасность на уровне запроса, поскольку первичные ключи определяются автоматически (второй уровень анализа, если хотите).
По замыслу, всякий раз, когда я обновляю или удаляю строку, это должно влиять только на 1 строку.
Итак, учитывая следующий запрос:
UPDATE Cars SET Color = 'Red' WHERE CarID = 5
Как я могу сообщить Oracle: «… этот запрос должен повлиять на 1 строку. Если это затрагивает более 1 строки, выдает большую ошибку и ничего не делает.»?
Таким образом, предположим, что когда-нибудь возникнет ошибка, и этот запрос будет выполнен:
UPDATE Cars SET Color = 'Red'
… вместо этого он просто взорвется.
Ответ №1:
Возможно, вам не нужен ОТКАТ, но при возникновении проблемы обычно требуется откат обновления:
DECLARE
update_exception EXCEPTION;
BEGIN
UPDATE Cars
SET Color = 'Red'
WHERE CarID = 5;
--
IF SQL%ROWCOUNT > 1
THEN
RAISE update_exception;
END IF;
EXCEPTION
WHEN update_exception
THEN
ROLLBACK;
-- Do your error handling...
END;
Ответ №2:
Используйте SQL%ROWCOUNT, чтобы определить количество затронутых записей перед фиксацией транзакции и выдать исключение в случае > 1.
Комментарии:
1. @routeNpingme, перейдите по ссылке 🙂