sql >> Databasteknik >  >> RDS >> Mysql

MySQL lagrad procedur vs funktion, vilken skulle jag använda när?

Den mest allmänna skillnaden mellan procedurer och funktioner är att de anropas på olika sätt och för olika ändamål:

  1. En procedur returnerar inte ett värde. Istället anropas den med en CALL-sats för att utföra en operation som att modifiera en tabell eller bearbeta hämtade poster.
  2. En funktion anropas i ett uttryck och returnerar ett enstaka värde direkt till anroparen som ska användas i uttrycket.
  3. Du kan inte anropa en funktion med en CALL-sats, inte heller kan du anropa en procedur i ett uttryck.

Syntax för rutinskapande skiljer sig något för procedurer och funktioner:

  1. Procedurparametrar kan definieras som endast input, output-only eller båda. Detta innebär att en procedur kan skicka tillbaka värden till den som ringer genom att använda utdataparametrar. Dessa värden kan nås i satser som följer CALL-satsen. Funktioner har bara ingångsparametrar. Som ett resultat, även om både procedurer och funktioner kan ha parametrar, skiljer sig procedurparameterdeklarationen från den för funktioner.
  2. Funktioner returnerar värde, så det måste finnas en RETURNS-sats i en funktionsdefinition för att indikera returvärdets datatyp. Dessutom måste det finnas minst en RETURN-sats i funktionskroppen för att returnera ett värde till den som ringer. RETURNS och RETURN visas inte i procedurdefinitioner.

    • För att anropa en lagrad procedur, använd CALL statement . För att anropa en lagrad funktion, hänvisa till den i ett uttryck. Funktionen returnerar ett värde under uttrycksutvärdering.

    • En procedur anropas med en CALL-sats och kan endast skicka tillbaka värden med hjälp av utdatavariabler. En funktion kan anropas inifrån en sats precis som vilken annan funktion som helst (det vill säga genom att anropa funktionens namn), och kan returnera ett skalärt värde.

    • Att specificera en parameter som IN, OUT eller INOUT är endast giltigt för en PROCEDUR. För en FUNKTION betraktas parametrar alltid som IN-parametrar.

    Om inget nyckelord anges före ett parameternamn är det en IN-parameter som standard.Parametrar för lagrade funktioner föregås inte av IN, OUT eller INOUT. Alla funktionsparametrar behandlas som IN-parametrar.

För att definiera en lagrad procedur eller funktion, använd SKAPA PROCEDUR eller SKAPA FUNKTION:

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


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

En MySQL-tillägg för lagrad procedur (inte funktioner) är att en procedur kan generera en resultatuppsättning, eller till och med flera resultatuppsättningar, som anroparen bearbetar på samma sätt som resultatet av en SELECT-sats. Innehållet i sådana resultatuppsättningar kan dock inte användas direkt i uttryck.

Lagrade rutiner (avser både lagrade procedurer och lagrade funktioner) är associerade med en viss databas, precis som tabeller eller vyer. När du släpper en databas tas även alla lagrade rutiner i databasen bort.

Lagrade procedurer och funktioner delar inte samma namnutrymme. Det är möjligt att ha en procedur och en funktion med samma namn i en databas.

I lagrade procedurer kan dynamisk SQL användas men inte i funktioner eller utlösare.

SQL-förberedda satser (PREPARE, EXECUTE, DEALLOCATE PREPARE) kan användas i lagrade procedurer, men inte lagrade funktioner eller triggers. Således kan lagrade funktioner och triggers inte använda Dynamic SQL (där du konstruerar satser som strängar och sedan exekverar dem). (Dynamisk SQL i MySQL-lagrade rutiner )

Några mer intressanta skillnader mellan FUNCTION och LAGRAD PROCEDUR:

  1. (Denna punkt är kopierat från ett blogginlägg . )Lagrad procedur är förkompilerad exekveringsplan där funktioner inte är det. Funktion Parsad och kompilerad vid körning. Lagrade procedurer, lagras som en pseudokod i databasen, dvs kompilerad form.

  2. (Jag är inte säker på den här punkten. )
    Lagrad procedur har säkerheten och minskar nätverkstrafiken och även vi kan anropa lagrad procedur i valfritt nr. av applikationer åt gången. referens

  3. Funktioner används normalt för beräkningar där asprocedurer normalt används för att utföra affärslogik.

  4. Funktioner kan inte påverka databasens tillstånd (uttalanden som gör explicit eller implicit commit eller rollback är inte tillåtna i funktion) Medan lagrade procedurer kan påverka databasens tillstånd med commit etc.
    refrence:J.1. Begränsningar för lagrade rutiner och utlösare

  5. Funktioner kan inte använda FLUSH uttalanden medan lagrade procedurer kan göra.

  6. Lagrade funktioner kan inte vara rekursiva, medan lagrade procedurer kan vara det. Notera:Rekursiva lagrade procedurer är inaktiverade som standard, men kan aktiveras på servern genom att sätta systemvariabeln max_sp_recursion_depth till ett värde som inte är noll. Se avsnitt 5.2.3 , "Systemvariabler" , för mer information.

  7. Inom en lagrad funktion eller utlösare är det inte tillåtet att modifiera en tabell som redan används (för läsning eller skrivning) av uttalandet som anropade funktionen eller utlösaren. Bra exempel:Hur uppdaterar man samma tabell vid radering i MYSQL?

Obs :att även om vissa restriktioner normalt gäller för lagrade funktioner och utlösare men inte för lagrade procedurer, gäller dessa restriktioner för lagrade procedurer om de anropas från en lagrad funktion eller trigger. Till exempel, även om du kan använda FLUSH i en lagrad procedur, kan en sådan lagrad procedur inte anropas från en lagrad funktion eller trigger.



  1. En lösning för gränsen för åtkomst 255 kolumner

  2. Online kontra offline säkerhetskopiering

  3. Analysera JSON i TSQL

  4. Använda pseudokolumner med en länkad server