2014-02-24 32 views
3

如果星期几在星期二至星期六之间,我想编写一个截断特定表的函数。我尝试了下面的代码,但if条件不起作用。有人能帮助我吗?平日截断表的函数

create or replace FUNCTION TRUNCATE_TABLE RETURN NUMBER 
IS 
    --DECLARE VARIABLES 
    l_day_of_week VARCHAR2(15); 
    l_table_name CONSTANT VARCHAR2(40) := 'ABC'; 

BEGIN 

    EXECUTE IMMEDIATE 'select (to_char(sysdate,''DaY'')) from dual ' 
    INTO l_day_of_week ; 

    IF l_day_of_week in ('Monday','Tuesday','Wednesday', 
         'Thursday','Friday','Saturday') 
    THEN 
    EXECUTE IMMEDIATE 'TRUNCATE TABLE ABC' ; 
    dbms_output.put_line(l_day_of_week); 
    END IF; 

    RETURN 0; 

END; 
+0

只需添加'TRIM(l_day_of_week)' –

回答

4
IF TRIM(l_day_of_week) in ('Monday','Tuesday','Wednesday', 
         'Thursday','Friday','Saturday') 

的默认返回值类型是像CHAR(9) ..
9是最大长度一周中的某一天(星期四)

所以Monday会加上空格!!除非你使用FMDAY

因此,TRIM()会删除所有填充的尾随空格!

你可以试着从下面的例子与使用 'FM'(Format Mask

随着出FM

SQL> select to_char(sysdate+level,'Day'),length(to_char(sysdate+level,'Day')) as length from dual 
    2 connect by level <= 7; 

TO_CHAR(SYSDATE+LEVEL,'DAY')    LENGTH 
------------------------------------ ---------- 
Tuesday          9 
Wednesday          9 
Thursday          9 
Friday          9 
Saturday          9 
Sunday          9 
Monday          9 

7 rows selected. 

带FM

SQL> select to_char(sysdate+level,'FMDAY'),length(to_char(sysdate+level,'FMDaY')) as length from dual 
    2 connect by level <= 7; 

TO_CHAR(SYSDATE+LEVEL,'FMDAY')   LENGTH 
------------------------------------ ---------- 
TUESDAY          7 
WEDNESDAY          9 
THURSDAY          8 
FRIDAY          6 
SATURDAY          8 
SUNDAY          6 
MONDAY          6 

7 rows selected. 

最后,

l_day_of_week = to_char(sysdate,'DaY')

会不会,您保存动态SQL调用!

+0

哦,我的上帝..非常感谢。从来不知道这可能是一个修剪问题..我的疑问就像我 - 从来没有做任何修剪:)但再次感谢 – user3346563

3

假设你要每天一次截断此表,我会使用一个DBMS_SCHEDULER工作,并把日期逻辑的工作中:

create or replace PROCEDURE TRUNCATE_TABLE  
IS 
BEGIN 
    EXECUTE IMMEDIATE 'TRUNCATE TABLE ABC' ; 
END; 

begin 
    dbms_scheduler.create_job(
     job_name => 'JOB_TRUNCATE_TABLE' 
    ,job_type => 'PLSQL_BLOCK' 
    ,job_action => 'begin truncate_table; end; ' 

    ,start_date  => to_timestamp_tz('2014-02-24 05:00:00 Europe/Berlin', 
             'yyyy-mm-dd hh24:mi:ss tzr') 
    ,repeat_interval => 'FREQ=DAILY;BYHOUR=22;BYDAY=Mon,Tue,Wed,Thu,Fri' 
    ,enabled => TRUE 
    ,comments => 'Truncate table job, runs Monday to Friday at 22:00'); 
end; 
+0

其实没有。我会从informatica presession调用这个函数。所以不是日程安排的工作 – user3346563