То, что вы должны здесь сделать, зависит от архитектуры вашей системы и вашего отношения к размещению бизнес-логики.
Многие архитекторы систем предпочитают использовать базу данных в качестве тупого хранилища данных и реализуют тот тип обработки ошибок и проверки целостности, о котором вы говорите на среднем / прикладном уровне.Это совершенно правильный подход, и он особенно подходит для систем, требующих регулярных небольших выпусков, где бизнес-логика подвержена регулярным изменениям (гораздо легче перераспределить исполняемый файл в середине недели, чем координировать выпуск базы данных), и где данныеМодель довольно проста.
Другой подход - поместить некоторую четко определенную полупостоянную бизнес-логику на уровень базы данных.Это особенно полезно, когда модель данных более сложна, и у вас есть хороший администратор баз данных!;)
Мое личное мнение таково, что корпоративная база данных должна отвечать за свою целостность, и поэтому я предпочитаю иметь логику на уровне базы данных, чтобы гарантировать это - устраняя любую уязвимость к ошибкам, появляющимся в не-базе данныхрелизы кода.Так что в вашем конкретном примере я бы определенно поймал ошибку и осмысленно сообщил об этом вашему прикладному уровню.
Oracle поддерживает перехват различных типов ошибок, используя исключения имен, что позволяет вам осмысленно возбудить эти исключения в своих приложениях.Например:
PROCEDURE test() AS
b VARCHAR2;
BEGIN
-- if the following row exists, then DUP_VAL_ON_INDEX will be thrown
-- (assuming there is a primary key constraint)
INSERT INTO table(a,b,c)
VALUES(1,2,3);
-- if there is no matching record, NO_DATA_FOUND will be thrown
SELECT a
INTO b
FROM TABLE
WHERE c = 'blah';
EXCEPTION -- both types of exception can be caught and embellished
WHEN DUP_VAL_ON_INDEX THEN
raise_application_error(-20570, 'Attempted to insert a duplicate value', TRUE);
WHEN NO_DATA_FOUND THEN
raise_application_error(-20571, 'No matching row in table for value:' || 'blah', TRUE);
WHEN OTHERS THEN
rollback
END test;
Вы можете найти больше информации здесь: http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/errors.htm
Надеюсь, это поможет ..