oracle 函數寫法 總結


1:首先看創建一個函數

  給定一個日期,判斷是否是休息日.

 1 create or replace function test(date_in in date)
 2     return int
 3 is
 4     num int;
 5     workflag varchar2(1);
 6 begin
 7     select count(*) into num from Sys_Holiday
 8         where to_char(TODAY,'yyyy-MM-dd')=to_char(date_in,'yyyy-MM-dd');
 9 
10     if (num>0) then
11         select WORKFLAG into workflag from Sys_Holiday
12             where to_char(TODAY,'yyyy-MM-dd')=to_char(date_in,'yyyy-MM-dd');
13         if (workflag='W') then
14             return 0;
15         else
16             return 1;
17         end if;
18     else
19         select to_char(date_in,'D') into num from dual;
20         if (num=7 or num=1) then
21             return 1;
22         else
23             return 0;
24         end if;
25     end if;
26 end;

2:另外一個函數調用這個函數,一個日期增加或減少多少天對應的日期(工作日)

 1 CREATE OR REPLACE FUNCTION getWorkDayADD( datetime in date,workday in int) return date
 2 is
 3     dayflag int; --初始值,寫循環
 4     sumflag int; --判斷值
 5     datetime1 date;
 6     workday1  int;
 7     sysdateadd date;
 8     daynum    int;
 9     sysdatelast date; --返回值
10 begin
11     datetime1 :=datetime;
12     workday1 := workday;
13     dayflag :=0;
14     sumflag :=1;
15     if(workday1>0) --加減多少來決定
16         then
17             while (sumflag=workday1) loop
18                  dayflag := dayflag+1;
19                  select datetime1+dayflag into sysdateadd from dual;
20                  daynum :=test(sysdateadd);
21                        if(daynum=1)then
22                          sumflag :=sumflag;
23                        else
24                          sumflag :=sumflag+1;
25                        end if;
26             end loop;    
27          else
28              while (sumflag=workday1) loop
29                    dayflag := dayflag+1;
30                  select datetime1-dayflag into sysdateadd from dual;
31                  daynum :=test(sysdateadd);
32                        if(daynum=1)then
33                          sumflag :=sumflag;
34                        else
35                          sumflag :=sumflag+1;
36                        end if;
37               end loop;
38            
39       end if;
40   if(workday1>0) then
41         select datetime1+dayflag into sysdatelast  from dual;
42        else
43         select datetime1-dayflag into sysdatelast  from dual;
44     end if;       
45   
46   return (sysdatelast);
47 end getWorkDayADD;

3 編寫一個簡單的存儲過程調用以上的函數

 1 create or replace procedure x is
 2   c date;
 3   datetime date;
 4   begin
 5     select sysdate into datetime from dual;    
 6     dbms_output.put_line(datetime);
 7     dbms_output.put_line('1231');
 8    c := getWorkDayADD(datetime,3);
 9    dbms_output.put_line(c);
10    end;

4 執行存儲過程

sql>exec x;


免責聲明!

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



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