Język SQL: Instrukcja warunkowa

article-thumbnail

Instrukcja warunkowa jest elementem języka SQL, który pozwala na automatyczne sterowanie wykonywaniem się kwerend. Szczególnie dobrze sprawdzi się oczywiście w wyzwalaczach i procedurach składowanych, które dzięki niej będą lepiej sterowalne. Jeżeli nie znasz teorii programowania dotyczącej właśnie warunków i instrukcji sterującej If zapraszam do zapoznania się z wpisem na naszym blogu. LINK.

Przejdźmy więc do syntaxu. Wygląda on następująco:

IF warunek THEN
    -- kod, który zostanie wykonany, jeśli warunek jest spełniony
ELSE
    -- kod, który zostanie wykonany, jeśli warunek nie jest spełniony
END IF;

Warunek używany po IF niczym nie różni się od tego stosowanego po klauzurze WHERE lub HAVING. Oczywiście warunki złożone możemy łączyć za pomocą słów AND oraz OR, działa też negacja słowem NOT. Napiszmy więc kilka instrukcji warunkowych, aby lepiej zrozumieć ich działanie.

DELIMITER //
CREATE PROCEDURE ocen(IN id_gry INT)
BEGIN
    DECLARE pozytywnych INT;
    DECLARE negatywnych INT;
    SELECT COUNT(*) INTO pozytywnych FROM oceny WHERE oceny.id_gry = id_gry AND oceny.ocena > 5;
    SELECT COUNT(*) INTO negatywnych FROM oceny WHERE oceny.id_gry = id_gry AND oceny.ocena <= 5;
    IF pozytywnych > negatywnych THEN
        SELECT id_gry AS identyfikator, 'w większości pozytywne' AS komentarz;
    ELSE
        SELECT id_gry AS identyfikator, 'w większości negatywne' AS komentarz;
    END IF;
END //
DELIMITER ;

Ta procedura ma sprawdzić, czy opinii pozytywnych jest więcej niż negatywnych. Pobierane więc są dwie wartości – ilość ocen > 5 i ilość mniejszych od 5. Następnie instrukcja warunkowa porównuje ilość ocen pozytywnych i negatywnych, aby określić komentarz.

Teraz napiszmy trigger, który dokona walidacji danych wprowadzonych w instrukcji UPDATE. Jeżeli zmieniona ocena nie należy do przedziału od 1 do 10, to przerwie wykonywanie operacji, poprzez polecenie SIGNAL SQLSTATE.

CREATE TRIGGER sprawdz_ocena BEFORE UPDATE ON oceny
FOR EACH ROW
BEGIN
    IF NEW.ocena < 1 OR NEW.ocena > 10 THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Wartość pola ocena powinna być w zakresie od 1 do 10.';
    END IF;
END;

Przetestujmy:

UPDATE `oceny` SET `ocena`=-1 WHERE  `id_gry`=1 AND `id_gracza`=1

MySQL zwrócił komunikat: #1644 - Wartość pola ocena powinna być w zakresie od 1 do 10.

Ocena pozostała również niezmieniona.