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 -p
Zostaniesz 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_db
baza 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_db
Baza danych. ZastąpPASSWORD
o 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_user
pełne uprawnienia dotest_db
baza 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
products
tabela 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
Insert
oś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
Select
polecenie 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_db
baza danych,products
tabela,test_user
i 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_NAME
to 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...END
polecenia 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
IN
do 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
OUT
parametr. -
INOUT
:Parametr tego typu łączy zachowaniaIN
iOUT
parametry:-
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_user
poświadczenia , które utworzyłeś podczas przygotowywania bazy danych:mysql -u test_user -p
-
Wpisz hasło
test_user
i 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_category
procedura 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ń
DELIMITER
powró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_category
procedura 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 ACCESSORIES
kategorii, ponieważ określiliśmyCOMPUTER ACCESSORIES
jako 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
ELECTRONICS
kategorii, 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