區別: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中儲存過程與函數的區別是什麼的詳細內容,更多請關注TW511.COM其它相關文章!