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

MySQL lagret procedure vs funktion, hvilken skulle jeg bruge hvornår?

Den mest generelle forskel mellem procedurer og funktioner er, at de påkaldes forskelligt og til forskellige formål:

  1. En procedure returnerer ikke en værdi. I stedet påkaldes den med en CALL-sætning for at udføre en handling, såsom at ændre en tabel eller behandle hentede poster.
  2. En funktion påkaldes i et udtryk og returnerer en enkelt værdi direkte til kalderen, som skal bruges i udtrykket.
  3. Du kan ikke starte en funktion med en CALL-sætning, og du kan heller ikke starte en procedure i et udtryk.

Syntaks for rutineoprettelse afviger noget for procedurer og funktioner:

  1. Procedureparametre kan defineres som kun input, kun output eller begge dele. Dette betyder, at en procedure kan sende værdier tilbage til den, der ringer, ved at bruge output-parametre. Disse værdier kan tilgås i sætninger, der følger CALL-sætningen. Funktioner har kun inputparametre. Som et resultat, selvom både procedurer og funktioner kan have parametre, adskiller procedureparametererklæringen sig fra den for funktioner.
  2. Funktioner returnerer værdi, så der skal være et RETURNS-udtryk i en funktionsdefinition for at angive datatypen for returværdien. Desuden skal der være mindst én RETURN-sætning i funktionslegemet for at returnere en værdi til den, der ringer. RETURNS og RETURN vises ikke i proceduredefinitioner.

    • For at starte en lagret procedure, brug CALL statement . For at kalde en lagret funktion henvises til den i et udtryk. Funktionen returnerer en værdi under udtryksevaluering.

    • En procedure påkaldes ved hjælp af en CALL-sætning og kan kun sende værdier tilbage ved hjælp af outputvariable. En funktion kan kaldes inde fra et udsagn ligesom enhver anden funktion (det vil sige ved at kalde funktionens navn), og kan returnere en skalarværdi.

    • Angivelse af en parameter som IN, OUT eller INOUT er kun gyldig for en PROCEDURE. For en FUNKTION betragtes parametre altid som IN-parametre.

    Hvis der ikke er angivet et nøgleord før et parameternavn, er det som standard en IN-parameter.Parametre for gemte funktioner er ikke indledt med IN, OUT eller INOUT. Alle funktionsparametre behandles som IN-parametre.

For at definere en lagret procedure eller funktion skal du bruge henholdsvis CREATE PROCEDURE eller CREATE FUNCTION:

CREATE PROCEDURE proc_name ([parameters])
 [characteristics]
 routine_body


CREATE FUNCTION func_name ([parameters])
 RETURNS data_type       // diffrent
 [characteristics]
 routine_body

En MySQL-udvidelse til lagret procedure (ikke funktioner) er, at en procedure kan generere et resultatsæt, eller endda flere resultatsæt, som den, der ringer, behandler på samme måde som resultatet af en SELECT-sætning. Indholdet af sådanne resultatsæt kan dog ikke bruges direkte i udtryk.

Gemmede rutiner (der henviser til både lagrede procedurer og lagrede funktioner) er knyttet til en bestemt database, ligesom tabeller eller visninger. Når du dropper en database, slettes alle lagrede rutiner i databasen også.

Gemrede procedurer og funktioner deler ikke det samme navneområde. Det er muligt at have en procedure og en funktion med samme navn i en database.

I lagrede procedurer kan dynamisk SQL bruges, men ikke i funktioner eller triggere.

SQL forberedte sætninger (PREPARE, EXECUTE, DEALLOCATE PREPARE) kan bruges i lagrede procedurer, men ikke lagrede funktioner eller triggere. Lagrede funktioner og triggere kan således ikke bruge Dynamic SQL (hvor du konstruerer sætninger som strenge og derefter udfører dem). (Dynamisk SQL i MySQL-lagrede rutiner )

Nogle mere interessante forskelle mellem FUNCTION og LAGET PROCEDURE:

  1. (Dette punkt er kopieret fra et blogindlæg . ) Lagret procedure er prækompileret udførelsesplan, hvor funktioner ikke er det. Funktion Parset og kompileret under kørsel. Lagrede procedurer, gemt som en pseudokode i databasen, dvs. kompileret form.

  2. (Jeg er ikke sikker på dette punkt. )
    Lagret procedure har sikkerheden og reducerer netværkstrafikken, og vi kan også kalde lagret procedure i ethvert nr. af applikationer ad gangen. reference

  3. Funktioner bruges normalt til beregninger, hvor procedurer normalt bruges til at udføre forretningslogik.

  4. Funktioner kan ikke påvirke databasens tilstand (udsagn, der gør eksplicit eller implicit commit eller rollback er ikke tilladt i funktion) Hvorimod Lagrede procedurer kan påvirke databasens tilstand ved hjælp af commit osv.
    refrence:J.1. Begrænsninger for lagrede rutiner og udløsere

  5. Funktioner kan ikke bruge FLUSH udsagn, hvorimod lagrede procedurer kan gøre det.

  6. Lagrede funktioner kan ikke være rekursive Hvorimod lagrede procedurer kan være det. Bemærk:Rekursive lagrede procedurer er deaktiveret som standard, men kan aktiveres på serveren ved at indstille max_sp_recursion_depth serversystemvariablen til en værdi, der ikke er nul. Se afsnit 5.2.3 , "Systemvariabler" , for mere information.

  7. Inden for en lagret funktion eller trigger er det ikke tilladt at ændre en tabel, der allerede bruges (til læsning eller skrivning) af den sætning, der påkaldte funktionen eller triggeren.Godt eksempel:Hvordan opdateres samme tabel ved sletning i MYSQL?

Bemærk :at selvom nogle restriktioner normalt gælder for lagrede funktioner og udløsere, men ikke for lagrede procedurer, gælder disse restriktioner for lagrede procedurer, hvis de påkaldes inde fra en lagret funktion eller trigger. For eksempel, selvom du kan bruge FLUSH i en lagret procedure, kan en sådan lagret procedure ikke kaldes fra en lagret funktion eller trigger.



  1. CHR() Funktion i Oracle

  2. Fejl 1046 Ingen database valgt, hvordan løses det?

  3. Hent alle datoer mellem to datoer i SQL Server

  4. Ufølsom søgning i Oracle