Beruflich Dokumente
Kultur Dokumente
Description
Batch purge process fails against FK violation.
Instructions to Re-create
Run the Batch Purge process.
The process aborts with errors similar to the following:
ORA-02292: integrity constraint (RMS120.IOH_DRC_FK) violated – child record found
Resolution
BatchPurge.java
Added missing calls to delete child records for other tables with foreign key relationships to IM_DOC_HEAD.
Scripts to Run
N/A
Old Code
BatchPurge.java
…
protected void purgeImDocHeadTable(Statement stmt, String[] userWhere) throws ReIMException {
purgeTable(stmt, false, "IM_EDI_RJT_DOC_DTL_AUDIT", userWhere[0]);
purgeTable(stmt, false, "IM_EDIRJT_DOCDTL_ALW_AUDIT", userWhere[0]);
purgeTable(stmt, false, "IM_EDI_RJT_DOC_NM_AUDIT", userWhere[0]);
purgeTable(stmt, true, "IM_EDI_RJT_DOC_HEAD_AUDIT A", userWhere[1]);
purgeImDocHeadDescendants(stmt, userWhere[2]);
Page 1 of 4
purgeImDocHeadDescendants(stmt, userWhere[3]);
purgeTable(
stmt,
false,
"IM_QTY_DISCREPANCY_ROLE",
"QTY_DISCREPANCY_ID IN (SELECT QTY_DISCREPANCY_ID from IM_QTY_DISCREPANCY WHERE
DOC_ID IN (SELECT DOC_ID from IM_DOC_HEAD WHERE "
+ userWhere + "))");
…
purgeTable(stmt, false, "IM_FINANCIALS_STAGE",
"(DOC_ID) IN (SELECT DOC_ID from IM_DOC_HEAD WHERE " + userWhere + ")");
purgeTable(
stmt,
false,
"IM_QTY_DISCREPANCY",
"(DOC_ID) IN (SELECT DOC_ID from IM_DOC_HEAD WHERE "
+ userWhere
+ ") AND NOT EXISTS (SELECT 1 FROM IM_QTY_DISCREPANCY_ROLE B WHERE
B.QTY_DISCREPANCY_ID=IM_QTY_DISCREPANCY.QTY_DISCREPANCY_ID) AND NOT EXISTS (SELECT 1 FROM
IM_QTY_DISCREPANCY_RECEIPT B WHERE B.QTY_DISCREPANCY_ID=IM_QTY_DISCREPANCY.QTY_DISCREPANCY_ID)");
purgeTable(stmt, false, "IM_DOC_DETAIL_REASON_CODES",
"(DOC_ID) IN (SELECT DOC_ID from IM_DOC_HEAD WHERE " + userWhere + ")");
purgeTable(stmt, false, "IM_FINANCIALS_STAGE_ERROR",
"(DOC_ID) IN (SELECT DOC_ID from IM_DOC_HEAD WHERE " + userWhere + ")");
purgeTable(stmt, false, "IM_DOC_NON_MERCH",
"(DOC_ID) IN (SELECT DOC_ID from IM_DOC_HEAD WHERE " + userWhere + ")");
purgeTable(stmt, false, "IM_COMPLEX_DEAL_DETAIL",
"(DOC_ID) IN (SELECT DOC_ID from IM_DOC_HEAD WHERE " + userWhere + ")");
purgeTable(stmt, false, "IM_FIXED_DEAL_DETAIL",
"(DOC_ID) IN (SELECT DOC_ID from IM_DOC_HEAD WHERE " + userWhere + ")");
purgeTable(stmt, false, "IM_CN_DETAIL_MATCH_HIS",
"(DOC_ID) IN (SELECT DOC_ID from IM_DOC_HEAD WHERE " + userWhere + ")");
purgeTable(stmt, false, "IM_CN_SUMMARY_MATCH_HIS",
"(DOC_ID) IN (SELECT DOC_ID from IM_DOC_HEAD WHERE " + userWhere + ")");
}
…
New Code
BatchPurge.java
Page 2 of 4
…
protected void purgeImDocHeadTable(Statement stmt, String[] userWhere) throws ReIMException {
purgeTable(stmt, false, "IM_EDI_RJT_DOC_DTL_AUDIT", userWhere[0]);
purgeTable(stmt, false, "IM_EDIRJT_DOCDTL_ALW_AUDIT", userWhere[0]);
purgeTable(stmt, false, "IM_EDI_RJT_DOC_NM_AUDIT", userWhere[0]);
purgeTable(stmt, true, "IM_EDI_RJT_DOC_HEAD_AUDIT A", userWhere[1]);
purgeImDocHeadDescendants(stmt, userWhere[2]);
purgeImDocHeadDescendants(stmt, userWhere[3]);
…
purgeTable(
stmt,
false,
"IM_QTY_DISCREPANCY",
"(DOC_ID) IN (SELECT DOC_ID from IM_DOC_HEAD WHERE " + userWhere + ") "
+ "AND NOT EXISTS (SELECT 1 FROM IM_QTY_DISCREPANCY_ROLE B "
+ "WHERE B.QTY_DISCREPANCY_ID=IM_QTY_DISCREPANCY.QTY_DISCREPANCY_ID) "
+ "AND NOT EXISTS (SELECT 1 FROM IM_QTY_DISCREPANCY_RECEIPT B "
+ "WHERE B.QTY_DISCREPANCY_ID=IM_QTY_DISCREPANCY.QTY_DISCREPANCY_ID)"
+ "AND NOT EXISTS (SELECT 1 FROM IM_QTY_DISCREPANCY_CNR B "
+ "WHERE B.QTY_DISCREPANCY_ID=IM_QTY_DISCREPANCY.QTY_DISCREPANCY_ID)");
purgeTable(stmt, false, "IM_FINANCIALS_STAGE_ERROR",
"(DOC_ID) IN (SELECT DOC_ID from IM_DOC_HEAD WHERE " + userWhere + ")");
purgeTable(stmt, false, "IM_DOC_NON_MERCH",
"(DOC_ID) IN (SELECT DOC_ID from IM_DOC_HEAD WHERE " + userWhere + ")");
Page 3 of 4
purgeTable(stmt, false, "IM_COMPLEX_DEAL_DETAIL",
"(DOC_ID) IN (SELECT DOC_ID from IM_DOC_HEAD WHERE " + userWhere + ")");
purgeTable(stmt, false, "IM_FIXED_DEAL_DETAIL",
"(DOC_ID) IN (SELECT DOC_ID from IM_DOC_HEAD WHERE " + userWhere + ")");
purgeTable(stmt, false, "IM_CN_DETAIL_MATCH_HIS",
"(DOC_ID) IN (SELECT DOC_ID from IM_DOC_HEAD WHERE " + userWhere + ")");
purgeTable(stmt, false, "IM_CN_SUMMARY_MATCH_HIS",
"(DOC_ID) IN (SELECT DOC_ID from IM_DOC_HEAD WHERE " + userWhere + ")");
purgeTable(stmt, false, "IM_DOC_DETAIL_REASON_CODES",
"(DOC_ID) IN (SELECT DOC_ID from IM_DOC_HEAD WHERE " + userWhere + ")");
}
…
Page 4 of 4