Merge Error Logging Question
803690Jan 25 2011 — edited Jan 26 2011Hi there,
I am using a merge to update or insert rows into a table. I know that I could get bad data in the load table and I put log error into the merge statement, so that If I did a to_date it would handle it. The problem I am having is that I cannot get the error logging to fire. I am getting an ORA-1858 message complaining about the date which is cool, but I want it to go into the error table.
Or am I barking up the wrong tree.
Here is the table I am taking the data from
CREATE TABLE SICKLE_RAW
(
ENTRY_ID NUMBER(9) NULL,
KEY VARCHAR2(50 BYTE) NULL,
OLD_VALUE VARCHAR2(100 BYTE) NULL,
NEW_VALUE VARCHAR2(100 BYTE) NULL,
DATA_ITEM NUMBER(5) NULL,
DATA_ITEM_NAME VARCHAR2(100 BYTE) NULL,
USER_ID VARCHAR2(100 BYTE) NULL,
USER_TYPE VARCHAR2(100 BYTE) NULL,
CHANGE_DATE VARCHAR2(200 BYTE) NULL,
LAST_TIMESTAMP VARCHAR2(200 BYTE) NULL,
LAST_USER VARCHAR2(200 BYTE) NULL,
LAST_USER_TYPE VARCHAR2(200 BYTE) NULL
)
Here is a row of dodgy data
Insert into SICKLE_RAW
(ENTRY_ID, KEY, OLD_VALUE, NEW_VALUE, DATA_ITEM_NAME, USER_ID, USER_TYPE, CHANGE_DATE, LAST_TIMESTAMP, LAST_USER, LAST_USER_TYPE)
Values
(391691, 'GLE2E', 'file1', 'file2',
'114', 'Permitted Files', 'Ann Campbell', 'Editor', '24/01/2011 17:36',
'2011-01-24.17:36:46', 'Ann Campbell');
COMMIT;
Here is the table I am merging TO :-
CREATE TABLE METRICS.ATTRIBUTE_VALUE
(
SOURCE_SYSTEM_ID NUMBER NOT NULL,
ENTRY_DATE DATE NOT NULL,
UPDATE_USER_ID VARCHAR2(50 BYTE) NOT NULL,
PREVIOUS_USER_ID VARCHAR2(50 BYTE) NULL,
QA VARCHAR2(1 BYTE) NULL,
ATTRIBUTE_INSTANCE_ID NUMBER(20) NULL,
ATTRIBUTE_NAME VARCHAR2(100 BYTE) NULL,
METHOD VARCHAR2(100 BYTE) NULL,
RECORD_COUNT NUMBER(7) NOT NULL,
ATTRIBUTE_TYPE VARCHAR2(100 BYTE) NULL
)
the error table :-
CREATE TABLE PROCESSING_ERRORS
(
ORA_ERR_ROWID$ ROWID NULL,
ORA_ERR_NUMBER$ NUMBER NULL,
ORA_ERR_OPTYP$ VARCHAR2(2 BYTE) NULL,
ORA_ERR_TAG$ VARCHAR2(2000 BYTE) NULL,
ORA_ERR_MESG$ VARCHAR2(2000 BYTE) NULL,
ENTRY_DATE VARCHAR2(100 BYTE) NULL
)
And lastly the merge
merge into metrics.attribute_value av
using(
select * from (
select 7 system_id, key,
data_item,
data_item_name,
user_id,
user_type,
trunc(to_date(CHANGE_DATE,'dd/mm/yyyy hh24:mi')) change_date,
'N',
count(*) total
from SICKLE_RAW bc
group by key,
data_item,
data_item_name,
user_id,
user_type,
trunc(to_date(CHANGE_DATE,'dd/mm/yyyy hh24:mi')) )) bcr
on (AV.ENTRY_DATE = bcr.change_date
and bcr.user_id = av.update_user_id
and bcr.data_item_name = AV.ATTRIBUTE_NAME
and bcr.system_id = av.source_system_id
and bcr.data_item = av.attribute_instance_id
)
when matched then update
set av.record_count = av.record_count + bcr.total
when not matched then INSERT (SOURCE_system_id,ENTRY_DATE,update_user_id,record_count,qa,ATTRIBUTE_NAME,attribute_instance_id)
VALUES
(bcr.system_id,bcr.CHANGE_DATE,bcr.user_id,bcr.total,'N',bcr.data_item_name,bcr.data_item)
log errors into metrics.processing_errors REJECT LIMIT UNLIMITED
Any help would be greatly appreciated.