Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Procedury składowane MySQL

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 i OUT tryby. Możesz przekazać wartość początkową, procedura składowana może ją zmienić i zwróci nową wartość do aplikacji wywołującej.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak w PHP z PDO sprawdzić końcowe, sparametryzowane zapytanie SQL?

  2. Jak zabezpieczyć MySQL:część pierwsza

  3. Całkowita liczba blokad przekracza rozmiar tabeli blokad

  4. Import i eksport bazy danych mysql w wierszu poleceń superszybko

  5. Nie można połączyć się z serwerem MySQL na „localhost” (10061)