feat(MARS-1409): Add prerequisite checks for MARS-1409 objects in installation script

This commit is contained in:
Grzegorz Michalski
2026-03-20 13:13:26 +01:00
parent eb9b2bc38b
commit 24997b1583
2 changed files with 156 additions and 65 deletions

View File

@@ -46,6 +46,16 @@ DECLARE
cMaxPrint CONSTANT NUMBER := 1000; cMaxPrint CONSTANT NUMBER := 1000;
vPrinted NUMBER; vPrinted NUMBER;
FUNCTION IS_EXTERNAL_TABLE_EMPTY_ERROR(
pSqlCode NUMBER,
pSqlErrm VARCHAR2
) RETURN BOOLEAN
IS
BEGIN
RETURN pSqlCode IN (-29913, -29400)
OR INSTR(pSqlErrm, 'KUP-05002') > 0;
END;
BEGIN BEGIN
FOR config_rec IN ( FOR config_rec IN (
@@ -79,7 +89,7 @@ BEGIN
INTO vTableExists; INTO vTableExists;
EXCEPTION EXCEPTION
WHEN OTHERS THEN WHEN OTHERS THEN
IF SQLCODE = -29913 THEN IF IS_EXTERNAL_TABLE_EMPTY_ERROR(SQLCODE, SQLERRM) THEN
vBucketEmpty := TRUE; vBucketEmpty := TRUE;
ELSE ELSE
RAISE; RAISE;
@@ -97,63 +107,80 @@ BEGIN
vInBothNoKey := 0; vInBothNoKey := 0;
ELSE ELSE
-- ---------------------------------------------------------------- BEGIN
-- [A] In ODS bucket but NOT in A_SOURCE_FILE_RECEIVED -- ----------------------------------------------------------------
-- ---------------------------------------------------------------- -- [A] In ODS bucket but NOT in A_SOURCE_FILE_RECEIVED
EXECUTE IMMEDIATE -- ----------------------------------------------------------------
'SELECT COUNT(DISTINCT t.file$name) ' || EXECUTE IMMEDIATE
'FROM ' || vTableName || ' t ' || 'SELECT COUNT(DISTINCT t.file$name) ' ||
'WHERE t.file$name IS NOT NULL ' || 'FROM ' || vTableName || ' t ' ||
' AND NOT EXISTS ( ' || 'WHERE t.file$name IS NOT NULL ' ||
' SELECT 1 FROM CT_MRDS.A_SOURCE_FILE_RECEIVED sfr ' || ' AND NOT EXISTS ( ' ||
' WHERE sfr.SOURCE_FILE_NAME = t.file$name ' || ' SELECT 1 FROM CT_MRDS.A_SOURCE_FILE_RECEIVED sfr ' ||
' AND sfr.A_SOURCE_FILE_CONFIG_KEY = :1)' ' WHERE sfr.SOURCE_FILE_NAME = t.file$name ' ||
INTO vOnlyInBucket ' AND sfr.A_SOURCE_FILE_CONFIG_KEY = :1)'
USING config_rec.A_SOURCE_FILE_CONFIG_KEY; INTO vOnlyInBucket
USING config_rec.A_SOURCE_FILE_CONFIG_KEY;
-- ---------------------------------------------------------------- -- ----------------------------------------------------------------
-- [B] In A_SOURCE_FILE_RECEIVED (targeted statuses) but NOT in ODS bucket -- [B] In A_SOURCE_FILE_RECEIVED (targeted statuses) but NOT in ODS bucket
-- ---------------------------------------------------------------- -- ----------------------------------------------------------------
EXECUTE IMMEDIATE EXECUTE IMMEDIATE
'SELECT COUNT(*) ' || 'SELECT COUNT(*) ' ||
'FROM CT_MRDS.A_SOURCE_FILE_RECEIVED sfr ' || 'FROM CT_MRDS.A_SOURCE_FILE_RECEIVED sfr ' ||
'WHERE sfr.A_SOURCE_FILE_CONFIG_KEY = :1 ' || 'WHERE sfr.A_SOURCE_FILE_CONFIG_KEY = :1 ' ||
' AND sfr.PROCESSING_STATUS IN (''VALIDATED'',''READY_FOR_INGESTION'',''INGESTED'',''ARCHIVED'',''ARCHIVED_AND_TRASHED'',''ARCHIVED_AND_PURGED'') ' || ' AND sfr.PROCESSING_STATUS IN (''VALIDATED'',''READY_FOR_INGESTION'',''INGESTED'',''ARCHIVED'',''ARCHIVED_AND_TRASHED'',''ARCHIVED_AND_PURGED'') ' ||
' AND NOT EXISTS ( ' || ' AND NOT EXISTS ( ' ||
' SELECT 1 FROM ' || vTableName || ' t ' || ' SELECT 1 FROM ' || vTableName || ' t ' ||
' WHERE t.file$name = sfr.SOURCE_FILE_NAME)' ' WHERE t.file$name = sfr.SOURCE_FILE_NAME)'
INTO vOnlyInDB INTO vOnlyInDB
USING config_rec.A_SOURCE_FILE_CONFIG_KEY; USING config_rec.A_SOURCE_FILE_CONFIG_KEY;
-- ---------------------------------------------------------------- -- ----------------------------------------------------------------
-- [C] In both, A_WORKFLOW_HISTORY_KEY IS NOT NULL -- [C] In both, A_WORKFLOW_HISTORY_KEY IS NOT NULL
-- ---------------------------------------------------------------- -- ----------------------------------------------------------------
EXECUTE IMMEDIATE EXECUTE IMMEDIATE
'SELECT COUNT(DISTINCT sfr.A_SOURCE_FILE_RECEIVED_KEY) ' || 'SELECT COUNT(DISTINCT sfr.A_SOURCE_FILE_RECEIVED_KEY) ' ||
'FROM CT_MRDS.A_SOURCE_FILE_RECEIVED sfr ' || 'FROM CT_MRDS.A_SOURCE_FILE_RECEIVED sfr ' ||
'WHERE sfr.A_SOURCE_FILE_CONFIG_KEY = :1 ' || 'WHERE sfr.A_SOURCE_FILE_CONFIG_KEY = :1 ' ||
' AND sfr.A_WORKFLOW_HISTORY_KEY IS NOT NULL ' || ' AND sfr.A_WORKFLOW_HISTORY_KEY IS NOT NULL ' ||
' AND sfr.PROCESSING_STATUS IN (''VALIDATED'',''READY_FOR_INGESTION'',''INGESTED'',''ARCHIVED'',''ARCHIVED_AND_TRASHED'',''ARCHIVED_AND_PURGED'') ' || ' AND sfr.PROCESSING_STATUS IN (''VALIDATED'',''READY_FOR_INGESTION'',''INGESTED'',''ARCHIVED'',''ARCHIVED_AND_TRASHED'',''ARCHIVED_AND_PURGED'') ' ||
' AND EXISTS ( ' || ' AND EXISTS ( ' ||
' SELECT 1 FROM ' || vTableName || ' t ' || ' SELECT 1 FROM ' || vTableName || ' t ' ||
' WHERE t.file$name = sfr.SOURCE_FILE_NAME)' ' WHERE t.file$name = sfr.SOURCE_FILE_NAME)'
INTO vInBothWithKey INTO vInBothWithKey
USING config_rec.A_SOURCE_FILE_CONFIG_KEY; USING config_rec.A_SOURCE_FILE_CONFIG_KEY;
-- ---------------------------------------------------------------- -- ----------------------------------------------------------------
-- [D] In both, A_WORKFLOW_HISTORY_KEY IS NULL -- [D] In both, A_WORKFLOW_HISTORY_KEY IS NULL
-- ---------------------------------------------------------------- -- ----------------------------------------------------------------
EXECUTE IMMEDIATE EXECUTE IMMEDIATE
'SELECT COUNT(DISTINCT sfr.A_SOURCE_FILE_RECEIVED_KEY) ' || 'SELECT COUNT(DISTINCT sfr.A_SOURCE_FILE_RECEIVED_KEY) ' ||
'FROM CT_MRDS.A_SOURCE_FILE_RECEIVED sfr ' || 'FROM CT_MRDS.A_SOURCE_FILE_RECEIVED sfr ' ||
'WHERE sfr.A_SOURCE_FILE_CONFIG_KEY = :1 ' || 'WHERE sfr.A_SOURCE_FILE_CONFIG_KEY = :1 ' ||
' AND sfr.A_WORKFLOW_HISTORY_KEY IS NULL ' || ' AND sfr.A_WORKFLOW_HISTORY_KEY IS NULL ' ||
' AND sfr.PROCESSING_STATUS IN (''VALIDATED'',''READY_FOR_INGESTION'',''INGESTED'',''ARCHIVED'',''ARCHIVED_AND_TRASHED'',''ARCHIVED_AND_PURGED'') ' || ' AND sfr.PROCESSING_STATUS IN (''VALIDATED'',''READY_FOR_INGESTION'',''INGESTED'',''ARCHIVED'',''ARCHIVED_AND_TRASHED'',''ARCHIVED_AND_PURGED'') ' ||
' AND EXISTS ( ' || ' AND EXISTS ( ' ||
' SELECT 1 FROM ' || vTableName || ' t ' || ' SELECT 1 FROM ' || vTableName || ' t ' ||
' WHERE t.file$name = sfr.SOURCE_FILE_NAME)' ' WHERE t.file$name = sfr.SOURCE_FILE_NAME)'
INTO vInBothNoKey INTO vInBothNoKey
USING config_rec.A_SOURCE_FILE_CONFIG_KEY; USING config_rec.A_SOURCE_FILE_CONFIG_KEY;
EXCEPTION
WHEN OTHERS THEN
IF IS_EXTERNAL_TABLE_EMPTY_ERROR(SQLCODE, SQLERRM) THEN
vBucketEmpty := TRUE;
vOnlyInBucket := 0;
SELECT COUNT(*) INTO vOnlyInDB
FROM CT_MRDS.A_SOURCE_FILE_RECEIVED sfr
WHERE sfr.A_SOURCE_FILE_CONFIG_KEY = config_rec.A_SOURCE_FILE_CONFIG_KEY
AND sfr.PROCESSING_STATUS IN ('VALIDATED','READY_FOR_INGESTION','INGESTED','ARCHIVED','ARCHIVED_AND_TRASHED','ARCHIVED_AND_PURGED');
vInBothWithKey := 0;
vInBothNoKey := 0;
DBMS_OUTPUT.PUT_LINE(' NOTE: ODS bucket became empty/inaccessible during diagnostics for ' || vTableName || '. Falling back to DB-only counts for [B].');
ELSE
RAISE;
END IF;
END;
END IF; -- vBucketEmpty END IF; -- vBucketEmpty
@@ -204,16 +231,43 @@ BEGIN
vConfigsWithIssues := vConfigsWithIssues + 1; vConfigsWithIssues := vConfigsWithIssues + 1;
DBMS_OUTPUT.PUT_LINE(' [B] Registered files not found in bucket:'); DBMS_OUTPUT.PUT_LINE(' [B] Registered files not found in bucket:');
vPrinted := 0; vPrinted := 0;
OPEN vRefCursor FOR BEGIN
'SELECT sfr.SOURCE_FILE_NAME, sfr.PROCESSING_STATUS, sfr.A_WORKFLOW_HISTORY_KEY ' || IF vBucketEmpty THEN
'FROM CT_MRDS.A_SOURCE_FILE_RECEIVED sfr ' || OPEN vRefCursor FOR
'WHERE sfr.A_SOURCE_FILE_CONFIG_KEY = :1 ' || 'SELECT sfr.SOURCE_FILE_NAME, sfr.PROCESSING_STATUS, sfr.A_WORKFLOW_HISTORY_KEY ' ||
' AND sfr.PROCESSING_STATUS IN (''VALIDATED'',''READY_FOR_INGESTION'',''INGESTED'',''ARCHIVED'',''ARCHIVED_AND_TRASHED'',''ARCHIVED_AND_PURGED'') ' || 'FROM CT_MRDS.A_SOURCE_FILE_RECEIVED sfr ' ||
' AND NOT EXISTS ( ' || 'WHERE sfr.A_SOURCE_FILE_CONFIG_KEY = :1 ' ||
' SELECT 1 FROM ' || vTableName || ' t ' || ' AND sfr.PROCESSING_STATUS IN (''VALIDATED'',''READY_FOR_INGESTION'',''INGESTED'',''ARCHIVED'',''ARCHIVED_AND_TRASHED'',''ARCHIVED_AND_PURGED'') ' ||
' WHERE t.file$name = sfr.SOURCE_FILE_NAME) ' || 'ORDER BY sfr.SOURCE_FILE_NAME'
'ORDER BY sfr.SOURCE_FILE_NAME' USING config_rec.A_SOURCE_FILE_CONFIG_KEY;
USING config_rec.A_SOURCE_FILE_CONFIG_KEY; ELSE
OPEN vRefCursor FOR
'SELECT sfr.SOURCE_FILE_NAME, sfr.PROCESSING_STATUS, sfr.A_WORKFLOW_HISTORY_KEY ' ||
'FROM CT_MRDS.A_SOURCE_FILE_RECEIVED sfr ' ||
'WHERE sfr.A_SOURCE_FILE_CONFIG_KEY = :1 ' ||
' AND sfr.PROCESSING_STATUS IN (''VALIDATED'',''READY_FOR_INGESTION'',''INGESTED'',''ARCHIVED'',''ARCHIVED_AND_TRASHED'',''ARCHIVED_AND_PURGED'') ' ||
' AND NOT EXISTS ( ' ||
' SELECT 1 FROM ' || vTableName || ' t ' ||
' WHERE t.file$name = sfr.SOURCE_FILE_NAME) ' ||
'ORDER BY sfr.SOURCE_FILE_NAME'
USING config_rec.A_SOURCE_FILE_CONFIG_KEY;
END IF;
EXCEPTION
WHEN OTHERS THEN
IF IS_EXTERNAL_TABLE_EMPTY_ERROR(SQLCODE, SQLERRM) THEN
vBucketEmpty := TRUE;
DBMS_OUTPUT.PUT_LINE(' NOTE: Skipping ODS anti-join details due to empty/inaccessible external table for ' || vTableName || '.');
OPEN vRefCursor FOR
'SELECT sfr.SOURCE_FILE_NAME, sfr.PROCESSING_STATUS, sfr.A_WORKFLOW_HISTORY_KEY ' ||
'FROM CT_MRDS.A_SOURCE_FILE_RECEIVED sfr ' ||
'WHERE sfr.A_SOURCE_FILE_CONFIG_KEY = :1 ' ||
' AND sfr.PROCESSING_STATUS IN (''VALIDATED'',''READY_FOR_INGESTION'',''INGESTED'',''ARCHIVED'',''ARCHIVED_AND_TRASHED'',''ARCHIVED_AND_PURGED'') ' ||
'ORDER BY sfr.SOURCE_FILE_NAME'
USING config_rec.A_SOURCE_FILE_CONFIG_KEY;
ELSE
RAISE;
END IF;
END;
LOOP LOOP
DECLARE DECLARE
vStatus VARCHAR2(50); vStatus VARCHAR2(50);

View File

@@ -53,6 +53,43 @@ END;
/ /
WHENEVER SQLERROR CONTINUE WHENEVER SQLERROR CONTINUE
PROMPT
PROMPT ============================================================================
PROMPT PREREQUISITE CHECK: Verifying MARS-1409 objects
PROMPT ============================================================================
WHENEVER SQLERROR EXIT SQL.SQLCODE
DECLARE
vColCount NUMBER;
vTableCount NUMBER;
BEGIN
SELECT COUNT(*)
INTO vColCount
FROM ALL_TAB_COLUMNS
WHERE OWNER = 'CT_MRDS'
AND TABLE_NAME = 'A_SOURCE_FILE_RECEIVED'
AND COLUMN_NAME = 'A_WORKFLOW_HISTORY_KEY';
IF vColCount = 0 THEN
RAISE_APPLICATION_ERROR(-20001,
'Prerequisite failed: CT_MRDS.A_SOURCE_FILE_RECEIVED.A_WORKFLOW_HISTORY_KEY not found. Install MARS-1409 first (or do not run POSTHOOK after rollback).');
END IF;
SELECT COUNT(*)
INTO vTableCount
FROM ALL_TABLES
WHERE OWNER = 'CT_MRDS'
AND TABLE_NAME = 'A_WORKFLOW_HISTORY';
IF vTableCount = 0 THEN
RAISE_APPLICATION_ERROR(-20002,
'Prerequisite failed: CT_MRDS.A_WORKFLOW_HISTORY table not found.');
END IF;
DBMS_OUTPUT.PUT_LINE('OK: Prerequisites satisfied (MARS-1409 schema changes detected).');
END;
/
WHENEVER SQLERROR CONTINUE
PROMPT PROMPT
PROMPT ============================================================================ PROMPT ============================================================================
PROMPT STEP 1: Backfill A_WORKFLOW_HISTORY_KEY for existing records PROMPT STEP 1: Backfill A_WORKFLOW_HISTORY_KEY for existing records