2009-04-21 12 views
62

Qual è la differenza tra funzione e procedura in PL/SQL?Qual è la differenza tra funzione e procedura in PL/SQL?

+13

Non sarei d'accordo con questo essere un duplicato. In generale, i termini del linguaggio di programmazione come la procedura e la funzione non vengono utilizzati allo stesso modo in un sistema di database. Questa è una buona domanda, è solo che la risposta è "la stessa differenza con i linguaggi di programmazione: vedi ". –

+1

qualcuno ha l'elenco delle differenze da oracle 11g e forward? Penso che ora possiamo usare certe funzionalità extra nelle funzioni! – MozenRath

risposta

45

Una procedura non ha un valore di ritorno, mentre una funzione ha.

Esempio:

CREATE OR REPLACE PROCEDURE my_proc 
    (p_name IN VARCHAR2 := 'John') as begin ... end 

CREATE OR REPLACE FUNCTION my_func 
    (p_name IN VARCHAR2 := 'John') return varchar2 as begin ... end 

Notate come la funzione ha una clausola di ritorno tra la lista dei parametri e il "come" parola chiave. Ciò significa che si dovrebbe avere l'ultima istruzione all'interno del corpo della funzione leggere qualcosa di simile:

return(my_varchar2_local_variable); 

Dove my_varchar2_local_variable è una certa varchar2 che deve essere restituito da questa funzione.

+14

Come un piccolo chiarimento, è ancora possibile ottenere i valori OUT da una procedura: in effetti è possibile avere un valore di ritorno per ciascun parametro OUT specificato. – GoingTharn

15

Una funzione può essere allineata in un'istruzione SQL, ad es.

select foo 
     ,fn_bar (foo) 
    from foobar 

Quale non può essere eseguito con una stored procedure. L'architettura di Query Optimiser limita ciò che può essere fatto con le funzioni in questo contesto, richiedendo che siano puri (cioè gli stessi input producono sempre lo stesso output). Ciò limita ciò che può essere fatto nella funzione, ma consente di utilizzarlo in linea nella query se è definito come "puro".

In caso contrario, una funzione (non necessariamente deterministica) può restituire una variabile o un set di risultati. Nel caso di una funzione che restituisce un set di risultati, è possibile aggiungerla a un'altra selezione in una query. Tuttavia, non è possibile utilizzare una funzione non deterministica come questa in una sottoquery correlata poiché l'ottimizzatore non può prevedere quale tipo di set di risultati verrà restituito (questo è computazionalmente intrattabile, come il problema di interruzione).

+0

Potrebbe non avere senso, ma l'ottimizzatore non ti impedisce di utilizzare funzioni non deterministiche ovunque. –

-2
  1. possiamo chiamare una stored procedure all'interno di stored procedure, funzione all'interno di funzione, StoredProcedure all'interno della funzione ma non possiamo chiamare la funzione all'interno della stored procedure.
  2. possiamo chiamare la funzione all'interno dell'istruzione select.
  3. È possibile restituire il valore dalla funzione senza passare il parametro di uscita come parametro alla stored procedure.

Questo è quello che ho trovato la differenza. Per favore fatemi sapere se c'è ne.

+1

Non siete corretti - non vi è alcun motivo per cui non è possibile chiamare una funzione da una procedura. –

-1

Di seguito sono le principali differenze tra procedure e funzione,

  1. procedura è chiamato blocco PL/SQL che esegue una o più attività. dove la funzione è denominata blocco PL/SQL che esegue un'azione specifica.
  2. La procedura può o non può restituire valore laddove la funzione deve restituire un valore.
  3. possiamo chiamare funzioni in istruzione select dove come procedura non possiamo.
+3

Una funzione non può eseguire più di una "azione"? Esso restituisce solo il tipo di dati. – Ben

-1

In un modo semplice e morto, questo significato.

Funzioni:

Questi sottoprogrammi restituiscono un singolo valore; utilizzato principalmente per calcolare e restituire un valore.

Procedura:

Questi sottoprogrammi non restituire un valore direttamente; principalmente utilizzato per eseguire un'azione.

Programma Esempio:

CREATE OR REPLACE PROCEDURE greetings 

BEGIN 

dbms_output.put_line('Hello World!'); 

END ; 
/

esecuzione di una procedura standalone: ​​

Una procedura standalone può essere chiamato in due modi:

• Utilizzando la EXECUTE parola chiave • Chiamando il nome della procedura da un blocco PL/SQL

La procedura può anche essere chiamato da un altro blocco PL/SQL:

BEGIN 
greetings; 
END; 
/

Funzione:

CREATE OR REPLACE FUNCTION totalEmployees 
RETURN number IS 
total number(3) := 0; 
BEGIN 
SELECT count(*) into total 
FROM employees; 
RETURN total; 
END; 
/

seguente programma chiama la funzione totalCustomers da un altro blocco

DECLARE 
c number(3); 
BEGIN 
c := totalEmployees(); 
dbms_output.put_line('Total no. of Employees: ' || c); 
END; 
/
0

Entrambe le stored procedure e le funzioni sono denominate bloid che risiedono nel Da tabase e può essere eseguito come e quando richiesto.

Le principali differenze sono:

1.A stored procedure possono facoltativamente valori restituiti utilizzando parametri out, ma può anche essere scritta in modo senza restituire un valore .Ma una funzione deve restituire un valore

2. Una procedura memorizzata non può essere utilizzata in un'istruzione select in cui le funzioni possono essere utilizzate in un'istruzione select.

In pratica, vorrei eseguire una stored procedure per un gruppo specifico di requisiti e una funzione per un requisito comune che potrebbe essere condiviso su più scenari per g: confronto tra due stringhe o ritaglio o prendendo l'ultima porzione, se abbiamo una funzione per questo, potremmo utilizzarla globalmente per qualsiasi applicazione che abbiamo

-1

In poche parole - la funzione restituisce qualcosa. È possibile utilizzare la funzione nella query SQL. La procedura fa parte del codice per fare qualcosa con i dati ma non è possibile richiamare la procedura dalla query, è necessario eseguirla nel blocco PL/SQL.