sql >> Database >  >> RDS >> Mysql

MySQL-opgeslagen procedure versus functie, welke zou ik wanneer gebruiken?

Het meest algemene verschil tussen procedures en functies is dat ze anders en voor verschillende doeleinden worden aangeroepen:

  1. Een procedure retourneert geen waarde. In plaats daarvan wordt het aangeroepen met een CALL-instructie om een ​​bewerking uit te voeren, zoals het wijzigen van een tabel of het verwerken van opgehaalde records.
  2. Een functie wordt aangeroepen binnen een uitdrukking en retourneert een enkele waarde rechtstreeks naar de aanroeper die in de uitdrukking moet worden gebruikt.
  3. U kunt geen functie aanroepen met een CALL-instructie, noch kunt u een procedure in een expressie aanroepen.

Syntaxis voor het maken van routines verschilt enigszins voor procedures en functies:

  1. Procedureparameters kunnen worden gedefinieerd als alleen invoer, alleen uitvoer of beide. Dit betekent dat een procedure waarden kan teruggeven aan de beller met behulp van uitvoerparameters. Deze waarden zijn toegankelijk in instructies die volgen op de CALL-instructie. Functies hebben alleen invoerparameters. Als resultaat, hoewel zowel procedures als functies parameters kunnen hebben, verschilt de declaratie van procedureparameters van die voor functies.
  2. Functies retourneren waarde, dus er moet een RETURNS-clausule in een functiedefinitie zijn om het gegevenstype van de geretourneerde waarde aan te geven. Er moet ook ten minste één RETURN-instructie in de hoofdtekst van de functie zijn om een ​​waarde naar de aanroeper te retourneren. RETURNS en RETURN verschijnen niet in proceduredefinities.

    • Om een ​​opgeslagen procedure aan te roepen, gebruikt u de CALL statement . Om een ​​opgeslagen functie aan te roepen, moet u ernaar verwijzen in een expressie. De functie retourneert een waarde tijdens de evaluatie van de expressie.

    • Een procedure wordt aangeroepen met behulp van een CALL-instructie en kan alleen waarden teruggeven met behulp van uitvoervariabelen. Een functie kan net als elke andere functie vanuit een instructie worden aangeroepen (dat wil zeggen, door de naam van de functie aan te roepen) en kan een scalaire waarde retourneren.

    • Het specificeren van een parameter als IN, OUT of INOUT is alleen geldig voor een PROCEDURE. Voor een FUNCTIE worden parameters altijd als IN-parameters beschouwd.

    Als er geen trefwoord voor een parameternaam wordt gegeven, is het standaard een IN-parameter.Parameters voor opgeslagen functies worden niet voorafgegaan door IN, OUT of INOUT. Alle functieparameters worden behandeld als IN-parameters.

Om een ​​opgeslagen procedure of functie te definiëren, gebruik respectievelijk CREATE PROCEDURE of CREATE FUNCTION:

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


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

Een MySQL-extensie voor opgeslagen procedures (geen functies) is dat een procedure een resultaatset kan genereren, of zelfs meerdere resultaatsets, die de aanroeper op dezelfde manier verwerkt als het resultaat van een SELECT-instructie. De inhoud van dergelijke resultatensets kan echter niet rechtstreeks in expressie worden gebruikt.

Opgeslagen routines (verwijzend naar zowel opgeslagen procedures als opgeslagen functies) zijn gekoppeld aan een bepaalde database, net als tabellen of weergaven. Wanneer u een database verwijdert, worden alle opgeslagen routines in de database ook verwijderd.

Opgeslagen procedures en functies delen niet dezelfde naamruimte. Het is mogelijk om een ​​procedure en een functie met dezelfde naam in een database te hebben.

In Opgeslagen procedures kan dynamische SQL worden gebruikt, maar niet in functies of triggers.

Door SQL voorbereide instructies (PREPARE, EXECUTE, DEALLOCATE PREPARE) kunnen worden gebruikt in opgeslagen procedures, maar niet in opgeslagen functies of triggers. Opgeslagen functies en triggers kunnen dus geen dynamische SQL gebruiken (waarbij u instructies als tekenreeksen construeert en ze vervolgens uitvoert). (Dynamische SQL in MySQL opgeslagen routines )

Enkele meer interessante verschillen tussen FUNCTIE en OPGESLAGEN PROCEDURE:

  1. (Dit punt is gekopieerd van een blogpost . ) Opgeslagen procedure is een voorgecompileerd uitvoeringsplan waar de functies dat niet zijn. Functie Geparseerd en gecompileerd tijdens runtime. Opgeslagen procedures, opgeslagen als pseudo-code in database, d.w.z. gecompileerde vorm.

  2. (Ik weet het niet zeker. )
    Opgeslagen procedure heeft de veiligheid en vermindert het netwerkverkeer en we kunnen ook opgeslagen procedure in elk nummer noemen. toepassingen tegelijk. referentie

  3. Functies worden normaal gesproken gebruikt voor berekeningen waar a-procedures normaal worden gebruikt voor het uitvoeren van bedrijfslogica.

  4. Functies kunnen de status van de database niet beïnvloeden (statements die een expliciete of impliciete commit of rollback doen, zijn niet toegestaan ​​in de functie) Terwijl opgeslagen procedures de status van de database kunnen beïnvloeden met behulp van commit enz.
    referentie:J.1. Beperkingen op opgeslagen routines en triggers

  5. Functies kunnen FLUSH niet gebruiken verklaringen, terwijl opgeslagen procedures dat kunnen.

  6. Opgeslagen functies kunnen niet recursief zijn, terwijl opgeslagen procedures dat wel kunnen zijn. Opmerking:recursieve opgeslagen procedures zijn standaard uitgeschakeld, maar kunnen op de server worden ingeschakeld door de serversysteemvariabele max_sp_recursion_depth in te stellen op een waarde die niet nul is. Zie Sectie 5.2.3 , “Systeemvariabelen” , voor meer informatie.

  7. Binnen een opgeslagen functie of trigger is het niet toegestaan ​​om een ​​tabel die al in gebruik is (voor lezen of schrijven) te wijzigen door de instructie die de functie of trigger heeft aangeroepen. Goed voorbeeld:Hoe kan ik dezelfde tabel bijwerken bij verwijdering in MYSQL?

Opmerking :dat hoewel sommige beperkingen normaal van toepassing zijn op opgeslagen functies en triggers, maar niet op opgeslagen procedures, die beperkingen wel van toepassing zijn op opgeslagen procedures als ze worden aangeroepen vanuit een opgeslagen functie of trigger. Hoewel u bijvoorbeeld FLUSH kunt gebruiken in een opgeslagen procedure, kan een dergelijke opgeslagen procedure niet worden aangeroepen vanuit een opgeslagen functie of trigger.



  1. Behoud regelonderbrekingen van TextArea bij schrijven naar MySQL

  2. 2 manieren om te controleren of gegevenstoegang is ingeschakeld in SQL Server (T-SQL-voorbeelden)

  3. SQL Server genoemd exemplaar met Visual Studio 2017 Installer-project

  4. Voorbeeld van sys.dm_sql_referenced_entities() van SQL Server die een entiteit retourneert die verwijst naar een gekoppelde server