區別: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教學》
以上是oracle中預存程序與函數的差別是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!