Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да създадете PL/SQL тригер за ред, който валидира колона от друга таблица

Има няколко проблема с вашия тригер. Нека започнем с „връзката“ между оператор 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:таблица се променя, тригер/функция може да не я види . Неправилно е винаги да избягвате препращането към задействащата таблица като цяло. Вие препращате към данните от таблицата с псевдозаписите :NEW и/или :OLD. Второ, вашата заявка не прави това, което мислите, че е. Пише

Клаузата 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.
Променям тригера да се задейства или при вмъкване, или при актуализиране. Ако бъде задействано при Вмъкване, само някой МОЖЕ да промени доставчик_име, така че да препраща към ненадежден доставчик и всичко ще бъде наред.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вземете първия ден от седмицата от номера на седмицата

  2. Как да проверите условията и да напишете текст в текстов файл oracle forms

  3. Oracle INSTR назад в Oracle SQL

  4. Как да актуализирате стойностите на колоната на една таблица със стойностите на колоната на друга таблица?

  5. Разлика между класовете драйвери на Oracle jdbc?