it-swarm.it

Quali sono le differenze tra "Stored Procedures" e "Stored Functions"?

Quindi un commento di questa domanda menziona che c'è una leggera differenza in "Stored Procedrues" e "Stored Funtions" in PostgreSQL.

Il commento si collega a un articolo di Wikipedia ma alcuni di questi non sembrano applicarsi (ad es. Che possono essere usati in un'istruzione SELECT).

La sintassi stessa sembra essere un po 'confusa:

CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$
    BEGIN
       [...]
    END;
$emp_stamp$ LANGUAGE plpgsql;

CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
    FOR EACH ROW EXECUTE PROCEDURE emp_stamp();

Si crea un FUNCTION ma si fa riferimento ad esso come un PROCEDURE.

Quindi qual è la differenza tra questi due?

37
DrColossos

Ufficialmente PostgreSQL ha solo "funzioni". Le funzioni di trigger vengono talvolta definite "procedure di trigger", ma l'utilizzo non ha un significato distinto. Internamente, le funzioni vengono talvolta definite procedure, ad esempio nel catalogo di sistema pg_proc. Questo è un holdover da PostQUEL. Qualsiasi caratteristica che alcune persone (possibilmente con esperienza in diversi sistemi di database) potrebbero associare a procedure, come la loro rilevanza nel prevenire iniezioni di SQL o l'uso di parametri di output, si applicano anche alle funzioni esistenti in PostgreSQL.

Ora, quando le persone nella comunità PostgreSQL parlano di "procedure memorizzate" o di "procedure memorizzate reali", tuttavia, spesso significano una caratteristica ipotetica di un oggetto simile a una funzione che può avviare e arrestare le transazioni nel suo corpo, qualcosa che le funzioni attuali non possono fare. L'uso del termine "stored procedure" in questo contesto sembra essere per analogia con altri prodotti di database. Vedi questa mailing list thread per una vaga idea.

In pratica, tuttavia, questa distinzione tra funzione e procedura in termini di capacità di controllo delle transazioni non è universalmente accettata, e certamente molti programmatori senza distorsioni del database prenderanno un'interpretazione simile a Pascal di una procedura come funzione senza valore di ritorno. (Lo standard SQL sembra prendere una via di mezzo, in quanto una procedura di default ha un comportamento di transazione diverso rispetto a una funzione, ma questo può essere regolato per ). Quindi, in ogni caso, e specialmente quando guardi le domande su Stack Exchange con un pubblico molto misto, dovresti evitare di assumere troppo e usare termini più chiari o definire le proprietà che ti aspetti.

44
Peter Eisentraut

In termini di DDL, Postgres non ha oggetti procedura, ma solo funzioni. Le funzioni di Postgres possono restituire valore (i) o nullo in modo che assumano ruoli sia di funzioni che di procedure in altri RDBMS. La parola "procedura" nel create trigger si riferisce a una funzione.

In termini di documentazione di Postgres, "procedura" è anche sinonimo dell'oggetto database chiamato funzione, ad es. " Viene creata una procedura trigger con il comando CREATE FUNCTION ".

Le "procedure" dei trigger hanno regole particolari: devono essere dichiarate come una funzione senza argomenti e un tipo di trigger di ritorno . Esempio qui .

I termini "procedura memorizzata" e "funzione memorizzata" sono usati in modo intercambiabile in PostgreSQL e generalmente sono considerati la stessa cosa. Altri database possono distinguere tra una procedura e una funzione (proprio come how VB distingue tra subroutine e funzioni).

Finché una funzione in PostgreSQL restituisce qualcosa che assomiglia a una tabella, puoi usare l'output di quella funzione come se fosse una tabella standard. Il CREATE TRIGGER la sintassi è un po 'confusa, ma sospetto che potrebbe essere stata in atto prima della finalizzazione dello standard ANSI. Ho solo una copia di SQL: 2003, quindi non posso fare molto di più che ipotizzare perché la nomenclatura sia strana.

TL; versione DR: con PostgreSQL "procedura" equivale a "funzione".

8
Jeremiah Peschka

In MSSQL, una procedura memorizzata è un set precompilato di comandi sql.
Una procedura memorizzata:

 - può avere molti parametri di input e output 
 - può essere usato per modificare tabelle/strutture/dati di database 
 - non sono normalmente usati all'interno di istruzioni insert/update/delete/select 
 - può avere più parametri di input, ma restituisce solo un singolo valore (es. concatenazione di stringhe) 
 - può accettare un set come input, restituisce un singolo valore (es. dbo.FindLargestPig (ListOfPigs)) 
 - restituisce una tabella (cioè seleziona * da dbo.ExplodeString ("questo è un elenco di parole")) 
 - può essere usato nelle istruzioni select/insert/update/delete 
 - NON PU be essere utilizzato per modificare tabelle/strutture/dati di database 
6
datagod

La risposta breve è che una funzione restituisce un valore, ma una procedura no.

Tale distinzione era presente nei moduli memorizzati persistenti (SQL/PSM), proposti per SQL 1992. Non so se SQL/PSM sia mai diventato standard.

Confrontando la risposta accettata dal livello concettuale astratto, capisco la differenza tra funzionalità e prospettiva di input/output. Di seguito ho usato sp e f per rappresentare rispettivamente la procedura e la funzione memorizzate.

  1. Usa in un'espressione: sp non può essere usato in un'espressione mentre la funzione può, il che significa che puoi usare il tuo valore restituito da una f all'interno di altre istruzioni, come

    select * 
    from table 
    where col_a < (select col_A from f())
    
  2. restituisce un valore: sp non restituisce automaticamente un valore a meno che non specifichi refcursor tipo di ritorno, apri e ritorni un cursore; f restituisce il risultato nell'ultima istruzione in cui è incorporata una clausola 'return', come una clausola select select .

  3. restituisce set di risultati singoli/multipli: qui i set di risultati fanno riferimento a un elenco di risultati che possono differire nel formato, come set di numeri interi singoli, array di testo e due tabelle. sp può restituire più set purché si specifichi il tipo di ritorno del cursore, aprire e restituire un cursore. Tuttavia, f può restituire solo un tipo di set.

Di solito, le procedure memorizzate vengono utilizzate per modificare i dati o la struttura del database in cui non è necessario il valore restituito, come elimina, aggiorna, elimina , ecc .; o situazioni in cui sono richiesti più set di risultati. La funzione, d'altra parte, è principalmente scelta per semplici query.

Per maggiori dettagli sulla mia spiegazione, si prega di fare riferimento a questo link: Stored Procedures and Functions in PostgreSQL

2
Frank

Si noti che in PostgreSQL 11, le procedure memorizzate sono state aggiunte come nuovo oggetto schema. È possibile creare un nuovo procudure utilizzando CREATE PROCEDURE istruzione.

Le procedure memorizzate differiscono dalle funzioni nei seguenti modi:

  • Le procedure memorizzate non hanno un valore di ritorno
  • È possibile eseguire il commit e il rollback delle transazioni all'interno delle stored procedure, ma non nelle funzioni
  • Esegui una procedura memorizzata usando l'istruzione CALL anziché un'istruzione SELECT.
1
d4nyll