當前位置:首頁 » 服務存儲 » 關於存儲過程和函數的區別
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

關於存儲過程和函數的區別

發布時間: 2022-03-03 09:00:01

『壹』 函數和存儲過程區別

首先糾正一個錯誤,存儲過程也有參數和返回值的 例如 exec @Ret = p_Proc @a

最直白的說 可以在select 中使用函數 而過程只能用exec 執行

『貳』 oracle存儲過程和函數的區別

相同點:1.創建語法結構相似,都可以攜帶多個傳入參數和傳出參數。

2.都是一次編譯,多次執行。

不同點:1.存儲過程定義關鍵字用procere,函數定義用function。

2.存儲過程中不能用return返回值,但函數中可以,而且函數中必須有return子句。

3.執行方式略有不同,存儲過程的執行方式有兩種(1.使用execute2.使用begin和end),函數除了存儲過程的兩種方式外,還可以當做表達式使用,例如放在select中(select f1() form al;)。

總結:如果只有一個返回值,用存儲函數,否則,一般用存儲過程。

『叄』 存儲過程和函數有何區別

存儲過程和函數目的是為了 可重復地 執行操作資料庫sql語句的集合。

區別是寫法和調用上。

寫法上:存儲過程的參數列表可以有輸入參數、輸出參數、可輸入輸出的參數;

函數的參數列表只有輸入參數,並且有return <返回值類型,無長度說明>。

返回值上:

存儲過程的返回值,可以有多個值,

函數的返回值,只有一個值。

調用方式上:

存儲過程的調用方式有:

1)、exec <過程名>;

2)、execute <過程名>;

3)、在PL/SQL語句塊中直接調用。

函數的調用方式有:

在PL/SQL語句塊中直接調用。

具體分為:

----調用FUNCTION add_three_numbers

----1. 位置表示法調用函數

BEGIN

dbms_output.put_line(add_three_numbers(2,4,5));

END;

----2. 命名表示法調用函數

BEGIN

dbms_output.put_line(add_three_numbers(b=>3, a=>4,c=>2));

END;

----3. 混合使用位置表示法和命名表示法調用函數

BEGIN

dbms_output.put_line(add_three_numbers(3, b=>4,c=>2));

END;

----4. 排除表示法

BEGIN

dbms_output.put_line(add_three_numbers(12,c=>2));

END;

----5. sql調用表示法 --混合表示法

SELECT add_three_numbers(3, b=>4,c=>2) FROM DUAL;

----1. 該函數接受3個可選參數,返回3個數字的和

CREATE OR REPLACE FUNCTION add_three_numbers

(

a NUMBER:=0, b NUMBER:=0, c NUMBER:=0

)

RETURN NUMBER IS

BEGIN

RETURN a+b+c;

END;

存儲過程:

基本語法:

create procere <過程名>(<參數列表,無參時忽略>)

as|is

變數聲明、初始化

begin

業務處理、邏輯代碼

exception

異常捕獲、容錯處理

end <過程名>;

參數:<參數名> in|out|in out <參數類型,無長度說明> ,如:v_name varchar2

in:入參

out:出參

in out:出入參

註:as|is表示as或is

調用語法:

1)、exec <過程名>;

2)、execute <過程名>;

3)、在PL/SQL語句塊中直接調用。

例:

create or replace procere up_wap(v_param1 in out varchar2,v_param2 in out varchar2)

is

v_temp varchar2(20);

begin

dbms_output.put_line('交換前參數1:'||v_param1||' 參數2:'||v_param2);

v_temp:=v_param1;

v_param1:=v_param2;

v_param2:=v_temp;

dbms_output.put_line('交換後參數1:'||v_param1||' 參數2:'||v_param2);

exception

when others then dbms_output.put_line('There is a error when the procere up_wap executing!');

end up_wap;

/

-- 調用存儲過程

declare

v_param1 varchar2(20):='param1';

v_param2 varchar2(20):='param2';

begin

up_wap(v_param1 => v_param1,v_param2 => v_param2);

end;

/

自定義函數(function)

基本語法:

create function <函數名>(<參數列表,無參時忽略>)

return <返回值類型,無長度說明>

as|is

變數聲明、初始化

begin

業務處理、邏輯代碼

return <返回的值>;

exception

異常捕獲、容錯處理

end <函數名>;

參數:in 入參

註:只有入參的類型。

在存儲過程和自定義函數中的參數的傳遞(入參和出參)不能使用%type或%rowtype匹配,不能使用空值null,但是存儲過程可以返回空值。

例:

create function uf_select_name_by_id_test(v_id in number)

return varchar2

is

v_name t_test.t_name%type;

begin

select t_name into v_name from t_test where t_id=v_id;

return v_name;

exception

when others then dbms_output.put_line('error');

end uf_select_name_by_id_test;

/

select uf_select_name_by_id_test(1) 姓名 from al;-- select調用

declare --pl/sql語句塊調用

v_name varchar2(20);

begin

v_name:=uf_select_name_by_id_test(1);

dbms_output.put_line('name = '||v_name);

end;

/

『肆』 SQL中存儲過程和函數的區別

