MySQL stored procedure vs function, che dovrei usare quando?


160

Sto esaminando le procedure e le funzioni memorizzate di MySQL. Qual è la vera differenza?

Sembrano essere simili, ma una funzione ha più limitazioni.

Probabilmente sbaglio, ma sembra che una procedura memorizzata possa fare tutto e più una funzione memorizzata può fare. Perché / quando dovrei usare una procedura contro una funzione?

Risposte:


101

Non è possibile combinare le stored procedure con SQL ordinario, mentre con le funzioni memorizzate è possibile.

es. SELECT get_foo(myColumn) FROM mytablenon è valido se get_foo()è una procedura, ma puoi farlo se get_foo()è una funzione. Il prezzo è che le funzioni hanno più limiti di una procedura.


18
Che tipo di limitazioni hanno le funzioni?
Fanzio,

11
Ah, ho trovato alcune buone informazioni qui: dev.mysql.com/doc/refman/5.0/en/…
Fantius

262

La differenza più generale tra procedure e funzioni è che vengono invocate in modo diverso e per scopi diversi:

  1. 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.
  2. Una funzione viene invocata all'interno di un'espressione e restituisce un singolo valore direttamente al chiamante per essere utilizzata nell'espressione.
  3. 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:

  1. 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.
  2. 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:

  1. ( 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.

  2. ( 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

  3. Le funzioni vengono normalmente utilizzate per i calcoli in cui le procedure vengono normalmente utilizzate per eseguire la logica aziendale.

  4. 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

  5. Le funzioni non possono usare le istruzioni FLUSH mentre le procedure memorizzate possono fare.

  6. 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.

  7. 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.


2
@GrijeshChauhan, cosa intendi quando dici che "Funzione analizzata e compilata in fase di esecuzione" ?
Pacerier,

@Pacerier significa che le funzioni in MySQL sono qualcosa di simile agli script compilati ed eseguiti al volo. L'ho copiato da qualche post sul blog , ma non ho eseguito alcuna pratica per ispezionare questi comportamenti.
Grijesh Chauhan,

Nelle procedure puoi passare una variabile out come parametro, quindi chiamarla con un'istruzione select
LTroya

1
bullet point # 4 nella parte inferiore di questa risposta è, credo, il nucleo della differenza tra procedure e funzioni. le procedure possono cambiare il database, le funzioni no. tutte le altre differenze servono solo a servire questo scopo in modo più efficace.
Woodrow Barlow,

51

Una differenza significativa è che puoi includere una funzione nelle tue query SQL, ma le procedure memorizzate possono essere invocate solo con l' CALListruzione:

Esempio UDF:

CREATE FUNCTION hello (s CHAR(20))
   RETURNS CHAR(50) DETERMINISTIC
   RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)

CREATE TABLE names (id int, name varchar(20));
INSERT INTO names VALUES (1, 'Bob');
INSERT INTO names VALUES (2, 'John');
INSERT INTO names VALUES (3, 'Paul');

SELECT hello(name) FROM names;
+--------------+
| hello(name)  |
+--------------+
| Hello, Bob!  |
| Hello, John! |
| Hello, Paul! |
+--------------+
3 rows in set (0.00 sec)

Esempio Sproc:

delimiter //

CREATE PROCEDURE simpleproc (IN s CHAR(100))
BEGIN
   SELECT CONCAT('Hello, ', s, '!');
END//
Query OK, 0 rows affected (0.00 sec)

delimiter ;

CALL simpleproc('World');
+---------------------------+
| CONCAT('Hello, ', s, '!') |
+---------------------------+
| Hello, World!             |
+---------------------------+
1 row in set (0.00 sec)

1
La tua funzione ha due ritorni ? Voglio dire che cos'è questa linea? RETURNS CHAR(50) DETERMINISTIC?
Martin AJ,

Gli RETURNS CHAR(50)stati quale tipo di dati saranno restituiti. Sono RETURN CONCAT(...i dati che vengono restituiti. Entrambi sono necessari. La DETERMINISTICè necessaria per affermare che i dati sottostanti non verranno modificati.
lemming622,

8

Una funzione memorizzata può essere utilizzata all'interno di una query. È quindi possibile applicarlo a ogni riga o all'interno di una clausola WHERE.

Una procedura viene eseguita utilizzando la query CALL.


0

La procedura memorizzata può essere chiamata in modo ricorsivo ma la funzione memorizzata non può

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.