簡體   English   中英

PL / SQL中的函數和過程有什么區別?

[英]What is the difference between function and procedure in PL/SQL?

PL / SQL中的函數和過程有什么區別?

過程沒有返回值,而函數有。

例:

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

注意函數如何在參數列表和“as”關鍵字之間有一個return子句。 這意味着它應該在函數體內的最后一個語句讀取如下內容:

return(my_varchar2_local_variable);

其中my_varchar2_local_variable是應該由該函數返回的一些varchar2。

函數可以內聯到SQL語句中,例如

select foo
      ,fn_bar (foo)
  from foobar

使用存儲過程無法做到這一點。 查詢優化器的體系結構限制了在此上下文中可以對函數執行的操作,要求它們是純的(即,相同的輸入始終生成相同的輸出)。 這限制了函數中可以執行的操作,但如果將其定義為“純”,則允許在查詢中將其用於內聯。

否則,函數(不一定是確定性的)可以返回變量或結果集。 在函數返回結果集的情況下,您可以將其與查詢中的某些其他選擇連接。 但是,您不能在相關子查詢中使用這樣的非確定性函數,因為優化器無法預測將返回哪種結果集(這在計算上是難以處理的,如停止問題)。

存儲過程和函數都是駐留在數據庫中的命名塊,可以在需要時執行。

主要區別是:

  1. 存儲過程可以選擇使用out參數返回值,但也可以以不返回值的方式寫入。 但是,函數必須返回一個值。

  2. 存儲過程不能在SELECT語句中使用,而函數可以在SELECT語句中使用。

實際上,我會針對特定需求組和針對可在多個場景之間共享的常見需求的函數進行存儲過程。 例如:比較兩個字符串,或修剪它們或取最后一部分,如果我們有一個函數,我們可以全局地將它用於我們擁有的任何應用程序。

以下是程序和功能之間的主要區別,

  1. 過程命名為PL / SQL塊,它執行一個或多個任務。 其中function被命名為執行特定操作的PL / SQL塊。
  2. 過程可能會或可能不會返回值,其中函數應返回一個值。
  3. 我們可以在select語句中調用函數,作為我們不能解決的過程。

以簡單的方式,它就是這個意思。

功能 :

這些子程序返回單個值 ; 主要用於計算和返回一個值。

程序:

這些子程序直接返回值 ; 主要用於執行動作。

示例程序:

CREATE OR REPLACE PROCEDURE greetings

BEGIN 

dbms_output.put_line('Hello World!');

END ;
/

執行獨立過程:

可以通過兩種方式調用獨立過程:

•使用EXECUTE關鍵字•從PL / SQL塊調用過程名稱

也可以從另一個PL / SQL塊調用該過程:

BEGIN 
greetings;
END;
/

功能:

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

以下程序從另一個塊調用函數totalCustomers

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

用幾句話來說 - 函數返回一些東西。 您可以在SQL查詢中使用函數。 過程是對數據執行某些操作的代碼的一部分,但是您無法從查詢中調用過程,您必須在PL / SQL塊中運行它。

  1. 我們可以在存儲過程中調用存儲過程,在函數內調用函數,在函數內調用StoredProcedure但是我們不能在存儲過程中調用函數。
  2. 我們可以在select語句中調用函數。
  3. 我們可以從函數返回值,而不將輸出參數作為參數傳遞給存儲過程。

這就是我發現的差異。 如果有的話請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM