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


36

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

Il commento si collega a un articolo di Wikipedia ma alcuni di questi non sembrano applicarsi (ad esempio, possono essere utilizzati in una SELECTdichiarazione).

La stessa sintassi 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 FUNCTIONma si fa riferimento a come PROCEDURE.

Quindi qual è la differenza tra questi due?

Risposte:


43

Ufficialmente PostgreSQL ha solo "funzioni". Le funzioni di trigger vengono talvolta definite "procedure di trigger", ma tale utilizzo non ha un significato distinto. Internamente, le funzioni vengono talvolta definite procedure, come 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 questo thread della mailing list 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 oggetto.) Quindi, in ogni caso, e specialmente quando si esaminano 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.


14

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" in si create triggerriferisce a una funzione.

In termini di documentazione di Postgres, "procedura" è anche sinonimo dell'oggetto database chiamato funzione, ad esempio: " Una procedura di trigger viene creata con il comando CREATE FUNCTION ".

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


8

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 (molto simile a come 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. La CREATE TRIGGERsintassi è 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".


6

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

 - può avere molti parametri di input e output
 - può essere utilizzato per modificare tabelle / strutture / dati di database
 - non vengono normalmente utilizzati nelle istruzioni insert / update / delete / select
Le funzioni definite dall'utente sono disponibili in diversi gusti. A seconda del tipo di funzione scritta, funzioni:
  - può avere più parametri di input, ma restituisce solo un singolo valore (cioè concatenazione di stringhe)
  - può accettare un set come input, restituire un singolo valore (es. dbo.FindLargestPig (ListOfPigs))
  - restituisce una tabella (cioè seleziona * da dbo.ExplodeString ("questo è un elenco di parole"))
  - può essere utilizzato nelle istruzioni select / insert / update / delete
  - NON PU be essere utilizzato per modificare tabelle / strutture / dati di database


5

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.


entro il 2003 credo
xenoterracide il

Sembra molto simile alla sintassi di VB. Una funzione restituisce un valore e una procedura no (quindi se si avesse un valore restituito in una funzione, il compilatore farebbe saltare in aria)
jcolebrand

@jcolebrand In realtà, i nomi sono più evidenti in Pascal. Una procedura non restituisce un risultato, mentre una funzione lo fa. Per motivi storici, VBA utilizza il linguaggio FORTRAN, che li chiama (chiamato?) SUBROUTINE & FUNCTION . I moderni linguaggi di tipo C hanno solo funzioni, ma i linguaggi digitati hanno l'opzione di funzioni vuote che sono procedure con un altro nome. Una tendenza popolare è quella di utilizzare le normali funzioni per tutto e restituire qualcosa che può essere ignorato se si desidera.
Manngo,

2

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. restituire un valore: sp non restituisce automaticamente un valore se non si specifica refcursor tipo di ritorno, aperta e restituire un cursore; f restituisce il risultato nell'ultima istruzione in cui è incorporata una clausola 'return', come una clausola 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 fintanto che si specifica 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

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.