如果 TO_CHAR(SYSDATE,'DD')='01' 在 SQL 中截断整个表

Posted

技术标签:

【中文标题】如果 TO_CHAR(SYSDATE,\'DD\')=\'01\' 在 SQL 中截断整个表【英文标题】:TRUNCATE whole table if TO_CHAR(SYSDATE,'DD')='01' in SQL如果 TO_CHAR(SYSDATE,'DD')='01' 在 SQL 中截断整个表 【发布时间】:2020-03-24 09:35:29 【问题描述】:

我在一个表中有大量记录(120 万多条记录),每天的记录都会被相应地插入/更新。

现在,我有一个新的业务需求。

要求如下,

如果 CURRENT_DAY 是 01,即每个月的第一天, 表将被截断,如果不是,则常规插入/更新作业 将继续。

我从INFORMATICA ETL端解决了,逻辑如下,

SQ: SELECT * FROM SOME_TABLE WHERE 1=2

即,没有任何来源记录

SQ > EXP > NEW OUTPUT PORT > TO_CHAR(SYSDATE,'DD') - CURR_DAY

现在,

EXP > RTR > NEW GROUP > CURR_DAY = '01'

那么,

RTR > NEW GROUP > TGT > SESSION PROPERTIES > ENABLED TRUNCATE

这样,要求就满足了。

但是,我想知道是否有任何其他方法可以仅使用 PURE PL/SQL 或 SQL 来实现这一目标?

请指导我。

【问题讨论】:

【参考方案1】:

你可以使用PL/SQL如下:

BEGIN
IF TRUNC(SYSDATE) = TRUNC(SYSDATE,'MON') THEN
EXECUTE IMMEDIATE 'TRUNCATE TABLE YOUR_TABLE';
END IF;
END;
/

【讨论】:

【参考方案2】:

使用Decision Task 检查是否是一个月的第一天。如果是,请运行一个启用了truncate target table 选项的虚拟会话,并在 SQ 上进行一些虚拟查询(如select 1 from dual where 1=2。接下来,将其连接到您的常规数据加载会话。 将Decision 连接到具有False 条件的相同常规数据加载会话,以使其在不是一个月的第一天时直接运行。

Start --> Decision (is 1st?) ---yes---> s_trunc
                            \                  \
                             \------no--------> s_regular_load

【讨论】:

【参考方案3】:

您可以通过两种方式截断表格。您可以使用预查询使用以下条件删除表。

delete from table where to_char(sysdate, 'DD') = '01'; -- You can also use required date instead of sysdate

或者您可以创建一个过程来截断具有相同条件的表

【讨论】:

以上是关于如果 TO_CHAR(SYSDATE,'DD')='01' 在 SQL 中截断整个表的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE TO_CHAR(SYSDATE,'D')

sql常用sysdate整理

oracle to_char处理日期

Oracle中获取系统时间前一天的函数为sysdate - interval '1' day

oracle 时间

Oracle中的转换函数