【问题标题】: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 来实现这一目标?

请指导我。

【问题讨论】:

    标签: sql oracle plsql informatica informatica-powercenter


    【解决方案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
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-08-28
          • 2015-11-22
          • 1970-01-01
          • 1970-01-01
          • 2018-12-18
          • 1970-01-01
          • 2014-02-07
          • 2011-08-27
          相关资源
          最近更新 更多