函數和存儲過程一樣,也是編譯好存儲在數據庫服務器上的程序代碼。函數與存儲過程最大的不同在於,函數必須要有返回值。當然了,函數具有存儲過程一樣的優點,不知道的伙計,請參見《Oracle學習筆記——存儲過程》。
如果你寫過C或者C++程序,你就應該知道C和C++中有很多內置的函數庫;Oracle也是如此,它也內置了很多的函數,在後續總結中,我會對Oracle中內置的主要函數進行總結。但是,內置的函數只是提供大眾的,普通的功能;而很多時候無法滿足我們實際工作的需要,此時我們就需要編寫我們自己的函數了。好了,開始我們函數的學習之旅吧。
先實實在在的寫上一個函數,看看函數在Oracle中到底是什麼樣子的。
create or replace function func_test(param1 number default 20)return number
is
val number;begin
val := 20;
if param1 >= val then
return(param1);
else
return(val);
end if;end;
這就是一個簡單的函數,其中func_test是函數的名字,括號中的內容和存儲過程一樣,都是參數。return number
表示函數返回值的數據類型是number
類型;由於函數必須要有返回值,所以可以看到代碼中的return(val)
語句。
在PL/SQL中定義一個函數就是如此的簡單,只需要記住一點——必須要有返回值。
就像我們寫C++、Java代碼一樣,寫完以後都需要編譯。在PL/SQL Developer中,直接單擊Execute
就可以完成編譯;而在命令行中使用命令alter function ... compile
對函數進行編譯,比如:
SQL> alter function func_test compile;
我們定義的函數終歸到底還是提供給別人調用的,我們可以在SQL語句中調用函數、在賦值語句中調用函數、在表達式中調用函數。下面就說幾種常用的調用方式。
select func_test from dual; -- 函數無參數,或參數有默認值時,可以不寫括號select func_test(30) from dual; -- 函數有參數,並且沒有默認值時,必須傳遞參數
這樣就是直接在SQL語句中調用函數,就可以直接得到函數的返回值。
-- Created on 8/30/2015 by JELLY
declare
-- Local variables here
i integer;begin
-- Test statements here
i := func_test();
dbms_output.put_line(i);end;
-- Created on 8/30/2015 by JELLY
declare
-- Local variables here
i integer;begin
-- Test statements here
if func_test(200) > 100 then
dbms_output.put_line('Larger than 100');
else
dbms_output.put_line('Less than 100');
end if;end;
當發現有一個函數寫的非常垃圾時,實在不能忍受這樣的垃圾代碼時,你可以直接干掉它。
drop function func_test;
現在你的世界變的清靜了。
總結了這麼多,其實你會發現定義一個函數就像在C++、Java中定義一個函數那樣簡單,前提是你需要知道你要干什麼。將之前學習到的PL/SQL知識在編寫函數時盡情的運用出來吧。