原文地址:https://blog.csdn.net/libertine1993/article/details/47264211
Oracle自定義函數的語法如下:
- create or replace function 函數名(參數1 模式 參數類型)
- return 返回值類型
- as
- 變量1 變量類型;
- 變量2 變量類型;
- begin
- 函數體;
- end 函數名;
參數的模式有3種:(如果沒有注明, 參數默認的類型為 in.)
in: 為只讀模式, 在函數中, 參數的值只能被引用, 不能被改變;
out: 為只寫模式, 只能被賦值, 不能被引用;
in out: 可讀可寫.
提醒:
1.在Oracle自定義函數中, else if 的正確寫法是 elsif 而不是 else if
2.使用 if 需要加 then "if 條件 then 操作"
簡單的例子: 讀入兩個值, 返回比較大的值
- create or replace function function1(para1 in number, para2 in number)
- return number
- as
- begin
- if para1 > para2 then
- return para1;
- else
- return para2;
- end if;
- end function1;
使用:
- select function1(666, 333) from dual;
結果:
另一個例子可能在實際中會用到, 有時候我們需要按非自然月進行數據統計, 這種時候我們只需要寫一個自定義的函數處理日期就行了.
函數說明: 讀入date型日期, 大於15號的歸入下一個月, 小於等於15號歸入本月
- create or replace function fn_mymonth(oridate in date)
- return varchar2
- as
- oriday number;
- orimonth number;
- oriyear number;
- begin
- oriday := to_number(to_char(oridate, 'dd'));
- orimonth := to_number(to_char(oridate, 'mm'));
- oriyear := to_number(to_char(oridate, 'yyyy'));
- if oriday <= 15 then --少於等於15號屬於本月
- return to_char(oridate, 'yyyymm');
- else
- if orimonth <= 8 then -- 日 <=8 則+1后轉char還要補0,單獨出來作為一種情況
- return to_char(oriyear)||'0'||to_char(orimonth + 1);
- elsif( orimonth <= 11 ) then -- 日 <= 11則+1后不會跨年,轉char不需要補零, 單獨出來作為一種情況
- return to_char(oriyear)||to_char(orimonth + 1);
- else -- 最后一種情況就是跨年, 改變年份, 月份補零就行
- return to_char(oriyear + 1)||'0'||to_char(orimonth - 11);
- end if;
- end if;
- end fn_mymonth;
使用與結果:
- select fn_mymonth(to_date('2015-12-14', 'yyyy-mm-dd')) from dual;
- select fn_mymonth(to_date('2015-12-15', 'yyyy-mm-dd')) from dual;
- select fn_mymonth(to_date('2015-12-16', 'yyyy-mm-dd')) from dual;