sql >> Database teknologi >  >> RDS >> Mysql

Oprettelse og brug af MySQL Stored Procedures - En vejledning

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:

  1. 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.

  2. 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.

  3. 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

  1. 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.

  2. Dernæst vil du se en MySQL-prompt, der ligner den, der er vist nedenfor.

    mysql > 
  3. Indtast kommandoen nedenfor for at oprette en test_db database:

    CREATE DATABASE test_db;
     

    Output:

    Query OK, 1 row affected (0.01 sec) 
  4. Opret en databasebruger og giv fuld adgang til test_db database. Erstat PASSWORD 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) 
  5. Giv test_user fulde privilegier til test_db database;

    GRANT ALL PRIVILEGES ON test_db.* TO 'test_user'@'localhost';
     

    Output:

    Query OK, 1 row affected (0.01 sec) 
  6. Skylningsrettigheder:

    FLUSH PRIVILEGES;
     

    Output:

    Query OK, 0 rows affected (0.01 sec) 

Udfyld databasen

  1. Skift derefter til test_db-databasen:

    USE test_db;
     

    Output:

    Database changed 
  2. 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) 
  3. 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) 
  4. 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)
  5. Afslut MySQL-serveren.

    QUIT;
     

    Output:

    Bye! 
  6. Når du har oprettet en test_db database, products tabel, en test_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 for IN og OUT 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.

  1. 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
     
  2. Indtast adgangskoden til test_user og tryk på Enter for at fortsætte.

  3. Du får en mysql > hurtig. Fortsæt ved at vælge test_db :

     USE test_db;
     

    Output:

    Database changed. 
  4. 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) 
  5. Skift DELIMITER tilbage til ;

    DELIMITER ; 
  6. 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 specificeret COMPUTER 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

  1. Hvordan kan jeg se, om jeg har uforpligtende arbejde i en Oracle-transaktion?

  2. Selvprovisionering af brugerkonti i PostgreSQL via uprivilegeret anonym adgang

  3. Gratis felthospitalsdatabase til at bekæmpe COVID-19-pandemien

  4. Hvad er de 6 hovedkomponenter i Microsoft Access?