昨天下午和今天上午找了也看了很多資料痒谴,現(xiàn)在基本上已經(jīng)把二者的區(qū)別理清楚,以后不要再弄混淆铡羡,也算是一種小小的進步吧积蔚,而不去想以后會怎樣。
一烦周、主要區(qū)別
**
**
1尽爆、二者最大的區(qū)別是:
- 1).函數(shù)(function)總是向調用者返回數(shù)據(jù),并且一般只返回一個值读慎;
- 2).存儲過程(procedure)不直接返回數(shù)據(jù)漱贱,但可以改變輸出參數(shù)的值,這可以近似看作能返回值夭委,且存儲過程輸出參數(shù)的值個數(shù)沒有限制幅狮。
從一般應用上來看,如果不需要返回值或者需要多個返回值闰靴,使用存儲過程彪笼,如果只用一個返回值,就使用函數(shù)蚂且。
2配猫、function定義中只能有DDL(如select等)語句;procedure中主要是DML語句(對數(shù)據(jù)庫進行復雜操作時,如對多個表進行Update杏死、Insert泵肄、Query捆交、Delete時)。
如果想要使用select的結果集腐巢,則要使用游標
**
**
以下需要注意的地方是:
- 1).定義函數(shù)或者存儲過程時品追,IN/OUT表示調用函數(shù)時,傳進來或傳出去的參數(shù)冯丙。如果沒有說明in/out肉瓦,則默認為in;
- 2).定義的函數(shù)必須要有return子句胃惜,其后緊跟著返回值得類型泞莉;
- 3).實際調用函數(shù)或存儲過程時,在declare中聲明的變量至少應該對應創(chuàng)建的函數(shù)或存儲過程中的OUT參數(shù)和return參數(shù)合起來的個數(shù)船殉;
- 4).可以建立不帶參數(shù)(即沒有返回的參數(shù))鲫趁、沒有變量的存儲過程。
**
**
- 5)執(zhí)行方式略有不同利虫,存儲過程的執(zhí)行方式有兩種(1.使用execute2.使用begin和end)挨厚,函數(shù)除了存儲過程的兩種方式外,還可以當做表達式使用糠惫,例如放在select中(select f1() form dual;)疫剃。
3、存儲過程的命名最好以proc_打頭寞钥,函數(shù)則是func_打頭慌申,變量則應該用v_打頭陌选。
二理郑、實際舉例
**
**
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)調用函數(shù)
declare
v_num number;
v_sum number;
begin
...(這里應該出現(xiàn)函數(shù)名表示調用)
end
2咨油、存儲過程
(1)創(chuàng)建存儲過程
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)調用存儲過程
調用語法:
1)您炉、exec <過程名>;
2)、execute <過程名>;
3)役电、在PL/SQL語句塊中直接調用赚爵。
例如:
declare
v_num number;
v_sum number(8,2);
begin
procedure pro_demo(dept_no=>1,sal_num=>900,emp_count=>10)(這里出現(xiàn)存儲過程名表示調用,傳遞參數(shù)值用=>)
end;
3法瑟、本地存儲過程
在PL/SQL中還可以在declare塊中建立本地存儲過程冀膝,而不使用關鍵字create,其目的是:不用將存儲過程存儲在數(shù)據(jù)庫中霎挟,避免更改數(shù)據(jù)庫時帶來的麻煩窝剖,其主要的使用場景是,臨時使用某個存儲過程酥夭,而不是在以后要重復多次使用赐纱。
例子:
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)存儲過程名)
exception
...
end proc_demo;
**
**
這里再次復習一下DDL(data defined language)脊奋,DML(data manipulation language ),DCL(data control language)的區(qū)別:
1).DDL的操作對象(表)
Create語句:可以創(chuàng)建數(shù)據(jù)庫和數(shù)據(jù)庫的一些對象疙描。
Drop語句:可以刪除數(shù)據(jù)表诚隙、索引、觸發(fā)程序起胰、條件約束以及數(shù)據(jù)表的權限等久又。
Alter語句:修改數(shù)據(jù)表定義及屬性。2).DML操作的對象是記錄(即數(shù)據(jù))
最常見的是增(insert)效五、刪(delete)籽孙、改(update)、查(select)3).DCL操作的對象是數(shù)據(jù)庫用戶的權限
Grant語句:允許對象的創(chuàng)建者給某用戶或某組或所有用戶(PUBLIC)某些特定的權限火俄。
Revoke語句:可以廢除某用戶或某組或所有用戶訪問權限