我有两个表: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
。这些方法似乎导致出现更多错误。我错过了什么,我应该改变什么来解决这个问题?
答案 0 :(得分:2)
无需在TO_DATE
或CURRENT_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