I'm running Oracle 11.2.0.3 on RHEL 5.7.
I have two tables....
- HORIZON.PROGRAM_CONTENT (parent) - not version enabled
- HORIZON.OUTBOX (child) - version enabled
I want to clear out both of these tables, so I first remove the child records, then parent records, but the delete on the parent fails...
DEV: HORIZON > select * from user_wm_ric_info where ric_name = 'FK_OUTBOX_PROGRAM_CONTENT_ID';
CT_OWNER CT_NAME PT_OWNER PT_NAME RIC_NAME CT_COLS PT_COLS R_CONSTRAINT_NAME DELETE_RULE STATUS
---------- -------- ---------- --------------- ---------------------------------------- -------------------- -------- ---------------------------------------- ------------ --------
HORIZON OUTBOX HORIZON PROGRAM_CONTENT FK_OUTBOX_PROGRAM_CONTENT_ID PROGRAM_CONTENT_ID ID PROGRAM_CONTENT_ID_PK R ENABLED
1 row selected.
DEV: HORIZON > select count(*) from program_content;
COUNT(*)
----------
904
1 row selected.
DEV: HORIZON > select count(*) from outbox where program_content_id in (select id from program_content);
COUNT(*)
----------
3052
1 row selected.
DEV: HORIZON > delete from outbox;
3089 rows deleted.
DEV: HORIZON > delete from program_content;
delete from program_content
*
ERROR at line 1:
ORA-20005: integrity constraint (HORIZON.FK_OUTBOX_PROGRAM_CONTENT_ID) violated - child record found
ORA-06512: at "WMSYS.WM_ERROR", line 324
ORA-06512: at "WMSYS.WM_ERROR", line 348
ORA-06512: at "HORIZON.LT_AD_19", line 27
ORA-04088: error during execution of trigger 'HORIZON.LT_AD_19'
I look at the trigger code on this table....
CREATE OR REPLACE TRIGGER "HORIZON"."LT_AD_19" AFTER
DELETE ON HORIZON.PROGRAM_CONTENT FOR EACH ROW DECLARE dummy INTEGER;
dependent_rows BOOLEAN;
ricLockStatus INTEGER;
dummyLockStatus INTEGER;
BEGIN
wmsys.lt_ctx_pkg.initializeRicLockingVars;
ricLockStatus := wmsys.lt_ctx_pkg.request(10000005,3, wmsys.lt_ctx_pkg.MAXWAIT, true);
IF ( ricLockStatus = 0 ) THEN
wmsys.lt_ctx_pkg.addToRicLocksList( 'HORIZON.PROGRAM_CONTENT', 'RE' );
ELSE
IF ( ricLockStatus = 4 ) THEN
IF ( wmsys.lt_ctx_pkg.hasRicLockOn('HORIZON.PROGRAM_CONTENT', 'S')) THEN
ricLockStatus := wmsys.lt_ctx_pkg.request(10000006, 6, 0, true);
IF ( ricLockStatus != 0 AND ricLockStatus != 4 ) THEN
WMSYS.WM_ERROR.RAISEERROR(WMSYS.LT.WM_ERROR_171_NO, 'deadlock detected while trying to acquire lock on HORIZON.PROGRAM_CONTENT');
END IF;
ricLockStatus := wmsys.lt_ctx_pkg.convert(10000005, 6, wmsys.lt_ctx_pkg.MAXWAIT);
IF ( ricLockStatus != 0 ) THEN
dummyLockStatus := wmsys.lt_ctx_pkg.release(10000006);
WMSYS.WM_ERROR.RAISEERROR(WMSYS.LT.WM_ERROR_171_NO, 'error while trying to acquire lock on HORIZON.PROGRAM_CONTENT, status = ' || ricLockStatus );
END IF;
END IF;
ELSE
WMSYS.WM_ERROR.RAISEERROR(WMSYS.LT.WM_ERROR_171_NO, 'error while trying to acquire lock on HORIZON.PROGRAM_CONTENT, status = ' || ricLockStatus );
END IF;
END IF;
BEGIN
dependent_rows := true;
SELECT 1
INTO dummy
FROM dual
WHERE EXISTS
(SELECT 1
FROM HORIZON.OUTBOX_LT
WHERE ((:OLD.ID = PROGRAM_CONTENT_ID))
AND delstatus >= 0
);
EXCEPTION
WHEN NO_DATA_FOUND THEN
dependent_rows := false;
WHEN OTHERS THEN
Raise;
END;
BEGIN
IF (dependent_rows) THEN
WMSYS.WM_ERROR.RAISEERROR(WMSYS.LT.WM_ERROR_5_NO, 'HORIZON', 'FK_OUTBOX_PROGRAM_CONTENT_ID');
END IF;
END;
END;
/
In the same session I query,....
DEV: HORIZON > select delstatus, count(*)
from outbox_lt
where program_content_id in (select id from program_content)
and delstatus >= 0
group by delstatus;
DELSTATUS COUNT(*)
---------- ----------
11 4
13 1
14 1
10 3052
12 1
16 1
15 1
7 rows selected.
Can someone explain this error and how to resolve it?