區別:1、存儲過程用于在數據庫中完成特定的操作或任務,而函數用于特定數據;2、存儲過程的程序頭部聲明用PROCEDURE,聲明時不需要返回類型,而函數的程序頭部聲明用FUNCTION,聲明時要描述返回類型。
本教程操作環境:Windows7系統、oracle 11g版、Dell G3電腦。
存儲過程
存儲過程(Stored Procedure )是一組為了完成特定功能的SQL 語句集,經編譯后存儲在數據庫中。用戶通過指定存儲過程的名字并給出參數(如果該存儲過程帶有參數)來執行它。存儲過程是數據庫中的一個重要對象,任何一個設計良好的數據庫應用程序都應該用到存儲過程。 存儲過程是由流控制和SQL 語句書寫的過程,這個過程經編譯和優化后存儲在數據庫服務器中,應用程序使用時只要調用即可。在ORACLE 中,若干個有聯系的過程可以組合在一起構成程序包。
優 點:
1、存儲過程只在創造時進行編譯,以后每次執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高數據庫執行速度。
2、當對數據庫進行復雜操作時(如對多個表進行Update、Insert、Query、Delete時),可將此復雜操作用存儲過程封裝起來與數據庫提供的事務處理結合一起使用。
3、存儲過程可以重復使用,可減少數據庫開發人員的工作量。
4、安全性高,可設定只有某用戶才具有對指定存儲過程的使用權。
存儲過程與函數的區別
二者最大的區別是:
1).函數(function)總是向調用者返回數據,并且一般只返回一個值;2).存儲過程(procedure)不直接返回數據,但可以改變輸出參數的值,這可以近似看作能返回值,且存儲過程輸出參數的值個數沒有限制。
從一般應用上來看,如果不需要返回值或者需要多個返回值,使用存儲過程,如果只用一個返回值,就使用函數。
2、function定義中只能有DDL(如select等)語句;procedure中主要是DML語句(對數據庫進行復雜操作時,如對多個表進行Update、Insert、Query、Delete時)。
如果想要使用select的結果集,則要使用游標
存儲過程 |
函數 |
用于在數據庫中完成特定的操作或任務(如插入、刪除等) |
用于特定數據(如查詢返回值) |
程序頭部聲明用PROCEDURE |
程序頭部聲明用FUNCTION |
程序頭部聲明時不需要返回類型 |
程序頭部聲明時要描述返回類型,而且PL/SQL塊至少要包括一個有效的RETURN語句 |
可以使用IN/OUT/IN OUT3種參數模式 |
可以使用IN/OUT/IN OUT3種參數模式 |
可以作為獨立的PL/SQL語句執行 |
不能獨立執行,必須作為表達式的一部分調用 |
可以通過OUT/IN OUT返回零個或多個值 |
對過RETURN語句返回一個值,且該值與聲明部分一致,也可以通過OUT類型的參數帶出變量 |
SQL語句(DML或SELECT)中不可以調用存儲過程 |
SQL語句(DML或SELECT)中可以調用函數 |
實際舉例
1、函數
(1)創建函數
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)調用函數
declare? ????v_num?number; ????v_sum?number;begin ????...(這里應該出現函數名表示調用)end
2、存儲過程
(1)創建存儲過程
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)(這里出現存儲過程名表示調用,傳遞參數值用=>) end;
3、本地存儲過程
在PL/SQL中還可以在declare塊中建立本地存儲過程,而不使用關鍵字create,其目的是:不用將存儲過程存儲在數據庫中,避免更改數據庫時帶來的麻煩,其主要的使用場景是,臨時使用某個存儲過程,而不是在以后要重復多次使用。
例子:
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 ????...(這里不用出現存儲過程名) exception ????... end?proc_demo;
推薦教程:《Oracle教程》