sql >> Databáze >  >> RDS >> Mysql

Uložená procedura MySQL vs funkce, kterou bych kdy použil?

Nejobecnější rozdíl mezi procedurami a funkcemi spočívá v tom, že se vyvolávají odlišně a pro různé účely:

  1. Procedura nevrací hodnotu. Místo toho je vyvolán pomocí příkazu CALL k provedení operace, jako je úprava tabulky nebo zpracování načtených záznamů.
  2. Funkce je vyvolána ve výrazu a vrací jednu hodnotu přímo volajícímu, která se má použít ve výrazu.
  3. Nemůžete vyvolat funkci pomocí příkazu CALL ani nemůžete vyvolat proceduru ve výrazu.

Syntaxe pro vytváření rutin se u procedur a funkcí poněkud liší:

  1. Parametry procedury lze definovat jako pouze vstup, pouze výstup nebo obojí. To znamená, že procedura může předávat hodnoty zpět volajícímu pomocí výstupních parametrů. K těmto hodnotám lze přistupovat v příkazech, které následují po příkazu CALL. Funkce mají pouze vstupní parametry. V důsledku toho, i když procedury i funkce mohou mít parametry, deklarace parametrů procedury se liší od deklarace pro funkce.
  2. Funkce vrací hodnotu, takže v definici funkce musí být klauzule RETURNS, která označuje datový typ vrácené hodnoty. V těle funkce také musí být alespoň jeden příkaz RETURN, aby se volajícímu vrátila hodnota. RETURNS a RETURN se v definicích procedur neobjevují.

    • Chcete-li vyvolat uloženou proceduru, použijte CALL statement . Chcete-li vyvolat uloženou funkci, odkazujte na ni ve výrazu. Funkce vrací hodnotu během vyhodnocování výrazu.

    • Procedura je vyvolána pomocí příkazu CALL a může předávat zpět hodnoty pouze pomocí výstupních proměnných. Funkci lze volat zevnitř příkazu stejně jako kteroukoli jinou funkci (tj. vyvoláním názvu funkce) a může vrátit skalární hodnotu.

    • Zadání parametru jako IN, OUT nebo INOUT je platné pouze pro PROCEDURE. U FUNKCE jsou parametry vždy považovány za IN parametry.

    Pokud před názvem parametru není uvedeno žádné klíčové slovo, je to ve výchozím nastavení parametr IN.Parametrům pro uložené funkce nepředchází IN, OUT nebo INOUT. Všechny parametry funkcí jsou považovány za parametry IN.

Chcete-li definovat uloženou proceduru nebo funkci, použijte CREATE PROCEDURE nebo CREATE FUNCTION:

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


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

Rozšíření MySQL pro uloženou proceduru (nikoli funkce) spočívá v tom, že procedura může generovat sadu výsledků nebo dokonce více sad výsledků, které volající zpracuje stejným způsobem jako výsledek příkazu SELECT. Obsah těchto sad výsledků však nelze použít přímo ve výrazu.

Uložené rutiny (s odkazem na uložené procedury i uložené funkce) jsou spojeny s konkrétní databází, stejně jako tabulky nebo pohledy. Když zrušíte databázi, všechny uložené rutiny v databázi budou také zrušeny.

Uložené procedury a funkce nesdílejí stejný jmenný prostor. V databázi je možné mít proceduru a funkci se stejným názvem.

V uložených procedurách lze dynamické SQL použít, ale ne ve funkcích nebo spouštěčích.

Připravené příkazy SQL (PREPARE, EXECUTE, DEALLOCATE PREPARE) lze použít v uložených procedurách, nikoli však uložené funkce nebo spouštěče. Uložené funkce a spouštěče tedy nemohou používat dynamický SQL (kde vytváříte příkazy jako řetězce a poté je spouštíte). (Dynamické SQL v uložených rutinách MySQL )

Několik dalších zajímavých rozdílů mezi FUNKCÍ a ULOŽENÝM POSTUPEM:

  1. (Tento bod je zkopírováno z blogového příspěvku . )Uložená procedura je předkompilovaný plán provádění, kde funkce nejsou. Funkce analyzována a zkompilována za běhu. Uložené procedury, uložené jako pseudokód v databázi, tj. kompilovaná forma.

  2. (V tomto bodě si nejsem jistý. )
    Uložená procedura má zabezpečení a snižuje síťový provoz a také můžeme volat uloženou proceduru v libovolném čísle. aplikací najednou. odkaz

  3. Funkce se běžně používají pro výpočty, kde se pro provádění obchodní logiky běžně používají postupy.

  4. Funkce Nemohou ovlivnit stav databáze (Příkazy, které provádějí explicitní nebo implicitní odevzdání nebo vrácení zpět, jsou ve funkci zakázány) Kdežto Uložené procedury Mohou ovlivnit stav databáze pomocí odevzdání atd.
    refence:J.1. Omezení uložených rutin a spouštěčů

  5. Funkce nemohou používat FLUSH příkazy, zatímco uložené procedury ano.

  6. Uložené funkce nemohou být rekurzivní, zatímco uložené procedury ano. Poznámka:Rekurzivní uložené procedury jsou ve výchozím nastavení zakázány, ale lze je povolit na serveru nastavením systémové proměnné serveru max_sp_recursion_depth na nenulovou hodnotu. Viz Oddíl 5.2.3 , „Systémové proměnné“ , pro více informací.

  7. V rámci uložené funkce nebo spouštěče není povoleno upravovat tabulku, která se již používá (pro čtení nebo zápis) příkazem, který funkci nebo spouštěč vyvolal. Dobrý Příklad:Jak aktualizovat stejnou tabulku při odstranění v MYSQL?

Poznámka :že ačkoli se některá omezení normálně vztahují na uložené funkce a spouštěče, ale ne na uložené procedury, tato omezení se vztahují na uložené procedury, pokud jsou vyvolány z uložené funkce nebo spouštěče. Ačkoli například můžete použít FLUSH v uložené proceduře, takovou uloženou proceduru nelze volat z uložené funkce nebo spouštěče.



  1. Převedení řetězce odděleného čárkami na jednotlivé řádky

  2. SQL, při kaskádě odstranění a při kaskádě aktualizace

  3. 2 způsoby, jak zjistit, zda se v instanci serveru SQL Server stále používají zastaralé funkce

  4. postgresql:datový typ pro md5 message digest?