stored-procedures substring用法 - PL / SQL中的函數和過程有什麼區別?




%用法 length (8)

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


Answers

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

這就是我發現的不同之處。 如果有的話請告訴我。


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


存儲過程和函數都被命名為bloack,它們駐留在數據庫中,可以在需要時執行。

主要區別是:

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

2.存儲過程不能在select語句中使用,因為函數可以在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;
/

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

例:

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. 函數可以從sql調用,而程序則不能。

  3. 函數用於計算,其中過程用於業務邏輯。

  4. 程序是預編譯的,功能不是。

  5. 過程支持自定義名稱解析 ,功能不在其中。


如果你想在不首先聲明臨時表的情況下執行該操作,則可以嘗試創建用戶定義的函數而不是存儲過程 ,並使該用戶定義的函數返回一個表。 或者,如果您想使用存儲過程,請嘗試如下所示:

CREATE TABLE #tmpBus
(
   COL1 INT,
   COL2 INT
)

INSERT INTO #tmpBus
Exec SpGetRecords 'Params'




sql stored-procedures function plsql