Rozmawiałem z wykładowcą uniwersyteckim, który uczył języka PL/SQL po tym, jak wygłosiłem prezentację na konferencji. Mój wykład dotyczył dobrych praktyk PL/SQL; jeden z moich slajdów po prostu powiedział „Nie używaj wyzwalaczy”. Wykładowca powiedział mi, że trudno mu pogodzić takie rady z potrzebami programu nauczania. Muszą nauczyć swoich uczniów całej składni, ale przyznał, że często wyznaczają zadania wymagające rozwiązań, których nie użylibyśmy podczas profesjonalnego pisania oprogramowania.
To jest takie pytanie. Prawidłowym podejściem jest użycie ograniczenia sprawdzającego, jak pokazuje odpowiedź Gordona . Ograniczenia są bardziej wydajne i też idiomatyczne. Ale twój nauczyciel chce, abyś napisał wyzwalacz, więc oto poprawiony kod.
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;
Punkty do odnotowania:
- CREATE OR REPLACE oznacza, że możemy zmienić kod wyzwalacza bez wstępnej instrukcji DROP.
- BEGIN i END bloki kodu, takie jak ciała wyzwalające.
- Statyczne warunki warunkowe są umieszczane w ramkach za pomocą słów kluczowych IF ... END IF; WHEN służy do wychodzenia z konstrukcji pętli.
- Wartości kolumn tabeli referencyjnej ze słowami kluczowymi :NEW (i :OLD) – zwróć uwagę na dwukropek.
- Użyj RAISE_APPLICATION_ERROR, aby zgłosić wyjątek; numer błędu musi mieścić się w zakresie od -20999 do -20000, który Oracle rezerwuje dla wyjątków zdefiniowanych przez użytkownika.
- Spraw, by komunikat o błędzie był znaczący:powiedz użytkownikom, co zrobili źle, zamiast zmuszać ich do zgadywania.
- Dowiedz się, jak używać wcięć, aby kod był czytelny. Twoi przyszli współpracownicy ci za to podziękują.