【问题标题】:Function to truncate table on weekdays在工作日截断表格的功能
【发布时间】:2014-02-24 12:13:31
【问题描述】:

如果一周中的某一天在星期二到星期六之间,我想编写一个函数来截断特定的表。我尝试了以下代码,但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;

【问题讨论】:

  • TRIM(l_day_of_week)

标签: oracle plsql oracle11g


【解决方案1】:
IF TRIM(l_day_of_week) in ('Monday','Tuesday','Wednesday',
                       'Thursday','Friday','Saturday') 

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

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

所以,TRIM() 将删除所有填充的尾随空格!

您可以使用 'FM' (Format Mask) 试用下面的演示

没有调频

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.

带调频

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 调用!

【讨论】:

  • 天啊.. 非常感谢。从来不知道这可能是一个修剪问题..我的问题就像我一样——从不做任何修剪:) 但是再次感谢
【解决方案2】:

假设您想每天截断此表一次,我将使用 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;

【讨论】:

  • 实际上没有。我会从 informatica presession 中调用这个函数。所以不是计划工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-08
  • 1970-01-01
相关资源
最近更新 更多