Lekcja: Procedury Składowane w MySQL (Rozszerzona)
1. Wstęp
Procedury składowane (Stored Procedures) w MySQL pozwalają na przechowywanie i wykonywanie złożonych operacji SQL w bazie danych. Mogą zawierać logikę warunkową, pętle i instrukcje sterujące przepływem. Są szczególnie przydatne do automatyzacji powtarzalnych operacji.
2. Tworzenie Procedury Składowanej
Procedura składowana jest tworzona za pomocą CREATE PROCEDURE. Podstawowa składnia:
DELIMITER //
CREATE PROCEDURE nazwa_procedury (parametry)
BEGIN
-- instrukcje SQL
END //
DELIMITER ;
DELIMITER //– zmienia domyślny znak końca zapytania (;) na//, aby poprawnie obsłużyć kod wewnątrz procedury.CREATE PROCEDURE– tworzy nową procedurę.BEGIN ... END– blok kodu procedury.
3. Rodzaje parametrów w procedurach
- IN – wartość przekazywana do procedury, ale nie może być modyfikowana.
- OUT – procedura zwraca wartość poprzez ten parametr.
- INOUT – wartość jest przekazywana, może zostać zmieniona i zwrócona.
3. Rodzaje parametrów w procedurach składowanych
Procedury składowane mogą przyjmować trzy typy parametrów:
- IN – wartość jest przekazywana do procedury, ale nie może zostać zmodyfikowana.
- OUT – procedura może zwrócić wartość poprzez ten parametr.
- INOUT – wartość jest przekazywana do procedury, może być zmieniona i zwrócona.
Przykład procedury z parametrem IN
Procedura zwracająca liczbę zamówień dla danego klienta:
DELIMITER //
CREATE PROCEDURE liczba_zamowien(IN klient_id INT, OUT liczba INT)
BEGIN
SELECT COUNT(*) INTO liczba FROM zamowienia WHERE zamowienia.klient_id = klient_id;
END //
DELIMITER ;
Wywołanie procedury:
CALL liczba_zamowien(1, @liczba);
SELECT @liczba;
4. Przykład: Procedura z warunkiem IF NOT EXISTS
Przykład 1: Dodanie klienta tylko jeśli nie istnieje
DELIMITER //
CREATE PROCEDURE dodaj_klienta(IN imie VARCHAR(50), IN nazwisko VARCHAR(50), IN wiek INT)
BEGIN
IF NOT EXISTS (SELECT 1 FROM klienci WHERE klienci.imie = imie AND klienci.nazwisko = nazwisko) THEN
INSERT INTO klienci (imie, nazwisko, wiek) VALUES (imie, nazwisko, wiek);
END IF;
END //
DELIMITER ;
Wywołanie procedury:
CALL dodaj_klienta('Tomasz', 'Lis', 45);
Działanie:
- Jeśli klient o podanym imieniu i nazwisku nie istnieje w tabeli
klienci, to zostanie dodany. - Jeśli istnieje, procedura nie doda nowego wpisu.
5. Instrukcje sterujące w procedurach składowanych
Procedury mogą wykorzystywać struktury sterujące:
- IF ... THEN ... END IF – warunki
- CASE ... WHEN ... THEN ... END CASE – wybór warunków
- LOOP, WHILE, REPEAT – pętle
Przykład 2: Procedura przypisująca rabat do klienta
DELIMITER //
CREATE PROCEDURE ustaw_rabat(IN klient_id INT)
BEGIN
DECLARE wiek_klienta INT;
-- Pobranie wieku klienta
SELECT wiek INTO wiek_klienta FROM klienci WHERE id = klient_id;
-- Ustawienie rabatu
IF wiek_klienta > 60 THEN
UPDATE klienci SET rabat = 10 WHERE id = klient_id;
ELSE
UPDATE klienci SET rabat = 0 WHERE id = klient_id;
END IF;
END //
DELIMITER ;
Ćwiczenia do wykonania
Ćwiczenie 1: Procedura dodająca nowego klienta
Zadanie:
Napisz procedurę dodaj_klienta, która przyjmuje imie, nazwisko i wiek, a następnie dodaje nowego klienta do tabeli klienci, ale tylko jeśli taki klient jeszcze nie istnieje.
Podpowiedź:
Użyj IF NOT EXISTS, aby sprawdzić, czy dany klient jest już w bazie.
Ćwiczenie 2: Procedura dodająca nowe zamówienie dla klienta
Zadanie:
Napisz procedurę dodaj_zamowienie, która przyjmuje klient_id, kwota oraz data_zlozenia, a następnie dodaje nowe zamówienie do tabeli zamowienia, ale tylko jeśli dany klient istnieje w tabeli klienci.
Podpowiedź:
Użyj IF EXISTS w zapytaniu SQL.
Ćwiczenie 3: Procedura sprawdzająca ilość produktu w magazynie
Zadanie:
Stwórz procedurę sprawdz_magazyn, która przyjmuje nazwa_produktu i zwraca ilość dostępnych sztuk w magazynie.
Podpowiedź:
Użyj SELECT ilosc INTO zmienna FROM magazyn WHERE nazwa = ...
To podsumowanie procedur składowanych w MySQL. Wykonaj ćwiczenia, aby lepiej zrozumieć ich działanie! 🚀