存儲函數和存儲過程區別
區別主要在於:
1、存儲過程沒有返回值,而函數必須有返回值;
2、存儲過程的參數可以是IN、OUT、INOUT類型,而函數的參數只能是IN類型。
『貳』 存儲過程和函數有何區別
存儲過程和函數目的是為了 可重復地 執行操作資料庫的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;
/
『叄』 存儲過程和函數的區別
1、函數只能返回一個變數,而存儲過程可以返回多個;
例如:函數可以嵌入sql中和存儲過程中使用,但是存儲過程需要讓sql的query可以執行,將mysql_real_connect的最後一個參數設置為CLIENT_MULTI_STATEMENTS
例如:存儲過程的參數有in,out,inout三種,函數只有in,存儲過程聲明時不需要返回類型,而函數需要描述返回類型,且函數中必須包含一個有效的return語句;
6、存儲過程一般是作為獨立部分來執行,而函數可以作為查詢語句的一個部分來調用,由於函數可以返回一個表對象,所以在查詢中位於from關鍵字後面,sql語句中不可以含有存儲過程。
(3)存儲函數和存儲過程區別擴展閱讀:
1、存儲過程的基本語法:
(1)創建存儲過程
create procere sp_name
@[參數名] [類型],@[參數名] [類型]
as
begin
.........
end
以上格式還可以簡寫成:
create proc sp_name
@[參數名] [類型],@[參數名] [類型]
as
begin
.........
end
/*註:「sp_name」為需要創建的存儲過程的名字,該名字不可以以阿拉伯數字開頭*/
(2)調用存儲過程
exec sp_name [參數名]
(3)刪除存儲過程
drop procere sp_name
(4)其他常用命令
① show procere status
顯示資料庫中所有存儲的存儲過程基本信息,包括所屬資料庫,存儲過程名稱,創建時間等
② show create procere sp_name
顯示某一個mysql存儲過程的詳細信息
③ exec sp_helptext sp_name
顯示你這個sp_name這個對象創建文本
2、存儲過程和觸發器的區別:
(1)觸發器與存儲過程可以說是非常相似,可以說是一種變種的存儲過程,觸發器和存儲過程一樣都是SQL語句集,通常通過創建觸發器來強制實現不同表中的邏輯相關數據的引用完整性和一致性。由於用戶不能繞過觸發器,所以可以用它來強制實施復雜的業務規則,以確保數據的完整性。
(2)觸發器不同於存儲過程,觸發器主要是通過事件執行觸發而被執行的,而存儲過程可以通過存儲過程名稱名字而直接調用。當對某一表進行諸如UPDATE、INSERT、DELETE這些操作時,SQLSERVER就會自動執行觸發器所定義的SQL語句,從而確保對數據的處理必須符合這些SQL語句所定義的規則。
『肆』 存儲過程是什麼它和函數有什麼異同
存儲過程與函數不同的是:不能直接調用過程名返回值,也不能在表達式中使用。
定義:
存儲過程是由流控制和SQL語句書寫的過程,這個過程經編譯和優化後存儲在資料庫伺服器中,應用程序使用時只要調用即可。在ORACLE中,若干個有聯系的過程可以組合在一起構成程序包。
『伍』 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)
『陸』 存儲過程和函數分別是什麼呢,有什麼區別
存儲過程和函數都包含一段處理腳本,兩者都有返回值,而主要區別也體現在返回值上。
存儲過程的返回值可以通過過程體內return + 一個整數
的形式中指過程,返回過程狀態;也可以通過返回參數(output)得到一個返回值。
函數的返回結果就很多了,除了返回各種基本類型,還能返回table類型(內嵌表值函數和多語錄表值函數),暫時能想到的就這些了~
『柒』 存儲過程和函數有何區別
存儲過程和函數有2個區別
1 存儲過程不一定非要有返回值 資料庫中的函數一定有返回值
2 存儲過程在前台語言可以直接調用 而函數一般要有sql語句做為載體
『捌』 存儲過程和函數的區別
不同點:
1、標識符不同。函數的標識符為FUNCTION,過程為:PROCEDURE。
2、函數中有返回值,且必須返回,而過程沒有返回值。
3、過程無返回值類型,不能將結果直接賦值給變數;函數有返回值類型,調用時,除在select中,必須將返回值賦給變數。
4、函數可以在select語句中直接使用,而過程不能,例如:假設已有函數fun_getAVG()
返回number類型絕對值。那麼select
fun_getAVG(col_a)
from
table
這樣是可以的。
相同點:
二者都可以有出參
『玖』 存儲過程和函數的區別
本質上沒區別。只是函數有如:只能返回一個變數的限制。而存儲過程可以返回多個。而函數是可以嵌入在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在下次執行時就不用再編譯了。