本質上沒區別。只是函數有如:只能返回一個變數的限制。而存儲過程可以返回多個。而函數是可以嵌入在sql中使用的,可以在select中調用,而存儲過程不行。執行的本質都一樣。
函數限制比較多,比如不能用臨時表,只能用表變數.還有一些函數都不可用等等.而存儲過程的限制相對就比較少
1. 一般來說,存儲過程實現的功能要復雜一點,而函數的實現的功能針對性比較強。
2. 對於存儲過程來說可以返回參數,而函數只能返回值或者表對象。
3. 存儲過程一般是作為一個獨立的部分來執行(EXEC執行),而函數可以作為查詢語句的一個部分來調用(SELECT調用),由於函數可以返回一個表對象,因此它可以在查詢語句中位於FROM關鍵字的後面。
4. 當存儲過程和函數被執行的時候,SQL Manager會到procere cache中去取相應的查詢語句,如果在procere cache里沒有相應的查詢語句,SQL Manager就會對存儲過程和函數進行編譯。
Procere cache中保存的是執行計劃 (execution plan) ,當編譯好之後就執行procere cache中的execution plan,之後SQL SERVER會根據每個execution plan的實際情況來考慮是否要在cache中保存這個plan,評判的標准一個是這個execution plan可能被使用的頻率;其次是生成這個plan的代價,也就是編譯的耗時。保存在cache中的plan在下次執行時就不用再編譯了。

『伍』 函數和存儲過程的區別

從參數的返回情況來看
如果返回多個參數值最好使用存儲過程,如果只有一個返回值的話可以使用函數;
從調用情況來看
如果在SQL語句(DML或SELECT)中調用的話一定是存儲函數或存儲的封裝函數不可以是存儲過程

『陸』 存儲過程和函數的區別是什麼

存儲過程需要單獨執行;
函數可以隨處調用。
存儲過程是保存起來的可以接受和返回用戶提供的參數的
Transact-SQL
語句的集合。
可以創建一個過程供永久使用,或在一個會話中臨時使用(局部臨時過程),或在所有會話中臨時使用(全局臨時過程)。
也可以創建在
Microsoft®
SQL
Server™
啟動時自動運行的存儲過程。
用戶定義函數,它是返回值的已保存的
Transact-SQL
常式。用戶定義函數不能用於執行一組修改全局資料庫狀態的操作。
與系統函數一樣,用戶定義函數可以從查詢中喚醒調用。也可以像存儲過程一樣,通過
EXECUTE
語句執行。
http://topic.csdn.net/t/20030806/16/2116067.html
http://www.cnsdn.com.cn/blog/article.asp?id=2035這個的解釋也很好。

『柒』 函數和存儲過程的區別

函數和存儲過程對SQL SERVER來說有很大的區別:
1.在SQL SERVER2K以前,沒有自定義函數UDF,只有系統函數。
2.無論系統函數和UDF,在系統啟動是就進行編譯並載入,所以UDF的效率比SP要高,SP只是在調用時才載入(擴展的存儲過程除外)。
3.有些函數getdate,exec..都在UDF里不能用!
4.函數必須有返回值,SP則不一定。
5.函數可以包括在FROM子句中,SP則不可以。
6.在SQL SERVE2K中SP可以DEBUG,UDF不可以。 用戶定義函數
函數是由一個或多個 Transact-SQL 語句組成的子程序,可用於封裝代碼以便重新使用。Microsoft® SQL Server™ 2000 並不將用戶限制在定義為 Transact-SQL 語言一部分的內置函數上,而是允許用戶創建自己的用戶定義函數。

可使用 CREATE FUNCTION 語句創建、使用 ALTER FUNCTION 語句修改、以及使用 DROP FUNCTION 語句除去用戶定義函數。每個完全合法的用戶定義函數名 (database_name.owner_name.function_name) 必須唯一。

必須被授予 CREATE FUNCTION 許可權才能創建、修改或除去用戶定義函數。不是所有者的用戶在 Transact-SQL 語句中使用某個函數之前,必須先給此用戶授予該函數的適當許可權。若要創建或更改在 CHECK 約束、DEFAULT 子句或計算列定義中引用用戶定義函數的表,還必須具有函數的 REFERENCES 許可權。

在函數中,區別處理導致刪除語句並且繼續在諸如觸發器或存儲過程等模式中的下一語句的 Transact-SQL 錯誤。在函數中,上述錯誤會導致停止執行函數。接下來該操作導致停止喚醒調用該函數的語句。

用戶定義函數的類型
SQL Server 2000 支持三種用戶定義函數:

標量函數

內嵌表值函數

多語句表值函數

存儲過程
存儲過程可以使得對資料庫的管理、以及顯示關於資料庫及其用戶信息的工作容易得多。存儲過程是 SQL 語句和可選控制流語句的預編譯集合,以一個名稱存儲並作為一個單元處理。存儲過程存儲在資料庫內,可由應用程序通過一個調用執行,而且允許用戶聲明變數、有條件執行以及其它強大的編程功能。

存儲過程可包含程序流、邏輯以及對資料庫的查詢。它們可以接受參數、輸出參數、返回單個或多個結果集以及返回值。

可以出於任何使用 SQL 語句的目的來使用存儲過程,它具有以下優點:

可以在單個存儲過程中執行一系列 SQL 語句。

可以從自己的存儲過程內引用其它存儲過程,這可以簡化一系列復雜語句。

存儲過程在創建時即在伺服器上進行編譯,所以執行起來比單個 SQL 語句快。 存儲過程可能單獨完成一些內容,可以單獨進行。
函數可以在試子中調用,比如可以進行一些計算等,不能單獨執行。

『捌』 存儲過程 與函數的區別

這個問題Oracle和SQL Server是有細微不同的,根據需要請參考以下兩個文檔之一.
Oracle 存儲過程 與函數的區別: http://wenku..com/view/7ca58734ee06eff9aef80763.html
SQL Server 存儲過程 與函數的區別: http://wenku..com/view/0715a277f46527d3240ce0f9.html