如果 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 中截断整个表的主要内容,如果未能解决你的问题,请参考以下文章