Разговарях с университетски преподавател, който преподаваше PL/SQL, след като направих презентация на конференция. Моят разговор беше за добрата практика на PL/SQL; един от моите слайдове просто казваше „Не използвайте тригери“. Преподавателят ми каза, че намира подобни съвети за трудни за съвместяване с нуждите на учебната програма. Те трябва да научат своите ученици на целия синтаксис, но той призна, че често поставят задачи, които изискват решения, които не бихме използвали, когато пишем професионално софтуер.
Това е такъв въпрос. Правилният подход е да се използва ограничение за проверка, както показва отговорът на Гордън . Ограниченията са по-ефективни и идиоматични. Но вашият учител иска да напишете тригер, така че ето вашия код, коригиран.
CREATE OR REPLACE TRIGGER CheckAdvance
BEFORE INSERT OR UPDATE OF advance ON titles
FOR EACH ROW
BEGIN
IF (:new.advance < 0
OR :new.advance > 100)
THEN
raise_application_error(-20000
, 'Advance cannot be less than zero or greater than one hundred.');
END IF;
END;
Забележки:
- CREATE OR REPLACE означава, че можем да променим тригерния код без предварителен оператор DROP.
- НАЧАЛНИ и КРАЙНИ рамкови блокове от код, като например тела на тригери.
- Стичните условни изрази са рамкирани с ключови думи IF ... END IF; WHEN е за излизане от циклични конструкции.
- Стойности на колоната в справочната таблица с ключови думи :NEW (и :OLD) – обърнете внимание на двоеточието.
- Използвайте RAISE_APPLICATION_ERROR, за да хвърлите изключение; номерът на грешката трябва да бъде в диапазона от -20999 до -20000, който Oracle запазва за дефинирани от потребителя изключения.
- Направете съобщението си за грешка смислено:кажете на потребителите си какво са направили грешно, вместо да ги карате да гадаят.
- Научете се да използвате отстъп, за да направите кода си четим. Вашите бъдещи колеги ще ви благодарят за това.