尝试建立一个触发器,在每次更新后对行进行计数

时间:2018-06-14 20:29:30

标签: oracle plsql apex

我有两个表:SKN_ENJIN和SKN_ENJIN_COUNT

SKN_ENJIN会跟踪用户名和电子邮件。 SKN_ENJIN_COUNT用于填充仪表板报告的图表。

我今天早些时候创建了这个触发器:

create or replace trigger "BI_SKN_ENJIN_COUNT_TG" 
  after insert or update or delete on "SKN_ENJIN"               

  DECLARE
  mCount    NUMBER;
  mDate     DATE;

begin 

  select COUNT(ID) into mCount from SKN_ENJIN where Status = 1;

  select TO_DATE(CURRENT_DATE, 'DD-MM-YYYY') into mDate from dual;

  MERGE INTO SKN_ENJIN_COUNT c
      USING dual d
      ON (c.Count_date = mDate)
    WHEN MATCHED THEN
      UPDATE SET c.Member_count = mCount
    WHEN NOT MATCHED THEN
      INSERT (Count_date, Member_count)
      VALUES (mDate, mCount);
end;

直到大约10分钟前,触发器工作得非常好。突然,触发器开始抛出ORA-01843: not a valid month

我尝试将CURRENT_DATE更改为SYSDATE(),我尝试将TO_DATE更改为TO_CHAR。这些方法似乎导致出现更多错误。我错过了什么,我应该改变什么来解决这个问题?

2 个答案:

答案 0 :(得分:2)

无需在TO_DATECURRENT_DATE上致电SYSDATE。这些函数已经返回DATE s,因此无需进行任何转换。

事实上,在已经TO_DATE的内容上调用DATE会强制Oracle使用NLS设置(NLS_DATE_FORMAT)将其转换为字符串,然后使用NLS设置将其转换回日期给定的日期格式图片。如果您使用的日期格式图片与NLS_DATE_FORMAT不匹配,则可能会出现错误或错误值。

而不是写

  select TO_DATE(CURRENT_DATE, 'DD-MM-YYYY') into mDate from dual;

你可以写

  select CURRENT_DATE into mDate from dual;

或只是

  mDate := CURRENT_DATE;

我不知道Count_date表中SKN_ENJIN_COUNT列的类型是什么,但如果是DATE,则同样不正确地调用TO_DATE在它上面。

答案 1 :(得分:0)

我想我找到了一个解决方案,同时绊倒了我的方式 。似乎日期的格式非常重要。早些时候我的格式是DD-MM-YYYY,当我使用MM-DD-YYYY时,只需轻轻一点重构(ON (TO_DATE(c.Count_date, 'MM-DD-YYYY') = TO_DATE(mDate, 'MM-DD-YYYY'))脚本就可以毫不费力地工作。

  select COUNT(ID) into mCount from SKN_ENJIN where Status = 1;

  select sysdate into mDate from dual;

  MERGE INTO SKN_ENJIN_COUNT c
      USING dual d
      ON (TO_DATE(c.Count_date, 'MM-DD-YYYY') = TO_DATE(mDate, 'MM-DD-YYYY'))
    WHEN MATCHED THEN
      UPDATE SET c.Member_count = mCount