存儲過程和存儲函數的區別
① 存儲過程和函數的區別
不同點:
1、標識符不同。函數的標識符為FUNCTION,過程為:PROCEDURE。
2、函數中有返回值,且必須返回,而過程沒有返回值。
3、過程無返回值類型,不能將結果直接賦值給變數;函數有返回值類型,調用時,除在select中,必須將返回值賦給變數。
4、函數可以在select語句中直接使用,而過程不能,例如:假設已有函數fun_getAVG()
返回number類型絕對值。那麼select
fun_getAVG(col_a)
from
table
這樣是可以的。
相同點:
二者都可以有出參
② 過程與函數有什麼區別
1、返回值不同:
存儲過程可以使得對的管理、以及顯示關於及其用戶信息的工作容易得多。存儲過程是 sql 語句和可選控制流語句的預編譯集合,以一個名稱存儲並作為一個單元處理。
2、變數不同:
存儲過程存儲在資料庫內,可由應用程序通過一激咐御個調用執行,而且允許用戶聲明變數、 有條件執行以及其它強大的編程功能。存儲過程可包含程序流、邏輯以及對資料庫的查詢。可以接受參數、輸出參數、返回單個或多個結簡鬧果集以及返回值。
(2)存儲過程和存儲函數的區別擴展閱讀
可以出於任何使用 SQL 語句的目的來使用存儲過程,它具有以下優點:
(1)功能強大,限制少。
(2)可以在單個存儲過程明岩中執行一系列 SQL 語句。
(3)可以從自己的存儲過程內引用其它存儲過程,這可以簡化一系列復雜語句。
(4)存儲過程在創建時即在上進行編譯,所以執行起來比單個 SQL 語句快。
(5)可以有多個返回值,即多個輸出參數,並且可以使用SELECT返回結果集。
③ MySQL的存儲過程和存儲函數(UDF)的區別
2、存儲過程沒返回值,參數可以是 IN,OUT,IN OUT類型,有的人可能會理解成OUT 也算是返回值。
3、調用方式:函數 select my_fun() ;過程 call my_pro( ) ;
4、DEMO
1
2
3
4
5
6
7
8
9
10
11
DELIMITER $$
DROP FUNCTION IF EXISTS my_fun$$
CREATE
FUNCTION my_fun(a INT(2),b INT(2))
RETURNS INT(4)
BEGIN
DECLARE sum_ INT(2) DEFAULT 0;
SET sum_ = a + b;
RETURN sum_;
END$$
DELIMITER ;
1
2
3
4
5
6
7
8
DELIMITER $$
DROP PROCEDURE IF EXISTS my_pro$$
CREATE
PROCEDURE my_pro(IN a INT(2),IN b INT(2) ,OUT c INT(2))
BEGIN
SET c = a + b;
END$$
DELIMITER ;
5、調用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql> call my_pro(1,2,@c);
Query OK, 0 rows affected (0.00 sec)
mysql> select @c;
+------+
| @c |
+------+
| 3 |
+------+
1 row in set (0.00 sec)
mysql> select my_fun(1,2);
+-------------+
| my_fun(1,2) |
+-------------+
| 3 |
+-------------+
1 row in set (0.00 sec)
④ 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在下次執行時就不用再編譯了。
⑤ MySQL存儲函數和存儲過程的區別
區別主要在於:
1、存儲過程沒有返回值,而函數必須有返回值;
2、存儲過程的參數可以是IN、OUT、INOUT類型,而函數的參數只能是IN類型。
⑥ 存儲過程和函數的區別是什麼
不同點:
1、標識符不同。函數的標識符為FUNCTION,過程為:PROCEDURE;
2、函數中有返回值,且必須返回,而過程沒有返回值;
帶陵3、過程無返回值類型,不能將結果直接賦值給變數。函數有返回值類型,調用時,除在蠢亂戚select中,必須將返回值賦給變數;
4、函數可以在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這個的解釋也很好。
⑧ oracle函數和存儲過程有什麼區別
一、主體不同
1、函數:當需要分析數據清單中的數值是否符合特定條件時,使用資料庫工作表函數。
2、存儲過程:是在大型資料庫系統中,一組為了完成特定功能的SQL 語句集,存儲在資料庫中,一次編譯後永久有效。
二、特點不同
1、函數:只能返回一個變數,可以嵌入sql中和存儲過程中使用。
2、存儲過程:用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行。存儲過程是資料庫中的一個重要對象。在數據量特別龐大的情況下利用存儲過程能達到倍速的效率提升。
三、功能不同
1、函數:不能用臨時表,只能用表變數,函數不能執行一組修改全局資料庫狀態的操作。可以作為查詢語句的一個部分來調用,由於函數可以返回一個表對象,所以在查詢中位於from關鍵字後面。
2、存儲過程:存儲過程需要讓sql的query可以執行,存儲過程可以返回參數,如記錄集。sql語句中不可以含有存儲過程。
⑨ 1,存儲過程和函數的區別
存儲過程和函數目的是為了 可重復地 執行操作資料庫的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;
/