Als uw SQL business logica steeds complexer wordt, merkt u dat men herhaaldelijk blokken van SQL-statements schrijft om dezelfde database bewerking uit te voeren op applicatieniveau, bijvoorbeeld het invoegen van een set van gekoppelde records of het uitvoeren van berekeningen op een bepaalde resultaat set. In deze situaties heeft het meestal maakt zin om dit blok SQL code veranderen in een herbruikbare routine, die zich op de databaseserver (in plaats van de toepassing) bevind, zodat deze onafhankelijk kunnen worden beheerd en aangeroepen worden als dat nodig is in verschillende modules van de toepassing .
Stored routines laten te dat ontwikkelaars een aantal van die business logica van de applicatie over te dragen aan de database server, waardoor men kan profiteren van meer veiligheid en consistentie.
4 belangrijke voordelen
- Een opgeslagen routine wordt bijgehouden op de databaseserver, in plaats van in de toepassing. Voor toepassingen op basis van een client-server-architectuur, het aanroepen van een opgeslagen routine is sneller en vereist minder bandbreedte dan het verzenden van een hele reeks van SQL-statements en het nemen van beslissingen over het resultaat sets. Opgeslagen routines verminderen ook code duplicatie doordat ontwikkelaars om veelgebruikte SQL-bewerkingen uit te pakken in een enkel component. Het eindresultaat is dat applicatiecode efficiënter, kleinere en beter leesbaar.
- Een opgeslagen routine wordt eenmaal opgemaakt, maar wordt vele malen hergebruikt, vaak uit meer dan één programma. Als de routine verandert, worden de wijzigingen doorgevoerd op één plek (de routine definition), terwijl de routineaanroepen onaangeroerd blijven. Dit feit kan het vereenvoudigen van code het onderhoud en upgrades aanzienlijk verbeteren. Het debuggen en testen van een applicatie wordt ook makkelijker, fouten kunnen worden opgespoord en gecorrigeerd met een minimale impact op de applicatie code.
- Het implementeren van database bewerkingen zoals opgeslagen routines kan de beveiliging van een toepassing aanzienlijk verbeteren, omdat programmamodules toegang tot bepaalde tabellen kunnen worden ontzegd en alleen toegang tot de routines verlenen die deze tabellen manipuleren. Dit zorgt niet alleen voor dat een applicatie alleen ziet de gegevens ziet die het nodig heeft, maar zorgt er ook voor een consequente uitvoering van specifieke taken of submodules over de aanvraag (omdat alle applicatiemodules gebruik maken van dezelfde opgeslagen routines in plaats van te proberen de tabellen direct te manipuleren).
- Het gebruiken van opgeslagen routines stimuleert het abstract denken, omdat het verpakken SQL-bewerkingen in een opgeslagen routine niets anders is dan het begrijpen hoe een bepaalde taak kan worden ingekapseld in een generiek component. In die zin, bevordert het gebruik van opgeslagen routines de vorming van meer robuuste en uitbreidbare applicatie architectuur.
Het is het vermelden waard dat in de MySQL wereld, de term “opgeslagen routines” generiek gebruikt om te verwijzen naar twee verschillende soorten: opgeslagen procedures en opgeslagen functies. Hoewel beide typen routines SQL statements bevatten, legt MySQL een aantal belangrijke beperkingen op aan opgeslagen functies die niet gelden voor een opgeslagen procedures:Opgeslagen functies kunnen geen gebruik maken van SQL-statements die een resultaatset retourneert.Opgeslagen functies kunnen geen gebruik maken van SQL-statements die transacties doorvoert of terugdraait.Opgeslagen functies kunnen zichzelf niet oproepen.Opgeslagen functies moeten een retourwaarde geven.
Opmerking: Opgeslagen routines, hoewel nuttig, zijn nog niet volledig geoptimaliseerd in MySQL 5.x Daarom, moet men zo veel als mogelijk voorkomen dat men gebruik maakt van complexe opgeslagen routines in MySQL. Dit omdat ze de overhead aanzienlijk kunnen verhogen. Het ontbreken van een volledig geoptimaliseerde cache of debuggingtools voor opgeslagen routines zijn ook een belemmering voor gebruikers en ontwikkelaars.
Stored Procedure | Function (UDF – User Defined Function) |
Een SP hoeft geen waarde. | Een functie is verplicht een enkele waarde te retourneren. |
Er kan gebruik gemaakt worden van transacties in SP. | Er kan geen gebruik gemaakt worden van transacties in UDF. |
SP kan in- en uitvoer parameters bevatten. | Een UDF kan enkel een invoer parameter bevatten. |
Er kan functie opgeroepen worden vanuit een SP. | Er kan geen SP opgeroepen worden vanuit een functie. |
Er kan geen SP gebruikt worden in een SELECT/WHERE/HAVING statement. | Er kan UDF gebruikt worden in een SELECT/WHERE/HAVING statement. |
Er kan gebruik gemaakt worden van exception handling door middel van een Try-Catch block in SP. | Er kan geen gebruik gemaakt worden van een Try-Catch block in UDF. |