Има няколко проблема с вашия тригер. Нека започнем с „връзката“ между оператор select и останалия код. В този конкретен случай select..
и if...end_if
(за момента приемете, че вашият избор действително работи, не, а само предполага). Сега се концентрирайте върху клаузата WHERE.
SELECT SUPPLIER.TRUSTED_SUPPLIER
INTO TRUST
...
WHERE SUPPLIER.TRUSTED_SUPPLIER = 'YES';
IF TRUST = 'NO' THEN ...
Тъй като вашият избор връща САМО ДА, операторът if никога няма да бъде True. Следователно изключението за приложение никога не може да бъде повдигнато. Сега какви са проблемите с select
.
Е, първо имате достъп до таблицата, към която е задействан тригерът. Докато в някои случаи можете да се измъкнете, но обикновено това води до ORA -04091:таблица
Клаузата INTO обаче изисква операторът да върне точно 1 ред . Повече от 1 ред води до изключение, а 0 реда води до no data found
изключение.
Накрая има проблем с raise_application_error statement
. Ако се изпълни, това ще повдигне числов аргумент...е извън диапазон изключение. Първият параметър трябва да е между -20999 до -20000 (отрицателно число). И така, как изглежда резултатът:
create or replace trigger verify_supplier_trust
before insert or update on product
for each row
declare
trust varchar2(3);
begin
select supplier.trusted_supplier
into trust
from supplier
where supplier.company_name = :new.supplier_name
and supplier.trusted_supplier = 'YES';
exception
when no_data_found then
raise_application_error(-20001, 'supplier not trusted');
end;
/
ЗАБЕЛЕЖКИ:
Не използвайте тип данни VARCHAR. Позволено е, но Oracle препоръчва да не го правите. Означава, че си запазват правото да променят това, което прави по всяко време. Вместо това използвайте препоръчания VARCHAR2.
Променям тригера да се задейства или при вмъкване, или при актуализиране. Ако бъде задействано при Вмъкване, само някой МОЖЕ да промени доставчик_име, така че да препраща към ненадежден доставчик и всичко ще бъде наред.