Lagrede procedurer er brugerdefinerede SQL-sætninger, der er gemt i en MySQL-database og eksekveret on-demand for at udføre en specifik databasehandling. Disse foruddefinerede underrutiner hjælper med at flytte forretningslogikken til databasen, hvilket giver nogle få fordele:
- Rundture foretaget til databaseserveren af en applikation minimeres.
- Kodevedligeholdelse er forbedret, da forskellige applikationer kan dele den lagrede procedure.
- Databasens ydeevne er forbedret, fordi lagrede procedurer kompileres én gang og udføres meget hurtigt og effektivt.
I denne guide skal du:
-
Lær syntaksen til at oprette lagrede procedurer, og erklær din første procedure.
-
Udfør eksempelproceduren, efter du har erklæret den.
-
Lær, hvordan du sletter en procedure, når du ikke længere har brug for den.
Før du begynder
Sørg for, at du har følgende:
-
Hvis du ikke allerede har gjort det, skal du oprette en Linode-konto og Compute Instance. Se vores vejledninger Kom godt i gang med Linode og Oprettelse af en beregningsinstans.
-
Følg vores guide til konfiguration og sikring af en computerinstans for at opdatere dit system. Du ønsker måske også at indstille tidszonen, konfigurere dit værtsnavn, oprette en begrænset brugerkonto og skærpe SSH-adgang.
-
En MySQL-server og klient installeret på Linode-serveren. Installationsvejledninger til MySQL er tilgængelige for forskellige distributioner i vores MySQL-sektion.
Forbered databasen
Du starter med at oprette en prøvedatabase, en tabel og en bruger til at få adgang til databasen. Du vil også udfylde tabellen med eksempeldata til testformål.
Oprettelse af databasen, tabellen og brugeren
-
Log ind på MySQL-serveren:
mysql -u root -p
Du bliver bedt om at indtaste root-adgangskoden til din MySQL-database. Tryk derefter på Enter for at fortsætte.
-
Dernæst vil du se en MySQL-prompt, der ligner den, der er vist nedenfor.
mysql >
-
Indtast kommandoen nedenfor for at oprette en
test_db
database:CREATE DATABASE test_db;
Output:
Query OK, 1 row affected (0.01 sec)
-
Opret en databasebruger og giv fuld adgang til
test_db
database. ErstatPASSWORD
med en kompleks og unik værdi, der følger retningslinjerne for MySQL-adgangskoder:CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';
Output:
Query OK, 1 row affected (0.01 sec)
-
Giv
test_user
fulde privilegier tiltest_db
database;GRANT ALL PRIVILEGES ON test_db.* TO 'test_user'@'localhost';
Output:
Query OK, 1 row affected (0.01 sec)
-
Skylningsrettigheder:
FLUSH PRIVILEGES;
Output:
Query OK, 0 rows affected (0.01 sec)
Udfyld databasen
-
Skift derefter til test_db-databasen:
USE test_db;
Output:
Database changed
-
Opret et
products
tabel for at gemme prøveposter:CREATE TABLE products(product_id BIGINT PRIMARY KEY, product_name VARCHAR(50), category_name VARCHAR(50) ) ENGINE=INNODB;
Output:
Query OK, 0 rows affected (0.01 sec)
-
Du kan nu tilføje et par produkter til produkttabellen ved at udføre kommandoerne nedenfor én efter én:
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');
Du bør få nedenstående output efter at have udført hver
Insert
erklæring:Query OK, 1 row affected (0.00 sec)
-
Næste. bekræft, om prøveprodukterne blev indsat i databasen, ved at køre
Select
kommando nedenfor:SELECT * FROM products;
Dine prøveprodukter skal være opført som vist nedenfor:
+------------+-----------------+----------------------+ | 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)
-
Afslut MySQL-serveren.
QUIT;
Output:
Bye!
-
Når du har oprettet en
test_db
database,products
tabel, entest_user
, og tilføjede nogle prøveprodukter, kan du nu gå videre til at oprette den første lagrede procedure.
Oprettelse af en lagret procedure
Syntaks for lagret procedure
Den grundlæggende syntaks for at oprette en lagret procedure i MySQL-databasen er vist nedenfor:
DELIMITER &&
CREATE PROCEDURE PROCEDURE_NAME (PARAMETER_1, PARAMETER_2, PARAMETER_N...)
BEGIN
[SQL STATEMENT]
END &&
DELIMITER ;
-
DELIMITER &&
linje i begyndelsen fortæller MySQL-serveren at behandle følgende SQL-sætninger som en enkelt sætning i stedet for at udføre dem individuelt. Endnu en&&
er inkluderet på en senere linje for at markere slutningen af denne erklæring. -
PROCEDURE_NAME
er hvor navnet på din lagrede procedure er deklareret. -
Procedurenavnet efterfølges af et sæt parenteser, og disse omslutter parametrene til din procedure. Lagrede procedurer understøtter kommaseparerede parametre, og denne funktion gør dem mere fleksible. Se afsnittet om parametre for flere detaljer.
-
BEGIN...END
kommandoer omslutter den SQL-sætning, som du ønsker skal udføres af den lagrede procedure. -
Til sidst, sætningen
DELIMITER ;
udstedes igen for at ændre afgrænsningstegnet tilbage til standardværdien;
Lagrede procedureparametre
Hver parameter for en procedure har en type, et navn og en datatype, adskilt af mellemrum:
PARAMETER_TYPE PARAMETER_NAME DATA_TYPE
For eksempel at oprette en parameter af typen IN
, med navnet category
, med VARCHAR
datatype, der har en længde på 50 tegn, brug denne syntaks:
IN category VARCHAR(50)
MySQL understøtter tre typer parametre:
-
IN
:Værdien af parameteren skal angives af den kaldende klient. Denne værdi kan ikke ændres af den lagrede procedure .For eksempel, hvis du sender en MySQL-sessionsvariabel som en
IN
parameter til en procedure, og proceduren ændrer denne værdi i sine udsagn, vil din sessionsvariabel forblive uændret, efter at proceduren afsluttes. -
OUT
:Denne type parameter er også specificeret af det kaldende program, men dets værdi kan ændres af den lagrede procedure og hentes af det kaldende program.Bemærk, at den lagrede procedure ikke kan få adgang til startværdien af en variabel, der sendes som en
OUT
parameter. -
INOUT
:En parameter af denne type kombinerer adfærden forIN
ogOUT
parametre:-
Den lagrede procedure kan læse startværdien af parameteren.
-
Parameteren kan ændres under udførelse af lagret procedure.
-
Den ændrede værdi kan returneres tilbage til det kaldende program, hvis det kaldende program har bestået en variabel som parameter.
-
Et eksempel på en lagret procedure
Efter at have forstået den grundlæggende syntaks, lad os oprette en simpel lagret procedure til at filtrere produkter efter kategorinavn. Kategorinavnet vil blive leveret som en IN
parameter.
-
Log ind på MySQL-serveren ved hjælp af
test_user
's legitimationsoplysninger, som du oprettede, da du forberedte databasen:mysql -u test_user -p
-
Indtast adgangskoden til
test_user
og tryk på Enter for at fortsætte. -
Du får en
mysql >
hurtig. Fortsæt ved at vælgetest_db
:USE test_db;
Output:
Database changed.
-
Indtast derefter SQL-kommandoerne nedenfor for at oprette en
filter_by_category
gemt procedure:DELIMITER && CREATE PROCEDURE filter_by_category (IN category VARCHAR(50)) BEGIN SELECT * FROM products WHERE category_name=category; END &&
Output:
Query OK, 0 rows affected (0.00 sec)
-
Skift
DELIMITER
tilbage til;
DELIMITER ;
-
Hvis koden til at oprette den lagrede procedure kørte med succes, kan du nu gå videre til at udføre den lagrede procedure.
Udførelse af en lagret procedure
I dette trin vil vi kalde den lagrede procedure, som vi oprettede ovenfor. Vi følger denne grundlæggende syntaks:
CALL PROCEDURE_NAME (COMMA-SEPARATED PARAMETER VALUES);
-
For at udføre
filter_by_category
lagret procedure, som vi oprettede ovenfor, skal du indtaste kommandoen nedenfor:CALL filter_by_category('COMPUTER ACCESSORIES');
Den lagrede procedure skulle nu udlæse alle produkter i
COMPUTER ACCESSORIES
kategori, fordi vi har specificeretCOMPUTER ACCESSORIES
som en parameter:+------------+-----------------+----------------------+ | 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)
-
På samme måde kan du hente en liste over alle produkter fra
ELECTRONICS
kategori ved at udføre kommandoen nedenfor.CALL filter_by_category('ELECTRONICS') ;
Output:
+------------+-----------------+---------------+ | 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)
Vores lagrede procedure fungerede som vi forventede. Dernæst vil vi lære, hvordan man dropper de lagrede procedurer, hvis vi ikke længere ønsker, at de skal udføres igen.
Sletning af lagrede procedurer
Du kan slette en MySQL-lagret procedure, hvis du ikke længere ønsker at bruge den, eller hvis du vil genskabe den fra bunden. Den grundlæggende syntaks for at droppe den lagrede procedure er vist nedenfor:
DROP PROCEDURE IF EXISTS PROCEDURE_NAME;
For eksempel at slette vores filter_by_category
gemt procedure, skal du udføre MySQL-kommandoen nedenfor:
DROP PROCEDURE IF EXISTS filter_by_category;
Hvis den lagrede procedure eksisterer, vil du få output vist nedenfor:
Query OK, 0 rows affected (0.00 sec)
Det er alt, når det kommer til at oprette, bruge og slette MySQL-lagrede procedurer.
Flere oplysninger
Du ønsker måske at konsultere følgende ressourcer for yderligere oplysninger om dette emne. Selvom disse leveres i håb om, at de vil være nyttige, bemærk venligst, at vi ikke kan stå inde for nøjagtigheden eller aktualiteten af eksternt hostede materialer.
- Arbejde med MySQL-lagrede procedurer