Procedury Składowane w MySQL

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! 🚀