昨天下午和今天上午找了也看了很多資料,現(xiàn)在基本上已經(jīng)把二者的區(qū)別理清楚,以后不要再弄混淆,也算是一種小小的進(jìn)步吧,而不去想以后會(huì)怎樣。
一、主要區(qū)別
**
**
1、二者最大的區(qū)別是:
- 1).函數(shù)(function)總是向調(diào)用者返回?cái)?shù)據(jù),并且一般只返回一個(gè)值;
- 2).存儲(chǔ)過(guò)程(procedure)不直接返回?cái)?shù)據(jù),但可以改變輸出參數(shù)的值,這可以近似看作能返回值,且存儲(chǔ)過(guò)程輸出參數(shù)的值個(gè)數(shù)沒(méi)有限制。
從一般應(yīng)用上來(lái)看,如果不需要返回值或者需要多個(gè)返回值,使用存儲(chǔ)過(guò)程,如果只用一個(gè)返回值,就使用函數(shù)。
2、function定義中只能有DDL(如select等)語(yǔ)句;procedure中主要是DML語(yǔ)句(對(duì)數(shù)據(jù)庫(kù)進(jìn)行復(fù)雜操作時(shí),如對(duì)多個(gè)表進(jìn)行Update、Insert、Query、Delete時(shí))。
如果想要使用select的結(jié)果集,則要使用游標(biāo)
**
**
以下需要注意的地方是:
- 1).定義函數(shù)或者存儲(chǔ)過(guò)程時(shí),IN/OUT表示調(diào)用函數(shù)時(shí),傳進(jìn)來(lái)或傳出去的參數(shù)。如果沒(méi)有說(shuō)明in/out,則默認(rèn)為in;
- 2).定義的函數(shù)必須要有return子句,其后緊跟著返回值得類(lèi)型;
- 3).實(shí)際調(diào)用函數(shù)或存儲(chǔ)過(guò)程時(shí),在declare中聲明的變量至少應(yīng)該對(duì)應(yīng)創(chuàng)建的函數(shù)或存儲(chǔ)過(guò)程中的OUT參數(shù)和return參數(shù)合起來(lái)的個(gè)數(shù);
- 4).可以建立不帶參數(shù)(即沒(méi)有返回的參數(shù))、沒(méi)有變量的存儲(chǔ)過(guò)程。
**
**
- 5)執(zhí)行方式略有不同,存儲(chǔ)過(guò)程的執(zhí)行方式有兩種(1.使用execute2.使用begin和end),函數(shù)除了存儲(chǔ)過(guò)程的兩種方式外,還可以當(dāng)做表達(dá)式使用,例如放在select中(select f1() form dual;)。
3、存儲(chǔ)過(guò)程的命名最好以proc_打頭,函數(shù)則是func_打頭,變量則應(yīng)該用v_打頭。

二、實(shí)際舉例
**
**
1、函數(shù)
(1)創(chuàng)建函數(shù)
create or replace function get_salary(
dept_no number,
emp_count **out** number)
return number IS
v_sum number;
begin
...
exception
...
end get_salary
(2)調(diào)用函數(shù)
declare
v_num number;
v_sum number;
begin
...(這里應(yīng)該出現(xiàn)函數(shù)名表示調(diào)用)
end
2、存儲(chǔ)過(guò)程
(1)創(chuàng)建存儲(chǔ)過(guò)程
create or replace procedure pro_demo(
dept_no number default 10,
sal_sum out number,
emp_count out number)
IS
begin
...
exception
...
end proc_demo;
(2)調(diào)用存儲(chǔ)過(guò)程
調(diào)用語(yǔ)法:
1)、exec <過(guò)程名>;
2)、execute <過(guò)程名>;
3)、在PL/SQL語(yǔ)句塊中直接調(diào)用。
例如:
declare
v_num number;
v_sum number(8,2);
begin
procedure pro_demo(dept_no=>1,sal_num=>900,emp_count=>10)(這里出現(xiàn)存儲(chǔ)過(guò)程名表示調(diào)用,傳遞參數(shù)值用=>)
end;
3、本地存儲(chǔ)過(guò)程
在PL/SQL中還可以在declare塊中建立本地存儲(chǔ)過(guò)程,而不使用關(guān)鍵字create,其目的是:不用將存儲(chǔ)過(guò)程存儲(chǔ)在數(shù)據(jù)庫(kù)中,避免更改數(shù)據(jù)庫(kù)時(shí)帶來(lái)的麻煩,其主要的使用場(chǎng)景是,臨時(shí)使用某個(gè)存儲(chǔ)過(guò)程,而不是在以后要重復(fù)多次使用。
例子:
declare
v_num number;
v_sum number(8,2);
procedure proc_demo(
dept_no number default 10,
sal_sum out number,
emp_count out number)
IS
begin
...(這里不用出現(xiàn)存儲(chǔ)過(guò)程名)
exception
...
end proc_demo;
**
**
這里再次復(fù)習(xí)一下DDL(data defined language),DML(data manipulation language ),DCL(data control language)的區(qū)別:
1).DDL的操作對(duì)象(表)
Create語(yǔ)句:可以創(chuàng)建數(shù)據(jù)庫(kù)和數(shù)據(jù)庫(kù)的一些對(duì)象。
Drop語(yǔ)句:可以刪除數(shù)據(jù)表、索引、觸發(fā)程序、條件約束以及數(shù)據(jù)表的權(quán)限等。
Alter語(yǔ)句:修改數(shù)據(jù)表定義及屬性。2).DML操作的對(duì)象是記錄(即數(shù)據(jù))
最常見(jiàn)的是增(insert)、刪(delete)、改(update)、查(select)3).DCL操作的對(duì)象是數(shù)據(jù)庫(kù)用戶(hù)的權(quán)限
Grant語(yǔ)句:允許對(duì)象的創(chuàng)建者給某用戶(hù)或某組或所有用戶(hù)(PUBLIC)某些特定的權(quán)限。
Revoke語(yǔ)句:可以廢除某用戶(hù)或某組或所有用戶(hù)訪(fǎng)問(wèn)權(quán)限