MySQL daje nam możliwość tworzenia procedur składowanych . Procedury składowane są potężną częścią MySQL (i innych systemów zarządzania bazami danych, takich jak SQL Server) i pozwalają robić więcej niż widoki.
procedura składowana to zbiór instrukcji SQL przechowywanych w bazie danych. Procedura składowana może zawierać logikę biznesową, która jest jednym z kluczowych aspektów odróżniających procedury składowane od widoków. Procedura składowana może akceptować parametry i można ustawić zmienne, napisać IF
oświadczenia itp. w ramach procedury składowanej.
Jak działają zapisane procedury?
Przede wszystkim tworzysz procedurę składowaną. Następnie po utworzeniu możesz go uruchomić (a dokładniej „wywołać” go).
Aby uruchomić procedurę składowaną, „wywołaj” ją. Wywołując go, podajesz również wszelkie parametry, których może wymagać. Procedura składowana zostanie wtedy wykonana, używając parametrów w sposób określony w kodzie.
Na przykład możesz napisać procedurę składowaną, która akceptuje FruitId
parametr. Procedura składowana może następnie pobrać ten parametr i użyć go do sprawdzenia inwentarza dla tego konkretnego owocu. Dlatego możesz wywołać procedurę składowaną, za każdym razem z innym identyfikatorem owocu i zwróciłaby ona wartość, która pokazuje, ile tego owocu jest w magazynie.
Utwórz procedurę składowaną
Procedury składowane są tworzone za pomocą CREATE PROCEDURE
oświadczenie.
Składnia
Oto składnia tworzenia procedury składowanej:
CREATE PROCEDURE sp_name(p_1 INT) BEGIN ...code goes here... END;
Zastąp sp_name o dowolnej nazwie, której chcesz użyć dla procedury składowanej. Nawiasy są wymagane — zawierają wszelkie parametry. Jeśli żadne parametry nie są wymagane, nawiasy mogą być puste.
Główna część procedury składowanej znajduje się pomiędzy BEGIN
i END
słowa kluczowe. Te słowa kluczowe są używane do pisania instrukcji złożonych. Instrukcja złożona może zawierać wiele instrukcji, które w razie potrzeby można zagnieżdżać. Dlatego możesz zagnieździć BEGIN
i END
bloki.
W większości przypadków trzeba również otoczyć CREATE PROCEDURE
oświadczenie z DELIMITER
komendy i zmiany END;
do END //
. Tak:
DELIMITER // CREATE PROCEDURE sp_name(p_1 INT) BEGIN ...code goes here... END // DELIMITER ;
Wkrótce wyjaśnię dlaczego, ale na razie spójrzmy na przykład.
Przykład
Oto prosty przykład tworzenia procedury składowanej. Uruchamianie następującego kodu w naszym FruitShop baza danych utworzy procedurę składowaną o nazwie spCheckFruitStock :
DELIMITER // CREATE PROCEDURE spCheckFruitStock(thisFruit SMALLINT) BEGIN SELECT Fruit.FruitName, Fruit.Inventory, Units.UnitName FROM Fruit INNER JOIN Units ON Fruit.UnitId = Units.UnitId WHERE Fruit.FruitId = thisFruit; END // DELIMITER ;
Teraz możemy wywołać tę procedurę składowaną w ten sposób:
CALL spCheckFruitStock(1);
Tutaj przekazujemy parametr 1
czyli identyfikator
Apple
.
Oto wynik:
Możemy zrobić to samo dla dowolnego owocu w naszej bazie danych, po prostu zmieniając parametr przekazany do procedury składowanej.
O DELIMITER
Polecenie
W powyższym przykładzie dodaliśmy kilka DELIMITER
polecenia i zastąpiliśmy średnik dwoma ukośnikami. Co się tutaj dzieje?
Zrobiliśmy to, aby poinformować MySQL, aby używał innego ogranicznika podczas tworzenia naszej procedury składowanej.
Powodem tego jest to, że MySQL już rozpoznaje średnik jako ogranicznik oznaczający koniec każdej instrukcji SQL. Dlatego też, gdy tylko MySQL zobaczy pierwszy średnik, zinterpretuje ogranicznik jako taki i nasza procedura składowana ulegnie uszkodzeniu.
DELIMITER
Polecenie pozwala nam powiedzieć MySQL, aby używał innego ogranicznika. W powyższym przykładzie ustawiamy to na dwa ukośniki (//
), ale to mogło być cokolwiek (chociaż unikaj używania odwrotnego ukośnika (\
.) ), ponieważ jest to znak ucieczki dla MySQL). Zmieniając ogranicznik, MySQL nie będzie próbował interpretować naszych średników jako końca instrukcji — poczeka, aż zobaczy dwa ukośniki.
Po utworzeniu procedury składowanej możemy użyć DELIMITER ;
aby zresetować ogranicznik z powrotem do średnika.
Upuszczanie zapisanej procedury
Procedurę składowaną można usunąć za pomocą DROP PROCEDURE
oświadczenie. Tak:
DROP PROCEDURE spCheckFruitStock;
Zmiana procedury zapisanej
Możesz zmienić niektóre aspekty procedury składowanej za pomocą ALTER PROCEDURE
oświadczenie.
Aby jednak zmienić treść procedury składowanej lub dowolny z jej parametrów, należy ją usunąć i ponownie utworzyć. Tak:
DROP PROCEDURE IF EXISTS spCheckFruitStock; DELIMITER // CREATE PROCEDURE spCheckFruitStock(thisFruit SMALLINT) BEGIN SELECT Fruit.FruitId, Fruit.FruitName, Fruit.Inventory, Units.UnitName FROM Fruit INNER JOIN Units ON Fruit.UnitId = Units.UnitId WHERE Fruit.FruitId = thisFruit; END // DELIMITER ;
Tutaj dodaliśmy Fruit.FruitId
do listy kolumn do powrotu.
Wynik:
Bardziej zaawansowana procedura przechowywana
Powyższy przykład był prosty w celu zademonstrowania składni tworzenia i wywoływania procedur składowanych. Spójrzmy na nieco bardziej złożoną procedurę składowaną:
DROP PROCEDURE IF EXISTS spCheckFruitStockLevel; DELIMITER // CREATE PROCEDURE spCheckFruitStockLevel( IN pFruitId SMALLINT(5), OUT pStockLevel VARCHAR(6)) BEGIN DECLARE stockNumber SMALLINT; SELECT Fruit.Inventory into stockNumber FROM Fruit INNER JOIN Units ON Fruit.UnitId = Units.UnitId WHERE Fruit.FruitId = pFruitId; IF stockNumber > 10 THEN SET pStockLevel = 'High'; ELSEIF (stockNumber <= 10 AND stockNumber >= 5) THEN SET pStockLevel = 'Medium'; ELSEIF (stockNumber < 5) THEN SET pStockLevel = 'Low - Please Replace Now!'; END IF; END // DELIMITER ;
Powyższy przykład akceptuje dwa różne tryby parametrów (IN
i OUT
). IN
jest wartością domyślną, dlatego w poprzednim przykładzie nie uwzględniono trybu.
Tutaj również ustawiamy zmienną. Używamy DECLARE stockNumber SMALLINT
zadeklarować zmienną o nazwie stockNumber
z typem SMALLINT
(mała liczba całkowita).
Używamy SELECT
oświadczenie, aby wyszukać inwentarz dla danego identyfikatora owocu i przypisać go do naszego stockNumber
zmienna.
Na koniec używamy SQL IF
oświadczenie do określenia stanu zapasów, umieszczając tę wartość w pStockLevel
parametr (którym oczywiście jest OUT
parametr — jest to wartość, którą zobaczymy, gdy wywołamy procedurę składowaną).
Wywołanie procedury składowanej z OUT
lub INOUT
Parametr
W naszym ostatnim przykładzie określiliśmy dwa parametry, IN
parametr i OUT
parametr.
Kiedy wywołujemy tę procedurę składowaną, nadal musimy dołączyć OUT
parametr. Ponieważ jednak nie poznamy jego wartości (w końcu dlatego go nazywamy — żeby poznać jego wartość!), będziemy musieli użyć zmiennej. Następnie możemy użyć SELECT
oświadczenie, aby poznać jego wartość.
Tak:
CALL spCheckFruitStockLevel(1, @stockLevel); select @stockLevel;
Wynik:
Tryby parametrów
Właśnie użyliśmy dwóch trybów parametrów (IN
i OUT
). W MySQL istnieją trzy tryby parametrów, których można używać z procedurami składowanymi.
- W
- W przypadku korzystania z tego trybu parametrów użytkownik (lub aplikacja) musi przekazać wartość parametru podczas wywoływania procedury składowanej. Te parametry są chronione. W związku z tym jego oryginalna wartość jest zachowywana po wykonaniu procedury składowanej. Jeśli procedura składowana zmienia wartość, robi to tylko na kopii parametru.
Ten tryb jest trybem domyślnym. Jeśli nie podasz trybu parametru, będzie to
IN
. - WYJŚCIE
- Wartość
OUT
parametr może ulec zmianie w ramach procedury składowanej, a jego wartość jest zwracana do aplikacji wywołującej. - INOUT
- Ten tryb jest kombinacją
IN
iOUT
tryby. Możesz przekazać wartość początkową, procedura składowana może ją zmienić i zwróci nową wartość do aplikacji wywołującej.