Procedury składowane to zdefiniowane przez użytkownika instrukcje SQL, które są przechowywane w bazie danych MySQL i wykonywane na żądanie w celu wykonania określonej operacji na bazie danych. Te predefiniowane podprogramy pomagają w przeniesieniu logiki biznesowej do bazy danych, co ma kilka zalet:
- Podróże w obie strony wykonane do serwera bazy danych przez aplikację są zminimalizowane.
- Możliwość utrzymania kodu jest ulepszona, ponieważ różne aplikacje mogą współdzielić procedurę składowaną.
- Wydajność bazy danych uległa poprawie, ponieważ procedury składowane są kompilowane raz i wykonywane bardzo szybko i wydajnie.
W tym przewodniku:
-
Poznaj składnię tworzenia procedur składowanych i zadeklaruj swoją pierwszą procedurę.
-
Wykonaj przykładową procedurę po jej zadeklarowaniu.
-
Dowiedz się, jak usunąć procedurę, gdy już jej nie potrzebujesz.
Zanim zaczniesz
Upewnij się, że masz następujące elementy:
-
Jeśli jeszcze tego nie zrobiłeś, utwórz konto Linode i instancję obliczeniową. Zobacz nasze przewodniki Wprowadzenie do Linode i tworzenie instancji obliczeniowej.
-
Postępuj zgodnie z naszym przewodnikiem Konfigurowanie i zabezpieczanie instancji Compute, aby zaktualizować system. Możesz także ustawić strefę czasową, skonfigurować nazwę hosta, utworzyć ograniczone konto użytkownika i utwardzić dostęp SSH.
-
Serwer i klient MySQL zainstalowany na serwerze Linode. Instrukcje instalacji MySQL są dostępne dla różnych dystrybucji w naszej sekcji MySQL.
Przygotuj bazę danych
Zaczniesz od utworzenia przykładowej bazy danych, tabeli i użytkownika w celu uzyskania dostępu do bazy danych. Wypełnisz również tabelę przykładowymi danymi do celów testowych.
Tworzenie bazy danych, tabeli i użytkownika
-
Zaloguj się do serwera MySQL:
mysql -u root -pZostaniesz poproszony o podanie hasła roota Twojej bazy danych MySQL. Następnie naciśnij Enter aby kontynuować.
-
Następnie zobaczysz monit MySQL podobny do pokazanego poniżej.
mysql > -
Wpisz poniższe polecenie, aby utworzyć
test_dbbaza danych:CREATE DATABASE test_db;Wyjście:
Query OK, 1 row affected (0.01 sec) -
Utwórz użytkownika bazy danych i przyznaj pełny dostęp do
test_dbBaza danych. ZastąpPASSWORDo złożonej i unikalnej wartości, która jest zgodna z wytycznymi dotyczącymi haseł MySQL:CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';Wyjście:
Query OK, 1 row affected (0.01 sec) -
Przyznaj
test_userpełne uprawnienia dotest_dbbaza danych;GRANT ALL PRIVILEGES ON test_db.* TO 'test_user'@'localhost';Wyjście:
Query OK, 1 row affected (0.01 sec) -
Uprawnienia do spłukiwania:
FLUSH PRIVILEGES;Wyjście:
Query OK, 0 rows affected (0.01 sec)
Wypełnij bazę danych
-
Następnie przejdź do bazy danych test_db:
USE test_db;Wyjście:
Database changed -
Utwórz
productstabela do przechowywania przykładowych rekordów:CREATE TABLE products(product_id BIGINT PRIMARY KEY, product_name VARCHAR(50), category_name VARCHAR(50) ) ENGINE=INNODB;Wyjście:
Query OK, 0 rows affected (0.01 sec) -
Możesz teraz dodać kilka produktów do tabeli produktów, wykonując kolejno poniższe polecenia:
INSERT INTO products (product_id, product_name, category_name) VALUES ('1', 'GAMING KEYBOARD', 'COMPUTER ACCESSORIES'); INSERT INTO products (product_id, product_name, category_name) VALUES ('2', 'OPTICAL MOUSE', 'COMPUTER ACCESSORIES'); INSERT INTO products (product_id, product_name, category_name) VALUES ('3', 'MOUSE PAD', 'COMPUTER ACCESSORIES'); INSERT INTO products (product_id, product_name, category_name) VALUES ('4', 'STEREO SYSTEM', 'ELECTRONICS'); INSERT INTO products (product_id, product_name, category_name) VALUES ('5', '32 INCH TV', 'ELECTRONICS'); INSERT INTO products (product_id, product_name, category_name) VALUES ('6', 'DVB-T2 RECEIVER', 'ELECTRONICS');Powinieneś otrzymać poniższe dane wyjściowe po wykonaniu każdego
Insertoświadczenie:Query OK, 1 row affected (0.00 sec) -
Następny. potwierdź, czy przykładowe produkty zostały pomyślnie wstawione do bazy danych, uruchamiając
Selectpolecenie poniżej:SELECT * FROM products;Przykładowe produkty powinny być wymienione poniżej:
+------------+-----------------+----------------------+ | product_id | product_name | category_name | +------------+-----------------+----------------------+ | 1 | GAMING KEYBOARD | COMPUTER ACCESSORIES | | 2 | OPTICAL MOUSE | COMPUTER ACCESSORIES | | 3 | MOUSE PAD | COMPUTER ACCESSORIES | | 4 | STEREO SYSTEM | ELECTRONICS | | 5 | 32 INCH TV | ELECTRONICS | | 6 | DVB-T2 RECEIVER | ELECTRONICS | +------------+-----------------+----------------------+ 6 rows in set (0.00 sec) -
Wyjdź z serwera MySQL.
QUIT;Wyjście:
Bye! -
Po utworzeniu
test_dbbaza danych,productstabela,test_useri dodano kilka przykładowych produktów, możesz teraz przejść do tworzenia pierwszej procedury składowanej.
Tworzenie procedury przechowywanej
Składnia procedury przechowywanej
Podstawowa składnia tworzenia procedury składowanej w bazie danych MySQL jest pokazana poniżej:
DELIMITER &&
CREATE PROCEDURE PROCEDURE_NAME (PARAMETER_1, PARAMETER_2, PARAMETER_N...)
BEGIN
[SQL STATEMENT]
END &&
DELIMITER ;
-
DELIMITER &&wiersz na początku mówi serwerowi MySQL, aby traktował następujące instrukcje SQL jako pojedyncze instrukcje, zamiast wykonywać je pojedynczo. Kolejny&&znajduje się w następnym wierszu, aby zaznaczyć koniec tego oświadczenia. -
PROCEDURE_NAMEto miejsce, w którym zadeklarowana jest nazwa procedury składowanej. -
Po nazwie procedury następuje zestaw nawiasów, które zawierają parametry procedury. Procedury składowane obsługują parametry oddzielone przecinkami, a ta funkcja czyni je bardziej elastycznymi. Więcej informacji znajdziesz w sekcji Parametry.
-
BEGIN...ENDpolecenia zawierają instrukcję SQL, która ma być wykonana przez procedurę składowaną. -
Na koniec instrukcja
DELIMITER ;jest wystawiany ponownie, aby zmienić ogranicznik z powrotem na domyślną wartość;
Parametry zapisanej procedury
Każdy parametr procedury ma typ, nazwę i typ danych, oddzielone spacjami:
PARAMETER_TYPE PARAMETER_NAME DATA_TYPE
Na przykład, aby utworzyć parametr typu IN , o nazwie category , z VARCHAR typ danych o długości 50 znaków, użyj tej składni:
IN category VARCHAR(50)
MySQL obsługuje trzy typy parametrów:
-
IN:Wartość parametru musi być określona przez klienta wywołującego. Ta wartość nie może zostać zmieniona przez procedurę składowaną .Na przykład, jeśli przekażesz zmienną sesji MySQL jako
INdo procedury, a procedura modyfikuje tę wartość w swoich instrukcjach, zmienna sesji pozostanie niezmieniona po zakończeniu procedury. -
OUT:Ten typ parametru jest również określany przez program wywołujący, ale jego wartość może zostać zmieniona przez procedurę składowaną i pobrana przez program wywołujący.Zauważ, że procedura składowana nie może uzyskać dostępu do początkowej wartości zmiennej, która jest przekazywana jako
OUTparametr. -
INOUT:Parametr tego typu łączy zachowaniaINiOUTparametry:-
Procedura składowana może odczytać początkową wartość parametru.
-
Parametr można zmienić podczas wykonywania procedury składowanej.
-
Zmieniona wartość może zostać zwrócona do programu wywołującego, jeśli program wywołujący przekazał zmienną jako parametr.
-
Przykładowa procedura składowana
Po zrozumieniu podstawowej składni utwórzmy prostą procedurę składowaną do filtrowania produktów według nazwy kategorii. Nazwa kategorii zostanie podana jako IN parametr.
-
Zaloguj się do serwera MySQL za pomocą
test_userpoświadczenia , które utworzyłeś podczas przygotowywania bazy danych:mysql -u test_user -p -
Wpisz hasło
test_useri naciśnij Enter aby kontynuować. -
Otrzymasz
mysql >podpowiedź. Kontynuuj, wybierająctest_db:USE test_db;Wyjście:
Database changed. -
Następnie wprowadź poniższe polecenia SQL, aby utworzyć
filter_by_categoryprocedura składowana:DELIMITER && CREATE PROCEDURE filter_by_category (IN category VARCHAR(50)) BEGIN SELECT * FROM products WHERE category_name=category; END &&Wyjście:
Query OK, 0 rows affected (0.00 sec) -
Zmień
DELIMITERpowrót do;DELIMITER ; -
Jeśli kod do tworzenia procedury składowanej przebiegł pomyślnie, możesz teraz przejść do wykonywania procedury składowanej.
Wykonywanie procedury przechowywanej
W tym kroku wywołamy procedurę składowaną, którą utworzyliśmy powyżej. Będziemy postępować zgodnie z tą podstawową składnią:
CALL PROCEDURE_NAME (COMMA-SEPARATED PARAMETER VALUES);
-
Aby wykonać
filter_by_categoryprocedura składowana, którą stworzyliśmy powyżej, wprowadź poniższe polecenie:CALL filter_by_category('COMPUTER ACCESSORIES');Procedura składowana powinna teraz wyprowadzać wszystkie produkty w
COMPUTER ACCESSORIESkategorii, ponieważ określiliśmyCOMPUTER ACCESSORIESjako parametr:+------------+-----------------+----------------------+ | product_id | product_name | category_name | +------------+-----------------+----------------------+ | 1 | GAMING KEYBOARD | COMPUTER ACCESSORIES | | 2 | OPTICAL MOUSE | COMPUTER ACCESSORIES | | 3 | MOUSE PAD | COMPUTER ACCESSORIES | +------------+-----------------+----------------------+ 3 rows in set (0.00 sec) Query OK, 0 rows affected (0.01 sec) -
Podobnie możesz pobrać listę wszystkich produktów z
ELECTRONICSkategorii, wykonując poniższe polecenie.CALL filter_by_category('ELECTRONICS') ;Wyjście:
+------------+-----------------+---------------+ | product_id | product_name | category_name | +------------+-----------------+---------------+ | 4 | STEREO SYSTEM | ELECTRONICS | | 5 | 32 INCH TV | ELECTRONICS | | 6 | DVB-T2 RECEIVER | ELECTRONICS | +------------+-----------------+---------------+ 3 rows in set (0.00 sec) Query OK, 0 rows affected (0.01 sec)
Nasza procedura składowana działała zgodnie z oczekiwaniami. Następnie dowiemy się, jak usunąć procedury składowane, jeśli nie chcemy, aby były już ponownie wykonywane.
Usuwanie zapisanych procedur
Możesz usunąć procedurę składowaną MySQL, jeśli nie chcesz jej już używać lub chcesz ją odtworzyć od podstaw. Podstawowa składnia usuwania procedury składowanej jest pokazana poniżej:
DROP PROCEDURE IF EXISTS PROCEDURE_NAME;
Na przykład, aby usunąć nasz filter_by_category procedury składowanej, wykonaj poniższe polecenie MySQL:
DROP PROCEDURE IF EXISTS filter_by_category;
Jeśli procedura składowana istnieje, otrzymasz wynik pokazany poniżej:
Query OK, 0 rows affected (0.00 sec) To wszystko, jeśli chodzi o tworzenie, używanie i usuwanie procedur składowanych MySQL.
Więcej informacji
Dodatkowe informacje na ten temat można znaleźć w poniższych zasobach. Chociaż są one dostarczane w nadziei, że będą przydatne, należy pamiętać, że nie możemy ręczyć za dokładność ani aktualność materiałów hostowanych zewnętrznie.
- Praca z procedurami składowanymi MySQL