Oracle中函數(shù)和存儲過程的區(qū)別總結(jié)版

昨天下午和今天上午找了也看了很多資料,現(xiàn)在基本上已經(jīng)把二者的區(qū)別理清楚,以后不要再弄混淆,也算是一種小小的進步吧,而不去想以后會怎樣。


一、主要區(qū)別

**
**
1、二者最大的區(qū)別是:

  • 1).函數(shù)(function)總是向調(diào)用者返回數(shù)據(jù),并且一般只返回一個值;
  • 2).存儲過程(procedure)不直接返回數(shù)據(jù),但可以改變輸出參數(shù)的值,這可以近似看作能返回值,且存儲過程輸出參數(shù)的值個數(shù)沒有限制。

從一般應用上來看,如果不需要返回值或者需要多個返回值,使用存儲過程,如果只用一個返回值,就使用函數(shù)。

2、function定義中只能有DDL(如select等)語句;procedure中主要是DML語句(對數(shù)據(jù)庫進行復雜操作時,如對多個表進行Update、Insert、Query、Delete時)。

如果想要使用select的結(jié)果集,則要使用游標

**
**
以下需要注意的地方是:

  • 1).定義函數(shù)或者存儲過程時,IN/OUT表示調(diào)用函數(shù)時,傳進來或傳出去的參數(shù)。如果沒有說明in/out,則默認為in;
  • 2).定義的函數(shù)必須要有return子句,其后緊跟著返回值得類型;
  • 3).實際調(diào)用函數(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_打頭。

Paste_Image.png

二、實際舉例

**
**
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
    ...(這里應該出現(xiàn)函數(shù)名表示調(diào)用)
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)調(diào)用存儲過程
調(diào)用語法:

1)、exec <過程名>;

2)、execute <過程名>;

3)、在PL/SQL語句塊中直接調(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)存儲過程名表示調(diào)用,傳遞參數(shù)值用=>)
end;
3、本地存儲過程

在PL/SQL中還可以在declare塊中建立本地存儲過程,而不使用關(guān)鍵字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ù)表的權(quán)限等。
    Alter語句:修改數(shù)據(jù)表定義及屬性。

  • 2).DML操作的對象是記錄(即數(shù)據(jù))
    最常見的是增(insert)、刪(delete)、改(update)、查(select)

  • 3).DCL操作的對象是數(shù)據(jù)庫用戶的權(quán)限
    Grant語句:允許對象的創(chuàng)建者給某用戶或某組或所有用戶(PUBLIC)某些特定的權(quán)限。
    Revoke語句:可以廢除某用戶或某組或所有用戶訪問權(quán)限

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容