【轉】Oracle 自定義函數語法與實例


原文地址:https://blog.csdn.net/libertine1993/article/details/47264211

Oracle自定義函數的語法如下:

[sql]  view plain copy
  1. create or replace function 函數名(參數1 模式 參數類型)  
  2. return 返回值類型  
  3. as  
  4. 變量1 變量類型;  
  5. 變量2 變量類型;  
  6. begin  
  7.     函數體;  
  8. end 函數名;  

 

參數的模式有3種:(如果沒有注明, 參數默認的類型為 in.)

in: 為只讀模式, 在函數中, 參數的值只能被引用, 不能被改變;

out: 為只寫模式, 只能被賦值, 不能被引用;

in out:  可讀可寫.

提醒:
1.在Oracle自定義函數中, else if 的正確寫法是 elsif 而不是 else if
2.使用 if 需要加 then  "if 條件 then 操作"

 

簡單的例子: 讀入兩個值, 返回比較大的值

[sql]  view plain copy
  1. create or replace function function1(para1 in number, para2 in number)   
  2. return number   
  3. as   
  4. begin  
  5.   if para1 > para2 then  
  6.       return para1;  
  7.   else  
  8.       return para2;   
  9.   end if;  
  10. end function1;  

使用:

[sql]  view plain copy
  1. select function1(666, 333) from dual;  


結果:

 

另一個例子可能在實際中會用到, 有時候我們需要按非自然月進行數據統計, 這種時候我們只需要寫一個自定義的函數處理日期就行了.

函數說明: 讀入date型日期, 大於15號的歸入下一個月, 小於等於15號歸入本月

[sql]  view plain copy
  1. create or replace function fn_mymonth(oridate in date)  
  2. return varchar2  
  3. as  
  4.   oriday number;  
  5.   orimonth number;  
  6.   oriyear number;   
  7. begin  
  8.   oriday := to_number(to_char(oridate, 'dd'));  
  9.   orimonth := to_number(to_char(oridate, 'mm'));  
  10.   oriyear := to_number(to_char(oridate, 'yyyy'));  
  11.    
  12.   if oriday <= 15 then                              --少於等於15號屬於本月  
  13.     return to_char(oridate, 'yyyymm');  
  14.   else  
  15.     if orimonth <= 8 then                           -- 日 <=8 則+1后轉char還要補0,單獨出來作為一種情況  
  16.       return to_char(oriyear)||'0'||to_char(orimonth + 1);  
  17.     elsif( orimonth <= 11 ) then                    -- 日 <= 11則+1后不會跨年,轉char不需要補零, 單獨出來作為一種情況  
  18.       return to_char(oriyear)||to_char(orimonth + 1);  
  19.     else                                            -- 最后一種情況就是跨年, 改變年份, 月份補零就行  
  20.       return to_char(oriyear + 1)||'0'||to_char(orimonth - 11);  
  21.     end if;  
  22.   end if;  
  23. end fn_mymonth;  


使用與結果:

[sql]  view plain copy
  1. select fn_mymonth(to_date('2015-12-14', 'yyyy-mm-dd')) from dual;  

[sql]  view plain copy
  1. select fn_mymonth(to_date('2015-12-15', 'yyyy-mm-dd')) from dual;  

 

[sql]  view plain copy
  1. select fn_mymonth(to_date('2015-12-16', 'yyyy-mm-dd')) from dual;  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM