La differenza più generale tra procedure e funzioni è che vengono invocate in modo diverso e per scopi diversi:
- Una procedura non restituisce un valore. Al contrario, viene richiamato con un'istruzione CALL per eseguire un'operazione come la modifica di una tabella o l'elaborazione dei record recuperati.
- Una funzione viene invocata all'interno di un'espressione e restituisce un singolo valore direttamente al chiamante per essere utilizzata nell'espressione.
- Non è possibile richiamare una funzione con un'istruzione CALL, né è possibile richiamare una procedura in un'espressione.
La sintassi per la creazione di routine differisce leggermente per procedure e funzioni:
- I parametri della procedura possono essere definiti come solo input, solo output o entrambi. Ciò significa che una procedura può restituire 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 della procedura differisce da quella per le funzioni.
Le funzioni restituiscono un valore, quindi deve essere presente una clausola RETURN in una definizione di funzione per indicare il tipo di dati del valore restituito. Inoltre, ci deve essere almeno un'istruzione RETURN nel corpo della funzione per restituire un valore al chiamante. RESI e RESO non compaiono nelle definizioni delle procedure.
Per richiamare una procedura memorizzata, utilizzare il CALL statement
. Per invocare 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ò solo restituire valori utilizzando le 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.
La specifica di un parametro come IN, OUT o INOUT è valida solo per una PROCEDURA. Per una FUNZIONE, i parametri sono sempre considerati parametri IN.
Se non viene fornita una 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 sono trattati come parametri IN.
Per definire una procedura o 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.
Le routine memorizzate (che si riferiscono sia alle stored procedure che alle funzioni memorizzate) sono associate a un determinato database, proprio come le tabelle o le viste. Quando si elimina un database, vengono eliminate anche tutte le routine memorizzate nel database.
Le procedure e le funzioni memorizzate 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 nelle funzioni o nei trigger.
Le istruzioni preparate da SQL (PREPARE, EXECUTE, DEALLOCATE PREPARE) possono essere utilizzate nelle procedure memorizzate, ma non nelle funzioni memorizzate o nei trigger. Pertanto, le funzioni e i trigger memorizzati non possono utilizzare Dynamic SQL (dove si creano istruzioni come stringhe e quindi le si eseguono). (SQL dinamico nelle routine memorizzate MySQL)
Alcune differenze più interessanti tra FUNZIONE e PROCEDURA MEMORIZZATA:
( Questo punto viene copiato da un post di blog . ) La procedura memorizzata è un piano di esecuzione precompilato dove le funzioni non lo sono. Funzione Analizzato e compilato in fase di esecuzione. Stored procedure, memorizzate come pseudo-codice nel database, ovvero modulo compilato.
( Non sono sicuro per questo punto. )
La procedura memorizzata ha la sicurezza e riduce il traffico di rete e possiamo anche chiamare la procedura memorizzata in qualsiasi no. 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 influenzare lo stato del database (le istruzioni che eseguono il commit o il rollback esplicito o implicito non sono consentite nella funzione) Considerando che le procedure memorizzate possono influenzare lo stato del database utilizzando il commit ecc.
Refrence: J.1. Restrizioni su routine e trigger memorizzati
Le funzioni non possono usare le istruzioni FLUSH mentre le procedure memorizzate possono fare.
Le funzioni memorizzate non possono essere ricorsive Mentre le procedure memorizzate possono essere. Nota: le stored procedure 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 la Sezione 5.2.3, "Variabili di sistema" , per ulteriori informazioni.
All'interno di una funzione o trigger memorizzato, non è consentito modificare una tabella già utilizzata (per la lettura o la scrittura) dall'istruzione che ha invocato la funzione o il trigger. Buon esempio: come aggiornare la stessa tabella all'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 invocate da una funzione memorizzata o da un trigger. Ad esempio, sebbene sia possibile utilizzare FLUSH in una procedura memorizzata, tale procedura memorizzata non può essere richiamata da una funzione o da un trigger memorizzati.