La differenza più generale tra procedure e funzioni è che vengono invocate in modo diverso e per scopi diversi:
- Una procedura non restituisce un valore. Viene invece invocato con un'istruzione CALL per eseguire un'operazione come la modifica di una tabella o l'elaborazione di record recuperati.
- Una funzione viene richiamata all'interno di un'espressione e restituisce un singolo valore direttamente al chiamante da utilizzare nell'espressione.
- Non puoi invocare una funzione con un'istruzione CALL, né puoi invocare una procedura in un'espressione.
La sintassi per la creazione di routine è leggermente diversa per le procedure e le funzioni:
- I parametri di procedura possono essere definiti come solo input, solo output o entrambi. Ciò significa che una procedura può restituire i valori al chiamante utilizzando i parametri di output. È possibile accedere a questi valori nelle istruzioni che seguono l'istruzione CALL. Le funzioni hanno solo parametri di input. Di conseguenza, sebbene sia le procedure che le funzioni possano avere parametri, la dichiarazione dei parametri delle procedure è diversa da quella per le funzioni.
-
Le funzioni restituiscono il valore, quindi deve esserci una clausola RETURNS in una definizione di funzione per indicare il tipo di dati del valore restituito. Inoltre, deve essere presente almeno un'istruzione RETURN all'interno del corpo della funzione per restituire un valore al chiamante. RETURNS e RETURN non compaiono nelle definizioni della procedura.
-
Per richiamare una procedura memorizzata, utilizzare l'
CALL statement
. Per richiamare una funzione memorizzata, fare riferimento ad essa in un'espressione. La funzione restituisce un valore durante la valutazione dell'espressione. -
Una procedura viene richiamata utilizzando un'istruzione CALL e può restituire valori solo utilizzando variabili di output. Una funzione può essere chiamata dall'interno di un'istruzione proprio come qualsiasi altra funzione (ovvero invocando il nome della funzione) e può restituire un valore scalare.
-
Specificare un parametro come IN, OUT o INOUT è valido solo per una PROCEDURA. Per una FUNCTION, i parametri sono sempre considerati parametri IN.
Se non viene fornita alcuna parola chiave prima del nome di un parametro, per impostazione predefinita è un parametro IN.I parametri per le funzioni memorizzate non sono preceduti da IN, OUT o INOUT. Tutti i parametri di funzione vengono trattati come parametri IN.
-
Per definire una procedura o una funzione memorizzata, utilizzare rispettivamente CREATE PROCEDURE o CREATE FUNCTION:
CREATE PROCEDURE proc_name ([parameters])
[characteristics]
routine_body
CREATE FUNCTION func_name ([parameters])
RETURNS data_type // diffrent
[characteristics]
routine_body
Un'estensione MySQL per stored procedure (non funzioni) è che una procedura può generare un set di risultati, o anche più set di risultati, che il chiamante elabora allo stesso modo del risultato di un'istruzione SELECT. Tuttavia, il contenuto di tali set di risultati non può essere utilizzato direttamente nell'espressione.
Routine memorizzate (riferiti sia alle stored procedure che alle funzioni memorizzate) sono associati a un particolare database, proprio come le tabelle o le viste. Quando si elimina un database, vengono eliminate anche tutte le routine memorizzate nel database.
Le stored procedure e le funzioni non condividono lo stesso spazio dei nomi. È possibile avere una procedura e una funzione con lo stesso nome in un database.
Nelle stored procedure è possibile utilizzare SQL dinamico ma non in funzioni o trigger.
Le istruzioni preparate SQL (PREPARE, EXECUTE, DEALLOCATE PREPARE) possono essere utilizzate nelle procedure memorizzate, ma non nelle funzioni o nei trigger memorizzati. Pertanto, le funzioni e i trigger archiviati non possono utilizzare Dynamic SQL (in cui si costruiscono istruzioni come stringhe e quindi le si esegue). (SQL dinamico nelle routine memorizzate in MySQL )
Alcune differenze più interessanti tra FUNZIONE e PROCEDURA MEMORIZZATA:
-
(Questo punto è copiato da un post del blog . )La stored procedure è un piano di esecuzione precompilato dove le funzioni non lo sono. Funzione Analizzata e compilata in fase di esecuzione. Procedure memorizzate, memorizzate come pseudo-codice nel database, ovvero in forma compilata.
-
(Non sono sicuro di questo punto. )
Stored procedure ha la sicurezza e riduce il traffico di rete e inoltre possiamo chiamare stored procedure in qualsiasi n. di applicazioni alla volta. riferimento -
Le funzioni vengono normalmente utilizzate per i calcoli in cui le procedure vengono normalmente utilizzate per eseguire la logica aziendale.
-
Le funzioni non possono influire sullo stato del database (le istruzioni che eseguono commit o rollback espliciti o impliciti non sono consentite nella funzione) considerando che le procedure memorizzate possono influire sullo stato del database utilizzando commit ecc.
refrence:J.1. Restrizioni su routine e trigger memorizzati -
Le funzioni non possono utilizzare FLUSH dichiarazioni mentre le stored procedure possono fare.
-
Le funzioni memorizzate non possono essere ricorsive mentre le procedure memorizzate possono esserlo. Nota:le procedure memorizzate ricorsive sono disabilitate per impostazione predefinita, ma possono essere abilitate sul server impostando la variabile di sistema del server max_sp_recursion_depth su un valore diverso da zero. Vedere Sezione 5.2.3 , "Variabili di sistema" , per ulteriori informazioni.
-
All'interno di una funzione o di un trigger memorizzati, non è consentito modificare una tabella che è già utilizzata (per la lettura o la scrittura) dall'istruzione che ha richiamato la funzione o il trigger. Buon esempio:Come aggiornare la stessa tabella in caso di eliminazione in MYSQL?
Nota :sebbene alcune restrizioni si applichino normalmente alle funzioni e ai trigger memorizzati, ma non alle procedure memorizzate, tali restrizioni si applicano alle procedure memorizzate se vengono richiamate dall'interno di una funzione o di un trigger memorizzati. Ad esempio, sebbene sia possibile utilizzare FLUSH in una procedura memorizzata, tale procedura memorizzata non può essere chiamata da una funzione o un trigger memorizzati.