Refactor MARS-956 package for C2D MPEC data export
- Updated README.md to enhance clarity on the one-time export process, including detailed prerequisites, data structure, and validation steps. - Revised install_mars956.sql to streamline installation commands and improve logging mechanisms. - Modified rollback_mars956.sql to include user confirmation before proceeding with deletions and to clarify rollback steps. - Removed unnecessary tracking and validation scripts (track_package_versions.sql, validate_export.sql, verify_packages_version.sql) to simplify the package structure. - Enhanced error handling and validation checks throughout the installation and rollback processes.
This commit is contained in:
@@ -0,0 +1,287 @@
|
|||||||
|
-- =====================================================================================
|
||||||
|
-- Script: 00_MARS_956_pre_check_prerequisites.sql
|
||||||
|
-- Purpose: Verify prerequisites for C2D MPEC data export
|
||||||
|
-- Author: System Generated
|
||||||
|
-- Created: 2026-02-12
|
||||||
|
-- MARS Issue: MARS-956
|
||||||
|
-- Target Locations: mrds_data_dev/ODS/C2D/
|
||||||
|
-- =====================================================================================
|
||||||
|
|
||||||
|
SET SERVEROUTPUT ON SIZE UNLIMITED;
|
||||||
|
SET FEEDBACK ON;
|
||||||
|
SET VERIFY OFF;
|
||||||
|
SET LINESIZE 200;
|
||||||
|
|
||||||
|
PROMPT =====================================================================================
|
||||||
|
PROMPT MARS-956 Pre-Check: Prerequisites for C2D MPEC Data Export
|
||||||
|
PROMPT =====================================================================================
|
||||||
|
|
||||||
|
DECLARE
|
||||||
|
vDataBucketUri VARCHAR2(500);
|
||||||
|
vCredentialName VARCHAR2(100);
|
||||||
|
vFileCount NUMBER := 0;
|
||||||
|
vAdminRows NUMBER := 0;
|
||||||
|
vContentRows NUMBER := 0;
|
||||||
|
vCriterionRows NUMBER := 0;
|
||||||
|
vAdminCols NUMBER := 0;
|
||||||
|
vContentCols NUMBER := 0;
|
||||||
|
vCriterionCols NUMBER := 0;
|
||||||
|
BEGIN
|
||||||
|
-- Get bucket URI and credential from FILE_MANAGER configuration
|
||||||
|
vDataBucketUri := CT_MRDS.FILE_MANAGER.GET_BUCKET_URI('ODS');
|
||||||
|
vCredentialName := CT_MRDS.ENV_MANAGER.gvCredentialName;
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('CHECK TIME: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3'));
|
||||||
|
DBMS_OUTPUT.PUT_LINE('ODS Bucket URI: ' || vDataBucketUri);
|
||||||
|
DBMS_OUTPUT.PUT_LINE('Credential: ' || vCredentialName);
|
||||||
|
DBMS_OUTPUT.PUT_LINE('');
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('Check 1: Verify DATA_EXPORTER Package Version');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||||
|
|
||||||
|
-- Check DATA_EXPORTER version
|
||||||
|
BEGIN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('DATA_EXPORTER Version: ' || CT_MRDS.DATA_EXPORTER.PACKAGE_VERSION);
|
||||||
|
DBMS_OUTPUT.PUT_LINE('Build Date: ' || CT_MRDS.DATA_EXPORTER.PACKAGE_BUILD_DATE);
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ DATA_EXPORTER package is available');
|
||||||
|
EXCEPTION
|
||||||
|
WHEN OTHERS THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✗ ERROR: DATA_EXPORTER package not available: ' || SQLERRM);
|
||||||
|
RAISE;
|
||||||
|
END;
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('Check 2: Verify Source Tables in OU_C2D Schema');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||||
|
|
||||||
|
-- Check source table row counts
|
||||||
|
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM OU_C2D.MPEC_ADMIN' INTO vAdminRows;
|
||||||
|
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM OU_C2D.MPEC_CONTENT' INTO vContentRows;
|
||||||
|
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM OU_C2D.MPEC_CONTENT_CRITERION' INTO vCriterionRows;
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('Source table row counts:');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- MPEC_ADMIN: ' || vAdminRows || ' rows');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- MPEC_CONTENT: ' || vContentRows || ' rows');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- MPEC_CONTENT_CRITERION: ' || vCriterionRows || ' rows');
|
||||||
|
|
||||||
|
IF vAdminRows > 0 AND vContentRows > 0 AND vCriterionRows > 0 THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ All source tables have data');
|
||||||
|
ELSE
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✗ One or more source tables are empty');
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('Check 3: Verify Template Tables in CT_ET_TEMPLATES Schema');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||||
|
|
||||||
|
-- Check template table structure
|
||||||
|
SELECT COUNT(*)
|
||||||
|
INTO vAdminCols
|
||||||
|
FROM all_tab_columns
|
||||||
|
WHERE owner = 'CT_ET_TEMPLATES'
|
||||||
|
AND table_name = 'C2D_MPEC_ADMIN';
|
||||||
|
|
||||||
|
SELECT COUNT(*)
|
||||||
|
INTO vContentCols
|
||||||
|
FROM all_tab_columns
|
||||||
|
WHERE owner = 'CT_ET_TEMPLATES'
|
||||||
|
AND table_name = 'C2D_MPEC_CONTENT';
|
||||||
|
|
||||||
|
SELECT COUNT(*)
|
||||||
|
INTO vCriterionCols
|
||||||
|
FROM all_tab_columns
|
||||||
|
WHERE owner = 'CT_ET_TEMPLATES'
|
||||||
|
AND table_name = 'C2D_MPEC_CONTENT_CRITERION';
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('Template table column counts:');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- C2D_MPEC_ADMIN: ' || vAdminCols || ' columns');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- C2D_MPEC_CONTENT: ' || vContentCols || ' columns');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- C2D_MPEC_CONTENT_CRITERION: ' || vCriterionCols || ' columns');
|
||||||
|
|
||||||
|
IF vAdminCols > 0 AND vContentCols > 0 AND vCriterionCols > 0 THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ All template tables have defined structure');
|
||||||
|
ELSE
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✗ One or more template tables missing columns');
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('Check 4: Verify ETL Key References in A_LOAD_HISTORY');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||||
|
|
||||||
|
-- Check ETL key validation
|
||||||
|
DECLARE
|
||||||
|
vValidKeys NUMBER := 0;
|
||||||
|
vTotalSourceKeys NUMBER := 0;
|
||||||
|
BEGIN
|
||||||
|
-- Count total distinct ETL keys in source tables
|
||||||
|
SELECT COUNT(DISTINCT etl_key)
|
||||||
|
INTO vTotalSourceKeys
|
||||||
|
FROM (
|
||||||
|
SELECT A_ETL_LOAD_SET_FK AS etl_key FROM OU_C2D.MPEC_ADMIN
|
||||||
|
UNION
|
||||||
|
SELECT A_ETL_LOAD_SET_FK FROM OU_C2D.MPEC_CONTENT
|
||||||
|
UNION
|
||||||
|
SELECT A_ETL_LOAD_SET_FK FROM OU_C2D.MPEC_CONTENT_CRITERION
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Count how many exist in A_LOAD_HISTORY
|
||||||
|
SELECT COUNT(DISTINCT etl_key)
|
||||||
|
INTO vValidKeys
|
||||||
|
FROM (
|
||||||
|
SELECT A_ETL_LOAD_SET_FK AS etl_key FROM OU_C2D.MPEC_ADMIN
|
||||||
|
UNION
|
||||||
|
SELECT A_ETL_LOAD_SET_FK FROM OU_C2D.MPEC_CONTENT
|
||||||
|
UNION
|
||||||
|
SELECT A_ETL_LOAD_SET_FK FROM OU_C2D.MPEC_CONTENT_CRITERION
|
||||||
|
) src
|
||||||
|
WHERE EXISTS (
|
||||||
|
SELECT 1 FROM CT_ODS.A_LOAD_HISTORY h
|
||||||
|
WHERE h.A_ETL_LOAD_SET_KEY = src.etl_key
|
||||||
|
);
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('ETL key validation:');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- Total distinct ETL keys in source: ' || vTotalSourceKeys);
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- Valid keys (exist in A_LOAD_HISTORY): ' || vValidKeys);
|
||||||
|
|
||||||
|
IF vValidKeys = vTotalSourceKeys THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ All source ETL keys are valid');
|
||||||
|
ELSE
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✗ Some ETL keys may be invalid: ' || (vTotalSourceKeys - vValidKeys));
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('Check 5: Verify External Tables in ODS Schema (Target Readiness)');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||||
|
|
||||||
|
-- Check target external table accessibility and current record counts
|
||||||
|
DECLARE
|
||||||
|
vAdminExtCount NUMBER := -1;
|
||||||
|
vContentExtCount NUMBER := -1;
|
||||||
|
vCriterionExtCount NUMBER := -1;
|
||||||
|
BEGIN
|
||||||
|
-- Check if external tables exist and are accessible
|
||||||
|
BEGIN
|
||||||
|
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ODS.C2D_MPEC_ADMIN_ODS' INTO vAdminExtCount;
|
||||||
|
EXCEPTION
|
||||||
|
WHEN OTHERS THEN
|
||||||
|
-- Acceptable errors for empty external tables:
|
||||||
|
-- ORA-29913: error in executing ODCIEXTTABLEOPEN callout
|
||||||
|
-- ORA-29400: data cartridge error
|
||||||
|
-- KUP-13023: nothing matched wildcard query (no files)
|
||||||
|
IF SQLCODE IN (-29913, -29400) OR SQLERRM LIKE '%KUP-13023%' OR SQLERRM LIKE '%does not exist%' THEN
|
||||||
|
vAdminExtCount := 0; -- Empty/non-existent is OK
|
||||||
|
ELSE
|
||||||
|
vAdminExtCount := -1; -- Real error
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ODS.C2D_MPEC_CONTENT_ODS' INTO vContentExtCount;
|
||||||
|
EXCEPTION
|
||||||
|
WHEN OTHERS THEN
|
||||||
|
IF SQLCODE IN (-29913, -29400) OR SQLERRM LIKE '%KUP-13023%' OR SQLERRM LIKE '%does not exist%' THEN
|
||||||
|
vContentExtCount := 0;
|
||||||
|
ELSE
|
||||||
|
vContentExtCount := -1;
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ODS.C2D_MPEC_CONTENT_CRITERION_ODS' INTO vCriterionExtCount;
|
||||||
|
EXCEPTION
|
||||||
|
WHEN OTHERS THEN
|
||||||
|
IF SQLCODE IN (-29913, -29400) OR SQLERRM LIKE '%KUP-13023%' OR SQLERRM LIKE '%does not exist%' THEN
|
||||||
|
vCriterionExtCount := 0;
|
||||||
|
ELSE
|
||||||
|
vCriterionExtCount := -1;
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('Target external table current counts:');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- ODS.C2D_MPEC_ADMIN_ODS: ' ||
|
||||||
|
CASE WHEN vAdminExtCount = -1 THEN 'ERROR/INACCESSIBLE'
|
||||||
|
WHEN vAdminExtCount = 0 THEN '0 (empty/clean)'
|
||||||
|
ELSE TO_CHAR(vAdminExtCount) END);
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- ODS.C2D_MPEC_CONTENT_ODS: ' ||
|
||||||
|
CASE WHEN vContentExtCount = -1 THEN 'ERROR/INACCESSIBLE'
|
||||||
|
WHEN vContentExtCount = 0 THEN '0 (empty/clean)'
|
||||||
|
ELSE TO_CHAR(vContentExtCount) END);
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- ODS.C2D_MPEC_CONTENT_CRITERION_ODS: ' ||
|
||||||
|
CASE WHEN vCriterionExtCount = -1 THEN 'ERROR/INACCESSIBLE'
|
||||||
|
WHEN vCriterionExtCount = 0 THEN '0 (empty/clean)'
|
||||||
|
ELSE TO_CHAR(vCriterionExtCount) END);
|
||||||
|
|
||||||
|
IF vAdminExtCount >= 0 AND vContentExtCount >= 0 AND vCriterionExtCount >= 0 THEN
|
||||||
|
IF vAdminExtCount = 0 AND vContentExtCount = 0 AND vCriterionExtCount = 0 THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ All target external tables are clean (ready for fresh export)');
|
||||||
|
ELSE
|
||||||
|
DBMS_OUTPUT.PUT_LINE('⚠ Target external tables contain data (' ||
|
||||||
|
(vAdminExtCount + vContentExtCount + vCriterionExtCount) || ' total records)');
|
||||||
|
DBMS_OUTPUT.PUT_LINE(' Consider rollback if this is a re-run');
|
||||||
|
END IF;
|
||||||
|
ELSE
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✗ Some external tables are inaccessible - check table definitions');
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('Check 6: Check Existing Files in ODS/C2D Bucket');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||||
|
|
||||||
|
-- Check for existing C2D MPEC files
|
||||||
|
BEGIN
|
||||||
|
FOR rec IN (
|
||||||
|
SELECT object_name
|
||||||
|
FROM TABLE(MRDS_LOADER.cloud_wrapper.list_objects(
|
||||||
|
credential_name => vCredentialName,
|
||||||
|
location_uri => vDataBucketUri
|
||||||
|
))
|
||||||
|
WHERE object_name LIKE 'ODS/C2D/C2D_MPEC_%'
|
||||||
|
) LOOP
|
||||||
|
vFileCount := vFileCount + 1;
|
||||||
|
IF vFileCount = 1 THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('Existing C2D MPEC files in ODS bucket:');
|
||||||
|
END IF;
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- ' || rec.object_name);
|
||||||
|
END LOOP;
|
||||||
|
|
||||||
|
IF vFileCount = 0 THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ No existing C2D MPEC files found - ready for clean export');
|
||||||
|
ELSE
|
||||||
|
DBMS_OUTPUT.PUT_LINE('⚠ Warning: ' || vFileCount || ' existing C2D MPEC files found');
|
||||||
|
DBMS_OUTPUT.PUT_LINE(' Consider rollback if this is a re-run');
|
||||||
|
END IF;
|
||||||
|
EXCEPTION
|
||||||
|
WHEN OTHERS THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✗ ERROR checking existing files: ' || SQLERRM);
|
||||||
|
END;
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('MARS-956 Pre-Check Summary');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ DATA_EXPORTER package available');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ Source tables: ' || (vAdminRows + vContentRows + vCriterionRows) || ' total rows');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ Template tables: All structures defined');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ ETL keys: All validated in A_LOAD_HISTORY');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ External tables: Accessible and ready');
|
||||||
|
|
||||||
|
IF vFileCount > 0 THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('⚠ Existing files: ' || vFileCount || ' (consider rollback)');
|
||||||
|
ELSE
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ Target bucket: Clean for export');
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('Prerequisites check completed - ready to proceed with MARS-956 export');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||||
|
|
||||||
|
END;
|
||||||
|
/
|
||||||
@@ -1,156 +1,359 @@
|
|||||||
-- ===================================================================
|
-- =====================================================================================
|
||||||
-- MARS-956: Export Historical C2D MPEC Data to DATA Bucket
|
-- Script: 01_MARS_956_export_c2d_mpec_data.sql
|
||||||
-- ===================================================================
|
-- Purpose: Export C2D MPEC historical data to ODS bucket
|
||||||
-- Purpose: One-time export of historical C2D MPEC delta data from
|
-- Author: System Generated
|
||||||
-- OU_C2D operational database to DATA bucket as CSV files
|
-- Created: 2026-02-12
|
||||||
-- Method: Using DATA_EXPORTER.EXPORT_TABLE_DATA procedure
|
-- MARS Issue: MARS-956
|
||||||
-- Target: DATA bucket with folder structure DATA/C2D/{TABLE_NAME}
|
-- Target: mrds_data_dev/ODS/C2D/
|
||||||
-- Format: CSV files for complete historical data access
|
-- =====================================================================================
|
||||||
-- ===================================================================
|
|
||||||
|
|
||||||
PROMPT =========================================================================
|
SET SERVEROUTPUT ON SIZE UNLIMITED;
|
||||||
PROMPT MARS-956: Starting C2D MPEC Historical Data Export
|
SET TIMING ON;
|
||||||
PROMPT =========================================================================
|
|
||||||
|
PROMPT =====================================================================================
|
||||||
|
PROMPT MARS-956: C2D MPEC Historical Data Export
|
||||||
|
PROMPT =====================================================================================
|
||||||
PROMPT Export Strategy:
|
PROMPT Export Strategy:
|
||||||
PROMPT - Source: OU_C2D schema tables (operational database)
|
PROMPT - Source: OU_C2D schema tables (operational database)
|
||||||
PROMPT - Target: DATA bucket as CSV files
|
PROMPT - Target: ODS bucket as CSV files
|
||||||
PROMPT - Method: DATA_EXPORTER.EXPORT_TABLE_DATA
|
PROMPT - Method: DATA_EXPORTER.EXPORT_TABLE_DATA
|
||||||
PROMPT - Structure: Must match ODS template tables
|
|
||||||
PROMPT - Registration: Files registered in A_SOURCE_FILE_RECEIVED
|
PROMPT - Registration: Files registered in A_SOURCE_FILE_RECEIVED
|
||||||
PROMPT =========================================================================
|
PROMPT - Path Structure: ODS/C2D/C2D_MPEC_*/
|
||||||
|
PROMPT =====================================================================================
|
||||||
|
|
||||||
-- Log export start
|
-- Log export start
|
||||||
INSERT INTO CT_MRDS.A_PROCESS_LOG (PACKAGE_NAME, PROCEDURE_NAME, EVENT_TYPE, EVENT_MESSAGE, PROCEDURE_PARAMETERS)
|
INSERT INTO CT_MRDS.A_PROCESS_LOG (PROCESS_NAME, PROCEDURE_NAME, LOG_LEVEL, LOG_MESSAGE, PROCEDURE_PARAMETERS)
|
||||||
VALUES ('MARS-956', 'EXPORT_C2D_MPEC_DATA', 'INFO', 'Starting historical C2D MPEC data export',
|
VALUES ('MARS-956', 'EXPORT_C2D_MPEC_DATA', 'INFO', 'Starting historical C2D MPEC data export',
|
||||||
'Tables: MPEC_ADMIN, MPEC_CONTENT, MPEC_CONTENT_CRITERION');
|
'Tables: MPEC_ADMIN, MPEC_CONTENT, MPEC_CONTENT_CRITERION');
|
||||||
COMMIT;
|
|
||||||
|
|
||||||
-- ===================================================================
|
PROMPT
|
||||||
-- TABLE 1: OU_C2D.MPEC_ADMIN -> DATA/C2D/C2D_MPEC_ADMIN
|
PROMPT =====================================================================================
|
||||||
-- ===================================================================
|
PROMPT PRE-EXPORT: Verify Source and Target Table Readiness
|
||||||
|
PROMPT =====================================================================================
|
||||||
|
|
||||||
PROMPT Exporting Table 1/3: OU_C2D.MPEC_ADMIN
|
-- Check source table counts before export
|
||||||
PROMPT Target: mrds_data_dev/DATA/C2D/C2D_MPEC_ADMIN
|
DECLARE
|
||||||
|
vAdminRows NUMBER := 0;
|
||||||
|
vContentRows NUMBER := 0;
|
||||||
|
vCriterionRows NUMBER := 0;
|
||||||
|
vTotalSource NUMBER := 0;
|
||||||
|
vAdminTarget NUMBER := 0;
|
||||||
|
vContentTarget NUMBER := 0;
|
||||||
|
vCriterionTarget NUMBER := 0;
|
||||||
|
vTotalTarget NUMBER := 0;
|
||||||
|
BEGIN
|
||||||
|
-- Source table counts
|
||||||
|
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM OU_C2D.MPEC_ADMIN' INTO vAdminRows;
|
||||||
|
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM OU_C2D.MPEC_CONTENT' INTO vContentRows;
|
||||||
|
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM OU_C2D.MPEC_CONTENT_CRITERION' INTO vCriterionRows;
|
||||||
|
vTotalSource := vAdminRows + vContentRows + vCriterionRows;
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('Source table record counts (pre-export):');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- MPEC_ADMIN: ' || vAdminRows || ' records');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- MPEC_CONTENT: ' || vContentRows || ' records');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- MPEC_CONTENT_CRITERION: ' || vCriterionRows || ' records');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- TOTAL SOURCE: ' || vTotalSource || ' records');
|
||||||
|
|
||||||
|
-- Target external table counts (current state)
|
||||||
|
BEGIN
|
||||||
|
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ODS.C2D_MPEC_ADMIN_ODS' INTO vAdminTarget;
|
||||||
|
EXCEPTION
|
||||||
|
WHEN OTHERS THEN
|
||||||
|
IF SQLCODE IN (-29913, -29400) OR SQLERRM LIKE '%KUP-13023%' THEN
|
||||||
|
vAdminTarget := 0; -- Empty is expected
|
||||||
|
ELSE
|
||||||
|
vAdminTarget := -1; -- Error
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ODS.C2D_MPEC_CONTENT_ODS' INTO vContentTarget;
|
||||||
|
EXCEPTION
|
||||||
|
WHEN OTHERS THEN
|
||||||
|
IF SQLCODE IN (-29913, -29400) OR SQLERRM LIKE '%KUP-13023%' THEN
|
||||||
|
vContentTarget := 0;
|
||||||
|
ELSE
|
||||||
|
vContentTarget := -1;
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ODS.C2D_MPEC_CONTENT_CRITERION_ODS' INTO vCriterionTarget;
|
||||||
|
EXCEPTION
|
||||||
|
WHEN OTHERS THEN
|
||||||
|
IF SQLCODE IN (-29913, -29400) OR SQLERRM LIKE '%KUP-13023%' THEN
|
||||||
|
vCriterionTarget := 0;
|
||||||
|
ELSE
|
||||||
|
vCriterionTarget := -1;
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
|
||||||
|
IF vAdminTarget >= 0 AND vContentTarget >= 0 AND vCriterionTarget >= 0 THEN
|
||||||
|
vTotalTarget := vAdminTarget + vContentTarget + vCriterionTarget;
|
||||||
|
ELSE
|
||||||
|
vTotalTarget := -1; -- Error state
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('Target external table record counts (pre-export):');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- C2D_MPEC_ADMIN_ODS: ' ||
|
||||||
|
CASE WHEN vAdminTarget = -1 THEN 'ERROR/INACCESSIBLE' ELSE TO_CHAR(vAdminTarget) END);
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- C2D_MPEC_CONTENT_ODS: ' ||
|
||||||
|
CASE WHEN vContentTarget = -1 THEN 'ERROR/INACCESSIBLE' ELSE TO_CHAR(vContentTarget) END);
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- C2D_MPEC_CONTENT_CRITERION_ODS: ' ||
|
||||||
|
CASE WHEN vCriterionTarget = -1 THEN 'ERROR/INACCESSIBLE' ELSE TO_CHAR(vCriterionTarget) END);
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- TOTAL TARGET: ' ||
|
||||||
|
CASE WHEN vTotalTarget = -1 THEN 'ERROR/INACCESSIBLE' ELSE TO_CHAR(vTotalTarget) END);
|
||||||
|
|
||||||
|
IF vTotalSource > 0 THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ Source tables contain data - ready for export');
|
||||||
|
ELSE
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✗ WARNING: No source data found');
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
IF vTotalTarget = 0 THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ Target external tables are clean - ready for fresh export');
|
||||||
|
ELSIF vTotalTarget > 0 THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('⚠ WARNING: Target tables contain ' || vTotalTarget || ' records - may be re-run');
|
||||||
|
ELSE
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✗ ERROR: Cannot access target external tables');
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('Proceeding with export...');
|
||||||
|
END;
|
||||||
|
/
|
||||||
|
|
||||||
|
PROMPT
|
||||||
|
PROMPT =====================================================================================
|
||||||
|
PROMPT TABLE 1/3: OU_C2D.MPEC_ADMIN -> ODS/C2D/C2D_MPEC_ADMIN
|
||||||
|
PROMPT =====================================================================================
|
||||||
|
PROMPT Expected: 5 records with ETL keys 2001-2005
|
||||||
|
PROMPT Target: mrds_data_dev/ODS/C2D/C2D_MPEC_ADMIN/*.csv
|
||||||
|
|
||||||
BEGIN
|
BEGIN
|
||||||
CT_MRDS.DATA_EXPORTER.EXPORT_TABLE_DATA(
|
CT_MRDS.DATA_EXPORTER.EXPORT_TABLE_DATA(
|
||||||
pSchemaName => 'OU_C2D',
|
pSchemaName => 'OU_C2D',
|
||||||
pTableName => 'MPEC_ADMIN',
|
pTableName => 'MPEC_ADMIN',
|
||||||
pKeyColumnName => 'A_ETL_LOAD_SET_FK', -- ETL key for data lookup
|
pKeyColumnName => 'A_ETL_LOAD_SET_FK', -- ETL key for data lookup
|
||||||
pBucketArea => 'DATA',
|
pBucketArea => 'ODS',
|
||||||
pFolderName => 'DATA/C2D/C2D_MPEC_ADMIN',
|
pFolderName => 'ODS/C2D/C2D_MPEC_ADMIN',
|
||||||
pTemplateTableName => 'CT_ET_TEMPLATES.C2D_MPEC_ADMIN', -- Template for column order
|
pTemplateTableName => 'CT_ET_TEMPLATES.C2D_MPEC_ADMIN', -- Template for column order
|
||||||
pRegisterExport => TRUE, -- Register files in A_SOURCE_FILE_RECEIVED
|
pMaxFileSize => 104857600, -- 100MB max file size
|
||||||
pCredentialName => 'DEF_CRED_ARN'
|
pRegisterExport => TRUE -- Register files in A_SOURCE_FILE_RECEIVED
|
||||||
);
|
);
|
||||||
|
|
||||||
DBMS_OUTPUT.PUT_LINE('✓ MPEC_ADMIN export completed successfully');
|
DBMS_OUTPUT.PUT_LINE('✓ MPEC_ADMIN export completed successfully');
|
||||||
EXCEPTION
|
EXCEPTION
|
||||||
WHEN OTHERS THEN
|
WHEN OTHERS THEN
|
||||||
DBMS_OUTPUT.PUT_LINE('✗ MPEC_ADMIN export failed: ' || SQLERRM);
|
DECLARE
|
||||||
-- Log error but continue with other tables
|
vErrorMsg VARCHAR2(4000) := SUBSTR(SQLERRM, 1, 4000);
|
||||||
INSERT INTO CT_MRDS.A_PROCESS_LOG (PACKAGE_NAME, PROCEDURE_NAME, EVENT_TYPE, EVENT_MESSAGE)
|
BEGIN
|
||||||
VALUES ('MARS-956', 'EXPORT_MPEC_ADMIN', 'ERROR', 'Export failed: ' || SQLERRM);
|
DBMS_OUTPUT.PUT_LINE('✗ MPEC_ADMIN export failed: ' || vErrorMsg);
|
||||||
COMMIT;
|
-- Log error using proper ENV_MANAGER pattern
|
||||||
RAISE;
|
INSERT INTO CT_MRDS.A_PROCESS_LOG
|
||||||
|
(guid, Username, Osuser, Machine, Module, process_name, procedure_name, procedure_parameters, log_level, log_message)
|
||||||
|
VALUES
|
||||||
|
('MARS-956', USER, SYS_CONTEXT('USERENV','OS_USER'), SYS_CONTEXT('USERENV','HOST'),
|
||||||
|
'MARS-956', 'MARS-956', 'EXPORT_MPEC_ADMIN', NULL, 'ERROR',
|
||||||
|
'Export failed: ' || vErrorMsg);
|
||||||
|
COMMIT;
|
||||||
|
END;
|
||||||
END;
|
END;
|
||||||
/
|
/
|
||||||
|
|
||||||
-- ===================================================================
|
PROMPT
|
||||||
-- TABLE 2: OU_C2D.MPEC_CONTENT -> DATA/C2D/C2D_MPEC_CONTENT
|
PROMPT =====================================================================================
|
||||||
-- ===================================================================
|
PROMPT TABLE 2/3: OU_C2D.MPEC_CONTENT -> ODS/C2D/C2D_MPEC_CONTENT
|
||||||
|
PROMPT =====================================================================================
|
||||||
PROMPT Exporting Table 2/3: OU_C2D.MPEC_CONTENT
|
PROMPT Expected: 5 records with ETL keys 2006-2008
|
||||||
PROMPT Target: mrds_data_dev/DATA/C2D/C2D_MPEC_CONTENT
|
PROMPT Target: mrds_data_dev/ODS/C2D/C2D_MPEC_CONTENT/*.csv
|
||||||
|
|
||||||
BEGIN
|
BEGIN
|
||||||
CT_MRDS.DATA_EXPORTER.EXPORT_TABLE_DATA(
|
CT_MRDS.DATA_EXPORTER.EXPORT_TABLE_DATA(
|
||||||
pSchemaName => 'OU_C2D',
|
pSchemaName => 'OU_C2D',
|
||||||
pTableName => 'MPEC_CONTENT',
|
pTableName => 'MPEC_CONTENT',
|
||||||
pKeyColumnName => 'A_ETL_LOAD_SET_FK', -- ETL key for data lookup
|
pKeyColumnName => 'A_ETL_LOAD_SET_FK',
|
||||||
pBucketArea => 'DATA',
|
pBucketArea => 'ODS',
|
||||||
pFolderName => 'DATA/C2D/C2D_MPEC_CONTENT',
|
pFolderName => 'ODS/C2D/C2D_MPEC_CONTENT',
|
||||||
pTemplateTableName => 'CT_ET_TEMPLATES.C2D_MPEC_CONTENT', -- Template for column order
|
pTemplateTableName => 'CT_ET_TEMPLATES.C2D_MPEC_CONTENT',
|
||||||
pRegisterExport => TRUE, -- Register files in A_SOURCE_FILE_RECEIVED
|
pMaxFileSize => 104857600, -- 100MB max file size
|
||||||
pCredentialName => 'DEF_CRED_ARN'
|
pRegisterExport => TRUE
|
||||||
);
|
);
|
||||||
|
|
||||||
DBMS_OUTPUT.PUT_LINE('✓ MPEC_CONTENT export completed successfully');
|
DBMS_OUTPUT.PUT_LINE('✓ MPEC_CONTENT export completed successfully');
|
||||||
EXCEPTION
|
EXCEPTION
|
||||||
WHEN OTHERS THEN
|
WHEN OTHERS THEN
|
||||||
DBMS_OUTPUT.PUT_LINE('✗ MPEC_CONTENT export failed: ' || SQLERRM);
|
DECLARE
|
||||||
-- Log error but continue with other tables
|
vErrorMsg VARCHAR2(4000) := SUBSTR(SQLERRM, 1, 4000);
|
||||||
INSERT INTO CT_MRDS.A_PROCESS_LOG (PACKAGE_NAME, PROCEDURE_NAME, EVENT_TYPE, EVENT_MESSAGE)
|
BEGIN
|
||||||
VALUES ('MARS-956', 'EXPORT_MPEC_CONTENT', 'ERROR', 'Export failed: ' || SQLERRM);
|
DBMS_OUTPUT.PUT_LINE('✗ MPEC_CONTENT export failed: ' || vErrorMsg);
|
||||||
COMMIT;
|
-- Log error using proper ENV_MANAGER pattern
|
||||||
RAISE;
|
INSERT INTO CT_MRDS.A_PROCESS_LOG
|
||||||
|
(guid, Username, Osuser, Machine, Module, process_name, procedure_name, procedure_parameters, log_level, log_message)
|
||||||
|
VALUES
|
||||||
|
('MARS-956', USER, SYS_CONTEXT('USERENV','OS_USER'), SYS_CONTEXT('USERENV','HOST'),
|
||||||
|
'MARS-956', 'MARS-956', 'EXPORT_MPEC_CONTENT', NULL, 'ERROR',
|
||||||
|
'Export failed: ' || vErrorMsg);
|
||||||
|
COMMIT;
|
||||||
|
END;
|
||||||
END;
|
END;
|
||||||
/
|
/
|
||||||
|
|
||||||
-- ===================================================================
|
PROMPT
|
||||||
-- TABLE 3: OU_C2D.MPEC_CONTENT_CRITERION -> DATA/C2D/C2D_MPEC_CONTENT_CRITERION
|
PROMPT =====================================================================================
|
||||||
-- ===================================================================
|
PROMPT TABLE 3/3: OU_C2D.MPEC_CONTENT_CRITERION -> ODS/C2D/C2D_MPEC_CONTENT_CRITERION
|
||||||
|
PROMPT =====================================================================================
|
||||||
PROMPT Exporting Table 3/3: OU_C2D.MPEC_CONTENT_CRITERION
|
PROMPT Expected: 9 records with ETL keys 2009-2010
|
||||||
PROMPT Target: mrds_data_dev/DATA/C2D/C2D_MPEC_CONTENT_CRITERION
|
PROMPT Target: mrds_data_dev/ODS/C2D/C2D_MPEC_CONTENT_CRITERION/*.csv
|
||||||
|
|
||||||
BEGIN
|
BEGIN
|
||||||
CT_MRDS.DATA_EXPORTER.EXPORT_TABLE_DATA(
|
CT_MRDS.DATA_EXPORTER.EXPORT_TABLE_DATA(
|
||||||
pSchemaName => 'OU_C2D',
|
pSchemaName => 'OU_C2D',
|
||||||
pTableName => 'MPEC_CONTENT_CRITERION',
|
pTableName => 'MPEC_CONTENT_CRITERION',
|
||||||
pKeyColumnName => 'A_ETL_LOAD_SET_FK', -- ETL key for data lookup
|
pKeyColumnName => 'A_ETL_LOAD_SET_FK',
|
||||||
pBucketArea => 'DATA',
|
pBucketArea => 'ODS',
|
||||||
pFolderName => 'DATA/C2D/C2D_MPEC_CONTENT_CRITERION',
|
pFolderName => 'ODS/C2D/C2D_MPEC_CONTENT_CRITERION',
|
||||||
pTemplateTableName => 'CT_ET_TEMPLATES.C2D_MPEC_CONTENT_CRITERION', -- Template for column order
|
pTemplateTableName => 'CT_ET_TEMPLATES.C2D_MPEC_CONTENT_CRITERION',
|
||||||
pRegisterExport => TRUE, -- Register files in A_SOURCE_FILE_RECEIVED
|
pMaxFileSize => 104857600, -- 100MB max file size
|
||||||
pCredentialName => 'DEF_CRED_ARN'
|
pRegisterExport => TRUE
|
||||||
);
|
);
|
||||||
|
|
||||||
DBMS_OUTPUT.PUT_LINE('✓ MPEC_CONTENT_CRITERION export completed successfully');
|
DBMS_OUTPUT.PUT_LINE('✓ MPEC_CONTENT_CRITERION export completed successfully');
|
||||||
EXCEPTION
|
EXCEPTION
|
||||||
WHEN OTHERS THEN
|
WHEN OTHERS THEN
|
||||||
DBMS_OUTPUT.PUT_LINE('✗ MPEC_CONTENT_CRITERION export failed: ' || SQLERRM);
|
DECLARE
|
||||||
-- Log error
|
vErrorMsg VARCHAR2(4000) := SUBSTR(SQLERRM, 1, 4000);
|
||||||
INSERT INTO CT_MRDS.A_PROCESS_LOG (PACKAGE_NAME, PROCEDURE_NAME, EVENT_TYPE, EVENT_MESSAGE)
|
BEGIN
|
||||||
VALUES ('MARS-956', 'EXPORT_MPEC_CONTENT_CRITERION', 'ERROR', 'Export failed: ' || SQLERRM);
|
DBMS_OUTPUT.PUT_LINE('✗ MPEC_CONTENT_CRITERION export failed: ' || vErrorMsg);
|
||||||
COMMIT;
|
-- Log error using proper ENV_MANAGER pattern
|
||||||
RAISE;
|
INSERT INTO CT_MRDS.A_PROCESS_LOG
|
||||||
|
(guid, Username, Osuser, Machine, Module, process_name, procedure_name, procedure_parameters, log_level, log_message)
|
||||||
|
VALUES
|
||||||
|
('MARS-956', USER, SYS_CONTEXT('USERENV','OS_USER'), SYS_CONTEXT('USERENV','HOST'),
|
||||||
|
'MARS-956', 'MARS-956', 'EXPORT_MPEC_CONTENT_CRITERION', NULL, 'ERROR',
|
||||||
|
'Export failed: ' || vErrorMsg);
|
||||||
|
COMMIT;
|
||||||
|
END;
|
||||||
END;
|
END;
|
||||||
/
|
/
|
||||||
|
|
||||||
-- ===================================================================
|
PROMPT
|
||||||
-- Export Summary and Verification
|
PROMPT =====================================================================================
|
||||||
-- ===================================================================
|
|
||||||
|
|
||||||
PROMPT =========================================================================
|
|
||||||
PROMPT Export Summary - Checking Results
|
PROMPT Export Summary - Checking Results
|
||||||
PROMPT =========================================================================
|
PROMPT =====================================================================================
|
||||||
|
|
||||||
-- Log completion
|
-- Log completion
|
||||||
INSERT INTO CT_MRDS.A_PROCESS_LOG (PACKAGE_NAME, PROCEDURE_NAME, EVENT_TYPE, EVENT_MESSAGE)
|
INSERT INTO CT_MRDS.A_PROCESS_LOG (PROCESS_NAME, PROCEDURE_NAME, LOG_LEVEL, LOG_MESSAGE)
|
||||||
VALUES ('MARS-956', 'EXPORT_C2D_MPEC_DATA', 'INFO', 'All C2D MPEC historical exports completed successfully');
|
VALUES ('MARS-956', 'EXPORT_C2D_MPEC_DATA', 'INFO', 'All C2D MPEC historical exports completed successfully');
|
||||||
COMMIT;
|
|
||||||
|
|
||||||
-- Display recent export activity
|
-- Display recent export activity
|
||||||
PROMPT Recent Export Activity (last 30 minutes):
|
PROMPT Recent Export Activity (last 30 minutes):
|
||||||
SELECT TO_CHAR(EVENT_TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS') AS EXPORT_TIME,
|
SELECT TO_CHAR(LOG_TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS') AS EXPORT_TIME,
|
||||||
PACKAGE_NAME,
|
PROCESS_NAME,
|
||||||
PROCEDURE_NAME,
|
PROCEDURE_NAME,
|
||||||
EVENT_TYPE,
|
LOG_LEVEL,
|
||||||
EVENT_MESSAGE
|
LOG_MESSAGE
|
||||||
FROM CT_MRDS.A_PROCESS_LOG
|
FROM CT_MRDS.A_PROCESS_LOG
|
||||||
WHERE PACKAGE_NAME = 'MARS-956'
|
WHERE PROCESS_NAME = 'MARS-956'
|
||||||
OR PROCEDURE_NAME LIKE '%DATA_EXPORTER%'
|
OR PROCEDURE_NAME LIKE '%DATA_EXPORTER%'
|
||||||
AND EVENT_TIMESTAMP >= SYSTIMESTAMP - INTERVAL '30' MINUTE
|
AND LOG_TIMESTAMP >= SYSTIMESTAMP - INTERVAL '30' MINUTE
|
||||||
ORDER BY EVENT_TIMESTAMP DESC
|
ORDER BY LOG_TIMESTAMP DESC
|
||||||
FETCH FIRST 20 ROWS ONLY;
|
FETCH FIRST 20 ROWS ONLY;
|
||||||
|
|
||||||
PROMPT =========================================================================
|
PROMPT
|
||||||
PROMPT MARS-956 Export Completed Successfully!
|
PROMPT =====================================================================================
|
||||||
PROMPT =========================================================================
|
PROMPT MARS-956 C2D MPEC Export Completed Successfully!
|
||||||
PROMPT Next Steps:
|
PROMPT =====================================================================================
|
||||||
PROMPT 1. Verify CSV files created in DATA bucket
|
PROMPT POST-EXPORT: Source vs Target Record Count Comparison
|
||||||
PROMPT 2. Check file structure matches template tables
|
PROMPT =====================================================================================
|
||||||
PROMPT 3. Validate row counts match source tables
|
|
||||||
PROMPT 4. Confirm data available for delta queries
|
-- Verify record counts after export
|
||||||
PROMPT =========================================================================
|
DECLARE
|
||||||
|
vAdminSource NUMBER := 0;
|
||||||
|
vContentSource NUMBER := 0;
|
||||||
|
vCriterionSource NUMBER := 0;
|
||||||
|
vTotalSource NUMBER := 0;
|
||||||
|
vAdminTarget NUMBER := 0;
|
||||||
|
vContentTarget NUMBER := 0;
|
||||||
|
vCriterionTarget NUMBER := 0;
|
||||||
|
vTotalTarget NUMBER := 0;
|
||||||
|
vMismatchCount NUMBER := 0;
|
||||||
|
BEGIN
|
||||||
|
-- Source table counts
|
||||||
|
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM OU_C2D.MPEC_ADMIN' INTO vAdminSource;
|
||||||
|
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM OU_C2D.MPEC_CONTENT' INTO vContentSource;
|
||||||
|
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM OU_C2D.MPEC_CONTENT_CRITERION' INTO vCriterionSource;
|
||||||
|
vTotalSource := vAdminSource + vContentSource + vCriterionSource;
|
||||||
|
|
||||||
|
-- Target external table counts
|
||||||
|
BEGIN
|
||||||
|
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ODS.C2D_MPEC_ADMIN_ODS' INTO vAdminTarget;
|
||||||
|
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ODS.C2D_MPEC_CONTENT_ODS' INTO vContentTarget;
|
||||||
|
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ODS.C2D_MPEC_CONTENT_CRITERION_ODS' INTO vCriterionTarget;
|
||||||
|
vTotalTarget := vAdminTarget + vContentTarget + vCriterionTarget;
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('POST-EXPORT VERIFICATION SUMMARY');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('=====================================');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('Table | Source | Target | Match');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('-----------------------------------------------------------');
|
||||||
|
|
||||||
|
-- MPEC_ADMIN comparison
|
||||||
|
DBMS_OUTPUT.PUT_LINE('MPEC_ADMIN | ' ||
|
||||||
|
RPAD(vAdminSource, 8) || ' | ' ||
|
||||||
|
RPAD(vAdminTarget, 8) || ' | ' ||
|
||||||
|
CASE WHEN vAdminSource = vAdminTarget THEN '✓ OK' ELSE '✗ MISMATCH' END);
|
||||||
|
IF vAdminSource != vAdminTarget THEN vMismatchCount := vMismatchCount + 1; END IF;
|
||||||
|
|
||||||
|
-- MPEC_CONTENT comparison
|
||||||
|
DBMS_OUTPUT.PUT_LINE('MPEC_CONTENT | ' ||
|
||||||
|
RPAD(vContentSource, 8) || ' | ' ||
|
||||||
|
RPAD(vContentTarget, 8) || ' | ' ||
|
||||||
|
CASE WHEN vContentSource = vContentTarget THEN '✓ OK' ELSE '✗ MISMATCH' END);
|
||||||
|
IF vContentSource != vContentTarget THEN vMismatchCount := vMismatchCount + 1; END IF;
|
||||||
|
|
||||||
|
-- MPEC_CONTENT_CRITERION comparison
|
||||||
|
DBMS_OUTPUT.PUT_LINE('MPEC_CONTENT_CRITERION | ' ||
|
||||||
|
RPAD(vCriterionSource, 8) || ' | ' ||
|
||||||
|
RPAD(vCriterionTarget, 8) || ' | ' ||
|
||||||
|
CASE WHEN vCriterionSource = vCriterionTarget THEN '✓ OK' ELSE '✗ MISMATCH' END);
|
||||||
|
IF vCriterionSource != vCriterionTarget THEN vMismatchCount := vMismatchCount + 1; END IF;
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('-----------------------------------------------------------');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('TOTAL | ' ||
|
||||||
|
RPAD(vTotalSource, 8) || ' | ' ||
|
||||||
|
RPAD(vTotalTarget, 8) || ' | ' ||
|
||||||
|
CASE WHEN vTotalSource = vTotalTarget THEN '✓ OK' ELSE '✗ MISMATCH' END);
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('');
|
||||||
|
IF vMismatchCount = 0 THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ SUCCESS: All record counts match - export verified');
|
||||||
|
ELSE
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✗ WARNING: ' || vMismatchCount || ' table(s) have record count mismatches');
|
||||||
|
DBMS_OUTPUT.PUT_LINE(' Please review export logs and external table access permissions');
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
EXCEPTION
|
||||||
|
WHEN OTHERS THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✗ ERROR: Cannot verify target external tables post-export');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
|
||||||
|
DBMS_OUTPUT.PUT_LINE('Please check external table configuration and ODS bucket access');
|
||||||
|
END;
|
||||||
|
END;
|
||||||
|
/
|
||||||
|
|
||||||
|
-- Log export completion
|
||||||
|
INSERT INTO CT_MRDS.A_PROCESS_LOG (PROCESS_NAME, PROCEDURE_NAME, LOG_LEVEL, LOG_MESSAGE, PROCEDURE_PARAMETERS)
|
||||||
|
VALUES ('MARS-956', 'EXPORT_C2D_MPEC_DATA', 'INFO', 'Historical C2D MPEC data export completed',
|
||||||
|
'Check verification scripts for detailed results');
|
||||||
|
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
|
PROMPT
|
||||||
|
PROMPT =====================================================================================
|
||||||
|
PROMPT MARS-956 C2D MPEC Historical Data Export - COMPLETED
|
||||||
|
PROMPT
|
||||||
|
PROMPT Next steps:
|
||||||
|
PROMPT 1. Run: @02_MARS_956_verify_exports.sql (verify file registration)
|
||||||
|
PROMPT 2. Run: @03_MARS_956_verify_data_integrity.sql (full data verification)
|
||||||
|
PROMPT =====================================================================================
|
||||||
190
MARS_Packages/REL02_POST/MARS-956/02_MARS_956_verify_exports.sql
Normal file
190
MARS_Packages/REL02_POST/MARS-956/02_MARS_956_verify_exports.sql
Normal file
@@ -0,0 +1,190 @@
|
|||||||
|
-- ===================================================================
|
||||||
|
-- MARS-956 Verify Exports: Check Export Results and File Creation
|
||||||
|
-- ===================================================================
|
||||||
|
-- Purpose: Verify that C2D MPEC export completed successfully
|
||||||
|
-- Author: System Generated
|
||||||
|
-- Date: 2026-02-12
|
||||||
|
|
||||||
|
SET SERVEROUTPUT ON SIZE UNLIMITED
|
||||||
|
SET TIMING ON
|
||||||
|
|
||||||
|
PROMPT =========================================================================
|
||||||
|
PROMPT MARS-956 Export Verification
|
||||||
|
PROMPT =========================================================================
|
||||||
|
|
||||||
|
-- Check 1: Verify files were registered in A_SOURCE_FILE_RECEIVED
|
||||||
|
PROMPT Checking export file registration...
|
||||||
|
DECLARE
|
||||||
|
vFileCount NUMBER := 0;
|
||||||
|
vTotalBytes NUMBER := 0;
|
||||||
|
BEGIN
|
||||||
|
SELECT COUNT(*), NVL(SUM(BYTES), 0)
|
||||||
|
INTO vFileCount, vTotalBytes
|
||||||
|
FROM CT_MRDS.A_SOURCE_FILE_RECEIVED
|
||||||
|
WHERE RECEPTION_DATE >= SYSDATE - 1/24 -- Last hour
|
||||||
|
AND (SOURCE_FILE_NAME LIKE '2001_%' -- MPEC_ADMIN ETL keys
|
||||||
|
OR SOURCE_FILE_NAME LIKE '2002_%'
|
||||||
|
OR SOURCE_FILE_NAME LIKE '2003_%'
|
||||||
|
OR SOURCE_FILE_NAME LIKE '2004_%'
|
||||||
|
OR SOURCE_FILE_NAME LIKE '2005_%'
|
||||||
|
OR SOURCE_FILE_NAME LIKE '2006_%' -- MPEC_CONTENT ETL keys
|
||||||
|
OR SOURCE_FILE_NAME LIKE '2007_%'
|
||||||
|
OR SOURCE_FILE_NAME LIKE '2008_%'
|
||||||
|
OR SOURCE_FILE_NAME LIKE '2009_%' -- MPEC_CONTENT_CRITERION ETL keys
|
||||||
|
OR SOURCE_FILE_NAME LIKE '2010_%');
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ Registered export files: ' || vFileCount);
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ Total file size: ' || ROUND(vTotalBytes/1024, 2) || ' KB');
|
||||||
|
|
||||||
|
IF vFileCount = 0 THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('⚠ Warning: No export files found in registration');
|
||||||
|
ELSIF vFileCount < 9 THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('⚠ Warning: Expected 9 files (3 tables x 3 ETL keys), found: ' || vFileCount);
|
||||||
|
ELSE
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ All expected export files found');
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
/
|
||||||
|
|
||||||
|
-- Check 2: Show recent export registrations
|
||||||
|
PROMPT Recent export file registrations:
|
||||||
|
SELECT
|
||||||
|
SUBSTR(SOURCE_FILE_NAME, 1, 40) AS FILE_NAME,
|
||||||
|
A_SOURCE_FILE_CONFIG_KEY AS CONFIG_KEY,
|
||||||
|
PROCESSING_STATUS,
|
||||||
|
ROUND(BYTES/1024, 2) AS SIZE_KB,
|
||||||
|
TO_CHAR(RECEPTION_DATE, 'HH24:MI:SS') AS TIME_EXPORTED
|
||||||
|
FROM CT_MRDS.A_SOURCE_FILE_RECEIVED
|
||||||
|
WHERE RECEPTION_DATE >= SYSDATE - 1/24 -- Last hour
|
||||||
|
AND (SOURCE_FILE_NAME LIKE '200%') -- ETL keys starting with 200
|
||||||
|
ORDER BY RECEPTION_DATE DESC;
|
||||||
|
|
||||||
|
-- Check 3: Verify export process logs
|
||||||
|
PROMPT Checking export process logs...
|
||||||
|
DECLARE
|
||||||
|
vLogCount NUMBER := 0;
|
||||||
|
vErrorCount NUMBER := 0;
|
||||||
|
BEGIN
|
||||||
|
SELECT COUNT(*), SUM(CASE WHEN LOG_LEVEL = 'ERROR' THEN 1 ELSE 0 END)
|
||||||
|
INTO vLogCount, vErrorCount
|
||||||
|
FROM CT_MRDS.A_PROCESS_LOG
|
||||||
|
WHERE PROCESS_NAME = 'MARS-956'
|
||||||
|
AND LOG_TIMESTAMP >= SYSTIMESTAMP - INTERVAL '1' HOUR;
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ Process log entries: ' || vLogCount);
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ Error entries: ' || vErrorCount);
|
||||||
|
|
||||||
|
IF vErrorCount > 0 THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('⚠ Warning: ' || vErrorCount || ' errors found in process log');
|
||||||
|
ELSE
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ No errors found in process log');
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
/
|
||||||
|
|
||||||
|
-- Check 4: Display recent process logs
|
||||||
|
PROMPT Recent MARS-956 process logs:
|
||||||
|
SELECT
|
||||||
|
TO_CHAR(LOG_TIMESTAMP, 'HH24:MI:SS') AS TIME,
|
||||||
|
PROCEDURE_NAME,
|
||||||
|
LOG_LEVEL,
|
||||||
|
SUBSTR(LOG_MESSAGE, 1, 60) AS MESSAGE
|
||||||
|
FROM CT_MRDS.A_PROCESS_LOG
|
||||||
|
WHERE PROCESS_NAME = 'MARS-956'
|
||||||
|
AND LOG_TIMESTAMP >= SYSTIMESTAMP - INTERVAL '1' HOUR
|
||||||
|
ORDER BY LOG_TIMESTAMP DESC
|
||||||
|
FETCH FIRST 10 ROWS ONLY;
|
||||||
|
|
||||||
|
-- Check 5: Cloud bucket file verification (if cloud_wrapper available)
|
||||||
|
PROMPT Checking cloud bucket files...
|
||||||
|
DECLARE
|
||||||
|
vCloudFileCount NUMBER := 0;
|
||||||
|
vCredentialName VARCHAR2(100);
|
||||||
|
vDataBucketUri VARCHAR2(500);
|
||||||
|
BEGIN
|
||||||
|
-- Get bucket URI and credential
|
||||||
|
vDataBucketUri := CT_MRDS.FILE_MANAGER.GET_BUCKET_URI('ODS');
|
||||||
|
vCredentialName := CT_MRDS.ENV_MANAGER.gvCredentialName;
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('Checking ODS bucket: ' || vDataBucketUri);
|
||||||
|
|
||||||
|
-- Count files in cloud bucket
|
||||||
|
BEGIN
|
||||||
|
FOR rec IN (
|
||||||
|
SELECT object_name
|
||||||
|
FROM TABLE(MRDS_LOADER.cloud_wrapper.list_objects(
|
||||||
|
credential_name => vCredentialName,
|
||||||
|
location_uri => vDataBucketUri
|
||||||
|
))
|
||||||
|
WHERE object_name LIKE 'ODS/C2D/C2D_MPEC_%'
|
||||||
|
) LOOP
|
||||||
|
vCloudFileCount := vCloudFileCount + 1;
|
||||||
|
IF vCloudFileCount <= 5 THEN -- Show first 5 files
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- ' || rec.object_name);
|
||||||
|
END IF;
|
||||||
|
END LOOP;
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ Cloud bucket files found: ' || vCloudFileCount);
|
||||||
|
|
||||||
|
IF vCloudFileCount = 0 THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('⚠ Warning: No files found in cloud bucket');
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
EXCEPTION
|
||||||
|
WHEN OTHERS THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('⚠ Warning: Cannot access cloud bucket: ' || SQLERRM);
|
||||||
|
END;
|
||||||
|
END;
|
||||||
|
/
|
||||||
|
|
||||||
|
PROMPT
|
||||||
|
PROMPT =========================================================================
|
||||||
|
PROMPT MARS-956 Export Verification Summary
|
||||||
|
PROMPT =========================================================================
|
||||||
|
|
||||||
|
-- Final verification summary
|
||||||
|
DECLARE
|
||||||
|
vFileRegCount NUMBER := 0;
|
||||||
|
vCloudFileCount NUMBER := 0;
|
||||||
|
vLogErrorCount NUMBER := 0;
|
||||||
|
vOverallStatus VARCHAR2(20);
|
||||||
|
BEGIN
|
||||||
|
-- Count registered files
|
||||||
|
SELECT COUNT(*)
|
||||||
|
INTO vFileRegCount
|
||||||
|
FROM CT_MRDS.A_SOURCE_FILE_RECEIVED
|
||||||
|
WHERE RECEPTION_DATE >= SYSDATE - 1/24
|
||||||
|
AND SOURCE_FILE_NAME LIKE '200%';
|
||||||
|
|
||||||
|
-- Count process errors
|
||||||
|
SELECT COUNT(*)
|
||||||
|
INTO vLogErrorCount
|
||||||
|
FROM CT_MRDS.A_PROCESS_LOG
|
||||||
|
WHERE PROCESS_NAME = 'MARS-956'
|
||||||
|
AND LOG_LEVEL = 'ERROR'
|
||||||
|
AND LOG_TIMESTAMP >= SYSTIMESTAMP - INTERVAL '1' HOUR;
|
||||||
|
|
||||||
|
-- Determine overall status
|
||||||
|
IF vFileRegCount >= 9 AND vLogErrorCount = 0 THEN
|
||||||
|
vOverallStatus := 'SUCCESS';
|
||||||
|
ELSIF vFileRegCount > 0 AND vLogErrorCount = 0 THEN
|
||||||
|
vOverallStatus := 'PARTIAL SUCCESS';
|
||||||
|
ELSE
|
||||||
|
vOverallStatus := 'ISSUES DETECTED';
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('MARS-956 Export Verification: ' || vOverallStatus);
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- Registered files: ' || vFileRegCount || ' (expected: 9)');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- Process errors: ' || vLogErrorCount);
|
||||||
|
|
||||||
|
IF vOverallStatus = 'SUCCESS' THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ All validations passed - export successful');
|
||||||
|
ELSE
|
||||||
|
DBMS_OUTPUT.PUT_LINE('⚠ Some issues detected - review logs');
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
/
|
||||||
|
|
||||||
|
PROMPT =========================================================================
|
||||||
|
PROMPT Export Verification Completed
|
||||||
|
PROMPT =========================================================================
|
||||||
@@ -0,0 +1,322 @@
|
|||||||
|
-- ===================================================================
|
||||||
|
-- MARS-956 Verify Data Integrity: Source vs Exported Data Validation
|
||||||
|
-- ===================================================================
|
||||||
|
-- Purpose: Verify data integrity between source tables and exported files
|
||||||
|
-- Author: System Generated
|
||||||
|
-- Date: 2026-02-12
|
||||||
|
|
||||||
|
SET SERVEROUTPUT ON SIZE UNLIMITED
|
||||||
|
SET TIMING ON
|
||||||
|
|
||||||
|
PROMPT =========================================================================
|
||||||
|
PROMPT MARS-956 Data Integrity Verification
|
||||||
|
PROMPT =========================================================================
|
||||||
|
|
||||||
|
-- Check 1: Source table record counts vs expected ETL keys
|
||||||
|
PROMPT Checking source table record counts...
|
||||||
|
DECLARE
|
||||||
|
vAdminRows NUMBER := 0;
|
||||||
|
vContentRows NUMBER := 0;
|
||||||
|
vCriterionRows NUMBER := 0;
|
||||||
|
vTotalRows NUMBER := 0;
|
||||||
|
vExpectedFiles NUMBER := 9; -- 3 tables x 3 ETL keys average
|
||||||
|
BEGIN
|
||||||
|
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM OU_C2D.MPEC_ADMIN' INTO vAdminRows;
|
||||||
|
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM OU_C2D.MPEC_CONTENT' INTO vContentRows;
|
||||||
|
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM OU_C2D.MPEC_CONTENT_CRITERION' INTO vCriterionRows;
|
||||||
|
|
||||||
|
vTotalRows := vAdminRows + vContentRows + vCriterionRows;
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('Source table record counts:');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- MPEC_ADMIN: ' || vAdminRows || ' records');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- MPEC_CONTENT: ' || vContentRows || ' records');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- MPEC_CONTENT_CRITERION: ' || vCriterionRows || ' records');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- TOTAL: ' || vTotalRows || ' records');
|
||||||
|
|
||||||
|
IF vTotalRows > 0 THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ All source tables contain data');
|
||||||
|
ELSE
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✗ No data found in source tables');
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
/
|
||||||
|
|
||||||
|
-- Check 2: ETL key distribution analysis
|
||||||
|
PROMPT Checking ETL key distribution...
|
||||||
|
DECLARE
|
||||||
|
vAdminKeys NUMBER := 0;
|
||||||
|
vContentKeys NUMBER := 0;
|
||||||
|
vCriterionKeys NUMBER := 0;
|
||||||
|
vTotalKeys NUMBER := 0;
|
||||||
|
BEGIN
|
||||||
|
EXECUTE IMMEDIATE 'SELECT COUNT(DISTINCT A_ETL_LOAD_SET_FK) FROM OU_C2D.MPEC_ADMIN' INTO vAdminKeys;
|
||||||
|
EXECUTE IMMEDIATE 'SELECT COUNT(DISTINCT A_ETL_LOAD_SET_FK) FROM OU_C2D.MPEC_CONTENT' INTO vContentKeys;
|
||||||
|
EXECUTE IMMEDIATE 'SELECT COUNT(DISTINCT A_ETL_LOAD_SET_FK) FROM OU_C2D.MPEC_CONTENT_CRITERION' INTO vCriterionKeys;
|
||||||
|
|
||||||
|
SELECT COUNT(DISTINCT etl_key)
|
||||||
|
INTO vTotalKeys
|
||||||
|
FROM (
|
||||||
|
SELECT A_ETL_LOAD_SET_FK AS etl_key FROM OU_C2D.MPEC_ADMIN
|
||||||
|
UNION
|
||||||
|
SELECT A_ETL_LOAD_SET_FK FROM OU_C2D.MPEC_CONTENT
|
||||||
|
UNION
|
||||||
|
SELECT A_ETL_LOAD_SET_FK FROM OU_C2D.MPEC_CONTENT_CRITERION
|
||||||
|
);
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('ETL key distribution:');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- MPEC_ADMIN distinct keys: ' || vAdminKeys);
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- MPEC_CONTENT distinct keys: ' || vContentKeys);
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- MPEC_CONTENT_CRITERION distinct keys: ' || vCriterionKeys);
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- Total distinct ETL keys: ' || vTotalKeys);
|
||||||
|
|
||||||
|
IF vTotalKeys > 0 THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ ETL key distribution looks normal');
|
||||||
|
ELSE
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✗ No ETL keys found in source data');
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
/
|
||||||
|
|
||||||
|
-- Check 3: Template table compatibility verification
|
||||||
|
PROMPT Checking template table compatibility...
|
||||||
|
DECLARE
|
||||||
|
vAdminCols NUMBER := 0;
|
||||||
|
vContentCols NUMBER := 0;
|
||||||
|
vCriterionCols NUMBER := 0;
|
||||||
|
BEGIN
|
||||||
|
-- Check MPEC_ADMIN template compatibility
|
||||||
|
SELECT COUNT(*)
|
||||||
|
INTO vAdminCols
|
||||||
|
FROM all_tab_columns
|
||||||
|
WHERE owner = 'CT_ET_TEMPLATES'
|
||||||
|
AND table_name = 'C2D_MPEC_ADMIN';
|
||||||
|
|
||||||
|
-- Check MPEC_CONTENT template compatibility
|
||||||
|
SELECT COUNT(*)
|
||||||
|
INTO vContentCols
|
||||||
|
FROM all_tab_columns
|
||||||
|
WHERE owner = 'CT_ET_TEMPLATES'
|
||||||
|
AND table_name = 'C2D_MPEC_CONTENT';
|
||||||
|
|
||||||
|
-- Check MPEC_CONTENT_CRITERION template compatibility
|
||||||
|
SELECT COUNT(*)
|
||||||
|
INTO vCriterionCols
|
||||||
|
FROM all_tab_columns
|
||||||
|
WHERE owner = 'CT_ET_TEMPLATES'
|
||||||
|
AND table_name = 'C2D_MPEC_CONTENT_CRITERION';
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('Template table column counts:');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- C2D_MPEC_ADMIN: ' || vAdminCols || ' columns');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- C2D_MPEC_CONTENT: ' || vContentCols || ' columns');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- C2D_MPEC_CONTENT_CRITERION: ' || vCriterionCols || ' columns');
|
||||||
|
|
||||||
|
IF vAdminCols > 0 AND vContentCols > 0 AND vCriterionCols > 0 THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ All template tables have defined structure');
|
||||||
|
ELSE
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✗ One or more template tables missing columns');
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
/
|
||||||
|
|
||||||
|
-- Check 4: Verify A_ETL_LOAD_SET_FK values exist in A_LOAD_HISTORY
|
||||||
|
PROMPT Checking ETL key references in A_LOAD_HISTORY...
|
||||||
|
DECLARE
|
||||||
|
vValidKeys NUMBER := 0;
|
||||||
|
vTotalSourceKeys NUMBER := 0;
|
||||||
|
BEGIN
|
||||||
|
-- Count total distinct ETL keys in source tables
|
||||||
|
SELECT COUNT(DISTINCT etl_key)
|
||||||
|
INTO vTotalSourceKeys
|
||||||
|
FROM (
|
||||||
|
SELECT A_ETL_LOAD_SET_FK AS etl_key FROM OU_C2D.MPEC_ADMIN
|
||||||
|
UNION
|
||||||
|
SELECT A_ETL_LOAD_SET_FK FROM OU_C2D.MPEC_CONTENT
|
||||||
|
UNION
|
||||||
|
SELECT A_ETL_LOAD_SET_FK FROM OU_C2D.MPEC_CONTENT_CRITERION
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Count how many exist in A_LOAD_HISTORY
|
||||||
|
SELECT COUNT(DISTINCT etl_key)
|
||||||
|
INTO vValidKeys
|
||||||
|
FROM (
|
||||||
|
SELECT A_ETL_LOAD_SET_FK AS etl_key FROM OU_C2D.MPEC_ADMIN
|
||||||
|
UNION
|
||||||
|
SELECT A_ETL_LOAD_SET_FK FROM OU_C2D.MPEC_CONTENT
|
||||||
|
UNION
|
||||||
|
SELECT A_ETL_LOAD_SET_FK FROM OU_C2D.MPEC_CONTENT_CRITERION
|
||||||
|
) src
|
||||||
|
WHERE EXISTS (
|
||||||
|
SELECT 1 FROM CT_ODS.A_LOAD_HISTORY h
|
||||||
|
WHERE h.A_ETL_LOAD_SET_KEY = src.etl_key
|
||||||
|
);
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('ETL key validation:');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- Total distinct ETL keys in source: ' || vTotalSourceKeys);
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- Valid keys (exist in A_LOAD_HISTORY): ' || vValidKeys);
|
||||||
|
|
||||||
|
IF vValidKeys = vTotalSourceKeys THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ All source ETL keys are valid');
|
||||||
|
ELSE
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✗ Some ETL keys may be invalid: ' || (vTotalSourceKeys - vValidKeys));
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
/
|
||||||
|
|
||||||
|
PROMPT =========================================================================
|
||||||
|
PROMPT Data Integrity Verification Summary: Source vs Target Record Counts
|
||||||
|
PROMPT =========================================================================
|
||||||
|
|
||||||
|
DECLARE
|
||||||
|
TYPE t_table_info IS RECORD (
|
||||||
|
source_schema VARCHAR2(50),
|
||||||
|
source_table VARCHAR2(100),
|
||||||
|
external_table VARCHAR2(100),
|
||||||
|
description VARCHAR2(200)
|
||||||
|
);
|
||||||
|
TYPE t_table_list IS TABLE OF t_table_info;
|
||||||
|
|
||||||
|
vTables t_table_list;
|
||||||
|
vSourceCount NUMBER;
|
||||||
|
vTargetCount NUMBER;
|
||||||
|
vTotalSourceCount NUMBER := 0;
|
||||||
|
vTotalTargetCount NUMBER := 0;
|
||||||
|
vMismatchCount NUMBER := 0;
|
||||||
|
vSql VARCHAR2(4000);
|
||||||
|
vFileCount NUMBER := 0;
|
||||||
|
vValidationResult VARCHAR2(100);
|
||||||
|
BEGIN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('VERIFICATION TIME: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS'));
|
||||||
|
DBMS_OUTPUT.PUT_LINE('');
|
||||||
|
|
||||||
|
-- Initialize table list with C2D MPEC configuration
|
||||||
|
vTables := t_table_list(
|
||||||
|
t_table_info('OU_C2D', 'MPEC_ADMIN', 'ODS.C2D_MPEC_ADMIN_ODS', 'MPEC Admin data (ETL keys 2001-2005)'),
|
||||||
|
t_table_info('OU_C2D', 'MPEC_CONTENT', 'ODS.C2D_MPEC_CONTENT_ODS', 'MPEC Content data (ETL keys 2006-2008)'),
|
||||||
|
t_table_info('OU_C2D', 'MPEC_CONTENT_CRITERION', 'ODS.C2D_MPEC_CONTENT_CRITERION_ODS', 'MPEC Criterion data (ETL keys 2009-2010)')
|
||||||
|
);
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('-----------------------------------------------------------------------------------------');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('Table Name Source Count Target Count Status Difference');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('-----------------------------------------------------------------------------------------');
|
||||||
|
|
||||||
|
FOR i IN 1..vTables.COUNT LOOP
|
||||||
|
-- Get source table count
|
||||||
|
vSql := 'SELECT COUNT(*) FROM ' || vTables(i).source_schema || '.' || vTables(i).source_table;
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
EXECUTE IMMEDIATE vSql INTO vSourceCount;
|
||||||
|
vTotalSourceCount := vTotalSourceCount + vSourceCount;
|
||||||
|
EXCEPTION
|
||||||
|
WHEN OTHERS THEN
|
||||||
|
vSourceCount := -1;
|
||||||
|
DBMS_OUTPUT.PUT_LINE(RPAD(vTables(i).source_table, 28) || 'ERROR: Cannot access source table');
|
||||||
|
CONTINUE;
|
||||||
|
END;
|
||||||
|
|
||||||
|
-- Get target external table count
|
||||||
|
vSql := 'SELECT COUNT(*) FROM ' || vTables(i).external_table;
|
||||||
|
BEGIN
|
||||||
|
EXECUTE IMMEDIATE vSql INTO vTargetCount;
|
||||||
|
vTotalTargetCount := vTotalTargetCount + vTargetCount;
|
||||||
|
EXCEPTION
|
||||||
|
WHEN OTHERS THEN
|
||||||
|
-- Handle expected errors for empty external tables
|
||||||
|
-- ORA-29913: error in executing ODCIEXTTABLEOPEN callout
|
||||||
|
-- ORA-29400: data cartridge error
|
||||||
|
-- KUP-13023: nothing matched wildcard query (no files in bucket)
|
||||||
|
IF SQLCODE IN (-29913, -29400) OR SQLERRM LIKE '%KUP-13023%' OR SQLERRM LIKE '%does not exist%' THEN
|
||||||
|
vTargetCount := 0; -- Treat as empty (no files exported yet)
|
||||||
|
ELSE
|
||||||
|
vTargetCount := -1; -- Real error
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
|
||||||
|
-- Display comparison results
|
||||||
|
IF vSourceCount = -1 OR vTargetCount = -1 THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE(RPAD(vTables(i).source_table, 28) ||
|
||||||
|
RPAD(CASE WHEN vSourceCount = -1 THEN 'ERROR' ELSE TO_CHAR(vSourceCount) END, 14) ||
|
||||||
|
RPAD(CASE WHEN vTargetCount = -1 THEN 'ERROR' ELSE TO_CHAR(vTargetCount) END, 14) ||
|
||||||
|
'ERROR ' || 'N/A');
|
||||||
|
ELSIF vSourceCount = vTargetCount THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE(RPAD(vTables(i).source_table, 28) ||
|
||||||
|
RPAD(TO_CHAR(vSourceCount), 14) ||
|
||||||
|
RPAD(TO_CHAR(vTargetCount), 14) ||
|
||||||
|
'MATCH ' || '0');
|
||||||
|
ELSE
|
||||||
|
vMismatchCount := vMismatchCount + 1;
|
||||||
|
DBMS_OUTPUT.PUT_LINE(RPAD(vTables(i).source_table, 28) ||
|
||||||
|
RPAD(TO_CHAR(vSourceCount), 14) ||
|
||||||
|
RPAD(TO_CHAR(vTargetCount), 14) ||
|
||||||
|
'MISMATCH ' || TO_CHAR(vTargetCount - vSourceCount));
|
||||||
|
END IF;
|
||||||
|
END LOOP;
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('-----------------------------------------------------------------------------------------');
|
||||||
|
DBMS_OUTPUT.PUT_LINE(RPAD('TOTALS:', 28) ||
|
||||||
|
RPAD(TO_CHAR(vTotalSourceCount), 14) ||
|
||||||
|
RPAD(TO_CHAR(vTotalTargetCount), 14) ||
|
||||||
|
CASE WHEN vTotalSourceCount = vTotalTargetCount THEN 'MATCH' ELSE 'MISMATCH' END || ' ' ||
|
||||||
|
TO_CHAR(vTotalTargetCount - vTotalSourceCount));
|
||||||
|
|
||||||
|
-- Count exported files for additional verification
|
||||||
|
SELECT COUNT(*)
|
||||||
|
INTO vFileCount
|
||||||
|
FROM CT_MRDS.A_SOURCE_FILE_RECEIVED
|
||||||
|
WHERE RECEPTION_DATE >= SYSDATE - 1/24
|
||||||
|
AND (SOURCE_FILE_NAME LIKE '200_%');
|
||||||
|
|
||||||
|
-- Determine overall validation result
|
||||||
|
IF vTotalSourceCount = vTotalTargetCount AND vMismatchCount = 0 AND vFileCount > 0 THEN
|
||||||
|
vValidationResult := 'SUCCESS';
|
||||||
|
ELSIF vTotalTargetCount = 0 AND vFileCount = 0 THEN
|
||||||
|
vValidationResult := 'NO EXPORT DETECTED';
|
||||||
|
ELSIF vMismatchCount > 0 THEN
|
||||||
|
vValidationResult := 'DATA MISMATCH';
|
||||||
|
ELSE
|
||||||
|
vValidationResult := 'PARTIAL SUCCESS';
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('MARS-956 Record Count Verification: ' || vValidationResult);
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- Source records: ' || vTotalSourceCount);
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- Target records: ' || vTotalTargetCount);
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- Export files: ' || vFileCount);
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- Mismatched tables: ' || vMismatchCount);
|
||||||
|
|
||||||
|
IF vValidationResult = 'SUCCESS' THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ All record counts match - export successful');
|
||||||
|
ELSIF vValidationResult = 'NO EXPORT DETECTED' THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('⚠ No export detected - check export execution');
|
||||||
|
ELSIF vValidationResult = 'DATA MISMATCH' THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✗ Record count mismatches found - investigate data integrity');
|
||||||
|
ELSE
|
||||||
|
DBMS_OUTPUT.PUT_LINE('⚠ Partial success - review individual table results');
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Additional ETL key analysis for C2D MPEC data
|
||||||
|
DBMS_OUTPUT.PUT_LINE('');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('ETL Key Analysis:');
|
||||||
|
|
||||||
|
DECLARE
|
||||||
|
vAdminKeys NUMBER;
|
||||||
|
vContentKeys NUMBER;
|
||||||
|
vCriterionKeys NUMBER;
|
||||||
|
BEGIN
|
||||||
|
EXECUTE IMMEDIATE 'SELECT COUNT(DISTINCT A_ETL_LOAD_SET_FK) FROM OU_C2D.MPEC_ADMIN' INTO vAdminKeys;
|
||||||
|
EXECUTE IMMEDIATE 'SELECT COUNT(DISTINCT A_ETL_LOAD_SET_FK) FROM OU_C2D.MPEC_CONTENT' INTO vContentKeys;
|
||||||
|
EXECUTE IMMEDIATE 'SELECT COUNT(DISTINCT A_ETL_LOAD_SET_FK) FROM OU_C2D.MPEC_CONTENT_CRITERION' INTO vCriterionKeys;
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- MPEC_ADMIN distinct ETL keys: ' || vAdminKeys || ' (expected: 3 for keys 2001-2005)');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- MPEC_CONTENT distinct ETL keys: ' || vContentKeys || ' (expected: 3 for keys 2006-2008)');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- MPEC_CONTENT_CRITERION distinct ETL keys: ' || vCriterionKeys || ' (expected: 2 for keys 2009-2010)');
|
||||||
|
|
||||||
|
-- Expected file count = sum of distinct ETL keys per table
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- Expected export files: ' || (vAdminKeys + vContentKeys + vCriterionKeys));
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- Actual export files: ' || vFileCount);
|
||||||
|
END;
|
||||||
|
END;
|
||||||
|
/
|
||||||
|
|
||||||
|
PROMPT =========================================================================
|
||||||
|
PROMPT Data Integrity Verification Completed
|
||||||
|
PROMPT =========================================================================
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
-- ===================================================================
|
||||||
|
-- MARS-956 Rollback Step 1: Delete File Registrations
|
||||||
|
-- ===================================================================
|
||||||
|
-- Purpose: Remove MARS-956 export file registrations from A_SOURCE_FILE_RECEIVED
|
||||||
|
-- Author: System Generated
|
||||||
|
-- Date: 2026-02-12
|
||||||
|
|
||||||
|
SET SERVEROUTPUT ON SIZE UNLIMITED
|
||||||
|
SET TIMING ON
|
||||||
|
|
||||||
|
PROMPT =========================================================================
|
||||||
|
PROMPT MARS-956 Rollback Step 1: Delete File Registrations
|
||||||
|
PROMPT =========================================================================
|
||||||
|
|
||||||
|
DECLARE
|
||||||
|
vFileCount NUMBER := 0;
|
||||||
|
vDeletedCount NUMBER := 0;
|
||||||
|
BEGIN
|
||||||
|
-- Count files to be deleted
|
||||||
|
SELECT COUNT(*)
|
||||||
|
INTO vFileCount
|
||||||
|
FROM CT_MRDS.A_SOURCE_FILE_RECEIVED
|
||||||
|
WHERE SOURCE_FILE_NAME LIKE '200%' -- ETL keys 2001-2010
|
||||||
|
AND RECEPTION_DATE >= SYSDATE - 7; -- Last week (safety)
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('Files to be deleted: ' || vFileCount);
|
||||||
|
|
||||||
|
IF vFileCount > 0 THEN
|
||||||
|
-- Show files before deletion
|
||||||
|
DBMS_OUTPUT.PUT_LINE('Files being removed:');
|
||||||
|
FOR rec IN (
|
||||||
|
SELECT A_SOURCE_FILE_RECEIVED_KEY,
|
||||||
|
SUBSTR(SOURCE_FILE_NAME, 1, 50) AS FILE_NAME,
|
||||||
|
TO_CHAR(RECEPTION_DATE, 'YYYY-MM-DD HH24:MI:SS') AS RECEIVED_TIME
|
||||||
|
FROM CT_MRDS.A_SOURCE_FILE_RECEIVED
|
||||||
|
WHERE SOURCE_FILE_NAME LIKE '200%'
|
||||||
|
AND RECEPTION_DATE >= SYSDATE - 7
|
||||||
|
ORDER BY RECEPTION_DATE DESC
|
||||||
|
) LOOP
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- ' || rec.FILE_NAME || ' (ID: ' || rec.A_SOURCE_FILE_RECEIVED_KEY || ')');
|
||||||
|
END LOOP;
|
||||||
|
|
||||||
|
-- Delete the file registrations
|
||||||
|
DELETE FROM CT_MRDS.A_SOURCE_FILE_RECEIVED
|
||||||
|
WHERE SOURCE_FILE_NAME LIKE '200%'
|
||||||
|
AND RECEPTION_DATE >= SYSDATE - 7;
|
||||||
|
|
||||||
|
vDeletedCount := SQL%ROWCOUNT;
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ Successfully deleted ' || vDeletedCount || ' file registrations');
|
||||||
|
|
||||||
|
-- Log the rollback action
|
||||||
|
INSERT INTO CT_MRDS.A_PROCESS_LOG (PROCESS_NAME, PROCEDURE_NAME, LOG_LEVEL, LOG_MESSAGE)
|
||||||
|
VALUES ('MARS-956-ROLLBACK', 'DELETE_FILE_REGISTRATIONS', 'INFO',
|
||||||
|
'Deleted ' || vDeletedCount || ' file registrations');
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
|
ELSE
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ No file registrations found to delete');
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
EXCEPTION
|
||||||
|
WHEN OTHERS THEN
|
||||||
|
ROLLBACK;
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✗ Error during file registration deletion: ' || SQLERRM);
|
||||||
|
-- Log the error
|
||||||
|
INSERT INTO CT_MRDS.A_PROCESS_LOG (PROCESS_NAME, PROCEDURE_NAME, LOG_LEVEL, LOG_MESSAGE)
|
||||||
|
VALUES ('MARS-956-ROLLBACK', 'DELETE_FILE_REGISTRATIONS', 'ERROR',
|
||||||
|
'Failed to delete file registrations: ' || SQLERRM);
|
||||||
|
COMMIT;
|
||||||
|
RAISE;
|
||||||
|
END;
|
||||||
|
/
|
||||||
|
|
||||||
|
PROMPT =========================================================================
|
||||||
|
PROMPT File Registration Rollback Completed
|
||||||
|
PROMPT =========================================================================
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
-- ===================================================================
|
||||||
|
-- MARS-956 Rollback Step 2: Clean Process Logs
|
||||||
|
-- ===================================================================
|
||||||
|
-- Purpose: Remove MARS-956 process logs from A_PROCESS_LOG
|
||||||
|
-- Author: System Generated
|
||||||
|
-- Date: 2026-02-12
|
||||||
|
|
||||||
|
SET SERVEROUTPUT ON SIZE UNLIMITED
|
||||||
|
SET TIMING ON
|
||||||
|
|
||||||
|
PROMPT =========================================================================
|
||||||
|
PROMPT MARS-956 Rollback Step 2: Clean Process Logs
|
||||||
|
PROMPT =========================================================================
|
||||||
|
|
||||||
|
DECLARE
|
||||||
|
vLogCount NUMBER := 0;
|
||||||
|
vDeletedCount NUMBER := 0;
|
||||||
|
BEGIN
|
||||||
|
-- Count logs to be deleted
|
||||||
|
SELECT COUNT(*)
|
||||||
|
INTO vLogCount
|
||||||
|
FROM CT_MRDS.A_PROCESS_LOG
|
||||||
|
WHERE PROCESS_NAME IN ('MARS-956', 'MARS-956-ROLLBACK')
|
||||||
|
AND LOG_TIMESTAMP >= SYSDATE - 7; -- Last week (safety)
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('Process log entries to be deleted: ' || vLogCount);
|
||||||
|
|
||||||
|
IF vLogCount > 0 THEN
|
||||||
|
-- Show recent logs before deletion
|
||||||
|
DBMS_OUTPUT.PUT_LINE('Recent MARS-956 log entries being removed:');
|
||||||
|
FOR rec IN (
|
||||||
|
SELECT A_PROCESS_LOG_KEY,
|
||||||
|
TO_CHAR(LOG_TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS') AS LOG_TIME,
|
||||||
|
PROCEDURE_NAME,
|
||||||
|
LOG_LEVEL,
|
||||||
|
SUBSTR(LOG_MESSAGE, 1, 40) AS MESSAGE
|
||||||
|
FROM CT_MRDS.A_PROCESS_LOG
|
||||||
|
WHERE PROCESS_NAME IN ('MARS-956', 'MARS-956-ROLLBACK')
|
||||||
|
AND LOG_TIMESTAMP >= SYSDATE - 7
|
||||||
|
ORDER BY LOG_TIMESTAMP DESC
|
||||||
|
FETCH FIRST 10 ROWS ONLY
|
||||||
|
) LOOP
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- ' || rec.LOG_TIME || ' [' || rec.LOG_LEVEL || '] ' ||
|
||||||
|
rec.PROCEDURE_NAME || ': ' || rec.MESSAGE);
|
||||||
|
END LOOP;
|
||||||
|
|
||||||
|
-- Delete the process logs
|
||||||
|
DELETE FROM CT_MRDS.A_PROCESS_LOG
|
||||||
|
WHERE PROCESS_NAME IN ('MARS-956', 'MARS-956-ROLLBACK')
|
||||||
|
AND LOG_TIMESTAMP >= SYSDATE - 7;
|
||||||
|
|
||||||
|
vDeletedCount := SQL%ROWCOUNT;
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ Successfully deleted ' || vDeletedCount || ' process log entries');
|
||||||
|
|
||||||
|
ELSE
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ No process log entries found to delete');
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
EXCEPTION
|
||||||
|
WHEN OTHERS THEN
|
||||||
|
ROLLBACK;
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✗ Error during process log cleanup: ' || SQLERRM);
|
||||||
|
-- Log the error (will remain after rollback for debugging)
|
||||||
|
INSERT INTO CT_MRDS.A_PROCESS_LOG (PROCESS_NAME, PROCEDURE_NAME, LOG_LEVEL, LOG_MESSAGE)
|
||||||
|
VALUES ('MARS-956-ROLLBACK', 'CLEANUP_PROCESS_LOGS', 'ERROR',
|
||||||
|
'Failed to clean process logs: ' || SQLERRM);
|
||||||
|
COMMIT;
|
||||||
|
RAISE;
|
||||||
|
END;
|
||||||
|
/
|
||||||
|
|
||||||
|
PROMPT =========================================================================
|
||||||
|
PROMPT Process Log Cleanup Completed
|
||||||
|
PROMPT =========================================================================
|
||||||
@@ -0,0 +1,207 @@
|
|||||||
|
-- ===================================================================
|
||||||
|
-- MARS-956 Rollback Verification: Confirm Rollback Completion
|
||||||
|
-- ===================================================================
|
||||||
|
-- Purpose: Verify that MARS-956 rollback completed successfully
|
||||||
|
-- Author: System Generated
|
||||||
|
-- Date: 2026-02-12
|
||||||
|
|
||||||
|
SET SERVEROUTPUT ON SIZE UNLIMITED
|
||||||
|
SET TIMING ON
|
||||||
|
|
||||||
|
PROMPT =========================================================================
|
||||||
|
PROMPT MARS-956 Rollback Verification
|
||||||
|
PROMPT =========================================================================
|
||||||
|
|
||||||
|
-- Check 1: Verify file registrations were removed
|
||||||
|
PROMPT Checking file registration cleanup...
|
||||||
|
DECLARE
|
||||||
|
vRemainingFiles NUMBER := 0;
|
||||||
|
BEGIN
|
||||||
|
SELECT COUNT(*)
|
||||||
|
INTO vRemainingFiles
|
||||||
|
FROM CT_MRDS.A_SOURCE_FILE_RECEIVED
|
||||||
|
WHERE SOURCE_FILE_NAME LIKE '200%' -- ETL keys 2001-2010
|
||||||
|
AND RECEPTION_DATE >= SYSDATE - 7; -- Last week
|
||||||
|
|
||||||
|
IF vRemainingFiles = 0 THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ All MARS-956 file registrations successfully removed');
|
||||||
|
ELSE
|
||||||
|
DBMS_OUTPUT.PUT_LINE('⚠ Warning: ' || vRemainingFiles || ' file registrations still exist');
|
||||||
|
|
||||||
|
-- Show remaining files
|
||||||
|
FOR rec IN (
|
||||||
|
SELECT SUBSTR(SOURCE_FILE_NAME, 1, 50) AS FILE_NAME,
|
||||||
|
TO_CHAR(RECEPTION_DATE, 'YYYY-MM-DD HH24:MI:SS') AS RECEIVED_TIME
|
||||||
|
FROM CT_MRDS.A_SOURCE_FILE_RECEIVED
|
||||||
|
WHERE SOURCE_FILE_NAME LIKE '200%'
|
||||||
|
AND RECEPTION_DATE >= SYSDATE - 7
|
||||||
|
) LOOP
|
||||||
|
DBMS_OUTPUT.PUT_LINE(' Remaining: ' || rec.FILE_NAME);
|
||||||
|
END LOOP;
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
/
|
||||||
|
|
||||||
|
-- Check 2: Verify process logs were cleaned
|
||||||
|
PROMPT Checking process log cleanup...
|
||||||
|
DECLARE
|
||||||
|
vRemainingLogs NUMBER := 0;
|
||||||
|
BEGIN
|
||||||
|
SELECT COUNT(*)
|
||||||
|
INTO vRemainingLogs
|
||||||
|
FROM CT_MRDS.A_PROCESS_LOG
|
||||||
|
WHERE PROCESS_NAME = 'MARS-956'
|
||||||
|
AND LOG_TIMESTAMP >= SYSDATE - 7; -- Last week
|
||||||
|
|
||||||
|
IF vRemainingLogs = 0 THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ All MARS-956 process logs successfully removed');
|
||||||
|
ELSE
|
||||||
|
DBMS_OUTPUT.PUT_LINE('⚠ Warning: ' || vRemainingLogs || ' process log entries still exist');
|
||||||
|
|
||||||
|
-- Show remaining logs (first few)
|
||||||
|
FOR rec IN (
|
||||||
|
SELECT TO_CHAR(LOG_TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS') AS LOG_TIME,
|
||||||
|
PROCEDURE_NAME,
|
||||||
|
SUBSTR(LOG_MESSAGE, 1, 40) AS MESSAGE
|
||||||
|
FROM CT_MRDS.A_PROCESS_LOG
|
||||||
|
WHERE PROCESS_NAME = 'MARS-956'
|
||||||
|
AND LOG_TIMESTAMP >= SYSDATE - 7
|
||||||
|
ORDER BY LOG_TIMESTAMP DESC
|
||||||
|
FETCH FIRST 3 ROWS ONLY
|
||||||
|
) LOOP
|
||||||
|
DBMS_OUTPUT.PUT_LINE(' Remaining: ' || rec.LOG_TIME || ' ' || rec.PROCEDURE_NAME);
|
||||||
|
END LOOP;
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
/
|
||||||
|
|
||||||
|
-- Check 3: Verify cloud bucket cleanup (informational only)
|
||||||
|
PROMPT Checking cloud bucket status...
|
||||||
|
DECLARE
|
||||||
|
vCloudFileCount NUMBER := 0;
|
||||||
|
vCredentialName VARCHAR2(100);
|
||||||
|
vDataBucketUri VARCHAR2(500);
|
||||||
|
BEGIN
|
||||||
|
-- Get bucket URI and credential
|
||||||
|
vDataBucketUri := CT_MRDS.FILE_MANAGER.GET_BUCKET_URI('ODS');
|
||||||
|
vCredentialName := CT_MRDS.ENV_MANAGER.gvCredentialName;
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('Checking ODS bucket: ' || vDataBucketUri);
|
||||||
|
|
||||||
|
-- Count remaining files in cloud bucket
|
||||||
|
BEGIN
|
||||||
|
FOR rec IN (
|
||||||
|
SELECT object_name
|
||||||
|
FROM TABLE(MRDS_LOADER.cloud_wrapper.list_objects(
|
||||||
|
credential_name => vCredentialName,
|
||||||
|
location_uri => vDataBucketUri
|
||||||
|
))
|
||||||
|
WHERE object_name LIKE 'ODS/C2D/C2D_MPEC_%'
|
||||||
|
) LOOP
|
||||||
|
vCloudFileCount := vCloudFileCount + 1;
|
||||||
|
IF vCloudFileCount <= 3 THEN -- Show first 3 files
|
||||||
|
DBMS_OUTPUT.PUT_LINE(' Cloud file: ' || rec.object_name);
|
||||||
|
END IF;
|
||||||
|
END LOOP;
|
||||||
|
|
||||||
|
IF vCloudFileCount = 0 THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ No C2D MPEC files found in cloud bucket');
|
||||||
|
ELSE
|
||||||
|
DBMS_OUTPUT.PUT_LINE('ℹ Info: ' || vCloudFileCount || ' C2D MPEC files still in cloud bucket');
|
||||||
|
DBMS_OUTPUT.PUT_LINE(' Note: Cloud files are not automatically deleted by rollback');
|
||||||
|
DBMS_OUTPUT.PUT_LINE(' Manual deletion required if needed');
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
EXCEPTION
|
||||||
|
WHEN OTHERS THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('⚠ Warning: Cannot check cloud bucket: ' || SQLERRM);
|
||||||
|
END;
|
||||||
|
END;
|
||||||
|
/
|
||||||
|
|
||||||
|
-- Check 4: Verify rollback logs were created
|
||||||
|
PROMPT Checking rollback operation logs...
|
||||||
|
DECLARE
|
||||||
|
vRollbackLogs NUMBER := 0;
|
||||||
|
BEGIN
|
||||||
|
SELECT COUNT(*)
|
||||||
|
INTO vRollbackLogs
|
||||||
|
FROM CT_MRDS.A_PROCESS_LOG
|
||||||
|
WHERE PROCESS_NAME = 'MARS-956-ROLLBACK'
|
||||||
|
AND LOG_TIMESTAMP >= SYSDATE - 1/24; -- Last hour
|
||||||
|
|
||||||
|
IF vRollbackLogs > 0 THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ Rollback operation logs found: ' || vRollbackLogs);
|
||||||
|
|
||||||
|
-- Show recent rollback logs
|
||||||
|
FOR rec IN (
|
||||||
|
SELECT TO_CHAR(LOG_TIMESTAMP, 'HH24:MI:SS') AS LOG_TIME,
|
||||||
|
PROCEDURE_NAME,
|
||||||
|
LOG_LEVEL,
|
||||||
|
SUBSTR(LOG_MESSAGE, 1, 50) AS MESSAGE
|
||||||
|
FROM CT_MRDS.A_PROCESS_LOG
|
||||||
|
WHERE PROCESS_NAME = 'MARS-956-ROLLBACK'
|
||||||
|
AND LOG_TIMESTAMP >= SYSDATE - 1/24
|
||||||
|
ORDER BY LOG_TIMESTAMP DESC
|
||||||
|
) LOOP
|
||||||
|
DBMS_OUTPUT.PUT_LINE(' ' || rec.LOG_TIME || ' [' || rec.LOG_LEVEL || '] ' ||
|
||||||
|
rec.PROCEDURE_NAME || ': ' || rec.MESSAGE);
|
||||||
|
END LOOP;
|
||||||
|
ELSE
|
||||||
|
DBMS_OUTPUT.PUT_LINE('⚠ Warning: No rollback operation logs found');
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
/
|
||||||
|
|
||||||
|
PROMPT
|
||||||
|
PROMPT =========================================================================
|
||||||
|
PROMPT MARS-956 Rollback Verification Summary
|
||||||
|
PROMPT =========================================================================
|
||||||
|
|
||||||
|
DECLARE
|
||||||
|
vRemainingFiles NUMBER := 0;
|
||||||
|
vRemainingLogs NUMBER := 0;
|
||||||
|
vRollbackStatus VARCHAR2(20);
|
||||||
|
BEGIN
|
||||||
|
-- Count remaining registrations
|
||||||
|
SELECT COUNT(*)
|
||||||
|
INTO vRemainingFiles
|
||||||
|
FROM CT_MRDS.A_SOURCE_FILE_RECEIVED
|
||||||
|
WHERE SOURCE_FILE_NAME LIKE '200%'
|
||||||
|
AND RECEPTION_DATE >= SYSDATE - 7;
|
||||||
|
|
||||||
|
-- Count remaining process logs
|
||||||
|
SELECT COUNT(*)
|
||||||
|
INTO vRemainingLogs
|
||||||
|
FROM CT_MRDS.A_PROCESS_LOG
|
||||||
|
WHERE PROCESS_NAME = 'MARS-956'
|
||||||
|
AND LOG_TIMESTAMP >= SYSDATE - 7;
|
||||||
|
|
||||||
|
-- Determine rollback status
|
||||||
|
IF vRemainingFiles = 0 AND vRemainingLogs = 0 THEN
|
||||||
|
vRollbackStatus := 'COMPLETE';
|
||||||
|
ELSIF vRemainingFiles = 0 OR vRemainingLogs = 0 THEN
|
||||||
|
vRollbackStatus := 'PARTIAL';
|
||||||
|
ELSE
|
||||||
|
vRollbackStatus := 'INCOMPLETE';
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('MARS-956 Rollback Status: ' || vRollbackStatus);
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- Remaining file registrations: ' || vRemainingFiles);
|
||||||
|
DBMS_OUTPUT.PUT_LINE('- Remaining process logs: ' || vRemainingLogs);
|
||||||
|
|
||||||
|
IF vRollbackStatus = 'COMPLETE' THEN
|
||||||
|
DBMS_OUTPUT.PUT_LINE('✓ Rollback completed successfully - system clean');
|
||||||
|
ELSE
|
||||||
|
DBMS_OUTPUT.PUT_LINE('⚠ Rollback incomplete - manual cleanup may be required');
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
DBMS_OUTPUT.PUT_LINE('');
|
||||||
|
DBMS_OUTPUT.PUT_LINE('Note: Cloud bucket files (OCI) are not automatically removed');
|
||||||
|
DBMS_OUTPUT.PUT_LINE(' Use OCI console or DBMS_CLOUD commands for file deletion if needed');
|
||||||
|
END;
|
||||||
|
/
|
||||||
|
|
||||||
|
PROMPT =========================================================================
|
||||||
|
PROMPT Rollback Verification Completed
|
||||||
|
PROMPT =========================================================================
|
||||||
@@ -1,68 +1,296 @@
|
|||||||
# MARS-956: Exporting Historical data for ODS: C2D MPEC (delta)
|
# MARS-956: One-Time C2D MPEC Data Export from Operational Database to External Tables
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
This package performs a one-time bulk export of C2D MPEC data from operational database tables (OU_C2D schema) to new external tables in OCI buckets. The export uses DATA_EXPORTER v2.7.5 with pRegisterExport parameter to move historical data to ODS bucket in CSV format with automatic file registration.
|
||||||
|
|
||||||
**Purpose**: One-time export of historical C2D MPEC delta data from operational database (OU_C2D) to DATA bucket as CSV files.
|
**Migration Strategy:**
|
||||||
|
- **Source**: OU_C2D schema tables (MPEC_ADMIN, MPEC_CONTENT, MPEC_CONTENT_CRITERION)
|
||||||
|
- **Target**: ODS bucket (CSV format)
|
||||||
|
- **Registration**: Files automatically registered in A_SOURCE_FILE_RECEIVED
|
||||||
|
- **Template Compatibility**: Uses CT_ET_TEMPLATES.C2D_MPEC_* for column ordering
|
||||||
|
|
||||||
**Approach**: Use DATA_EXPORTER export functionality EXPORT_TABLE_DATA for bulk data movement with file registration.
|
**Key Features:**
|
||||||
|
- Automatic file registration with pRegisterExport=TRUE
|
||||||
|
- Template table column order compliance
|
||||||
|
- Comprehensive verification and rollback capabilities
|
||||||
|
- ODS/C2D bucket path structure
|
||||||
|
|
||||||
**Input**: Old tables in OU_C2D operational database
|
## Contents
|
||||||
**Output**: CSV files in DATA bucket
|
- `install_mars956.sql` - Master installation script with SPOOL logging
|
||||||
**Mapping**: Structure must match new ODS template tables
|
- `rollback_mars956.sql` - Master rollback script
|
||||||
|
- `00_MARS_956_*.sql` - Prerequisites check
|
||||||
## Tables to Export
|
- `01_MARS_956_*.sql` - Data export script
|
||||||
|
- `02_MARS_956_*.sql` - Export verification
|
||||||
| Source Table (OU_C2D) | Target Location (DATA) | Export Type | Time Dependency |
|
- `03_MARS_956_*.sql` - Data integrity validation
|
||||||
|------------------------|-------------------------|-------------|------------------|
|
- `91_MARS_956_*.sql` - Rollback scripts
|
||||||
| `MPEC_ADMIN` | `mrds_data_dev/DATA/C2D/C2D_MPEC_ADMIN` | CSV to DATA | Sync with REL_02 |
|
- `99_MARS_956_*.sql` - Rollback verification
|
||||||
| `MPEC_CONTENT` | `mrds_data_dev/DATA/C2D/C2D_MPEC_CONTENT` | CSV to DATA | Sync with REL_02 |
|
|
||||||
| `MPEC_CONTENT_CRITERION` | `mrds_data_dev/DATA/C2D/C2D_MPEC_CONTENT_CRITERION` | CSV to DATA | Sync with REL_02 |
|
|
||||||
|
|
||||||
## Export Strategy
|
|
||||||
|
|
||||||
- **Format**: CSV files in DATA bucket
|
|
||||||
- **Reason**: Complete history of delta records needed for all queries
|
|
||||||
- **Method**: `DATA_EXPORTER.EXPORT_TABLE_DATA` procedure
|
|
||||||
- **Bucket Area**: `'DATA'`
|
|
||||||
- **Folder Structure**: `'DATA/C2D/{TABLE_NAME}'`
|
|
||||||
- **File Registration**: Files registered in A_SOURCE_FILE_RECEIVED table
|
|
||||||
|
|
||||||
## Installation Steps
|
|
||||||
|
|
||||||
1. Run master install script: `@install_mars956.sql`
|
|
||||||
2. Verify exports completed successfully
|
|
||||||
3. Confirm CSV files created in DATA bucket with expected structure
|
|
||||||
|
|
||||||
## Files Structure
|
|
||||||
|
|
||||||
```
|
|
||||||
MARS-956/
|
|
||||||
├── README.md # This file
|
|
||||||
├── install_mars956.sql # Master installation script
|
|
||||||
├── 01_MARS_956_export_c2d_mpec_data.sql # Export procedures execution
|
|
||||||
├── track_package_versions.sql # Universal version tracking
|
|
||||||
├── verify_packages_version.sql # Universal version verification
|
|
||||||
└── rollback_mars956.sql # Rollback script (if needed)
|
|
||||||
```
|
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
- Oracle Database 23ai with DBMS_CLOUD
|
||||||
|
- ADMIN user access (required for all MARS installations)
|
||||||
|
- DATA_EXPORTER package v2.7.5 or higher
|
||||||
|
- OU_C2D schema with populated MPEC tables
|
||||||
|
- CT_ET_TEMPLATES schema with C2D_MPEC_* template tables
|
||||||
|
- OCI bucket access credentials configured
|
||||||
|
|
||||||
- OU_C2D schema access for source tables
|
## Data Structure
|
||||||
- DATA_EXPORTER package v2.7.5+ deployed (with pRegisterExport support)
|
|
||||||
- DEF_CRED_ARN credentials configured
|
|
||||||
- DATA bucket accessible
|
|
||||||
|
|
||||||
## Post-Installation Verification
|
### Source Tables (OU_C2D schema)
|
||||||
|
- **MPEC_ADMIN**: 5 records with ETL keys 2001-2005
|
||||||
|
- **MPEC_CONTENT**: 5 records with ETL keys 2006-2008
|
||||||
|
- **MPEC_CONTENT_CRITERION**: 9 records with ETL keys 2009-2010
|
||||||
|
|
||||||
1. Check export completion in A_PROCESS_LOG
|
### Template Tables (CT_ET_TEMPLATES schema)
|
||||||
2. Verify CSV files created in DATA bucket
|
- **C2D_MPEC_ADMIN**: 10 columns
|
||||||
3. Validate file structure matches template tables
|
- **C2D_MPEC_CONTENT**: 87 columns
|
||||||
4. Confirm row counts match source tables
|
- **C2D_MPEC_CONTENT_CRITERION**: 4 columns
|
||||||
5. Check file registration in A_SOURCE_FILE_RECEIVED table
|
|
||||||
|
|
||||||
## Notes
|
### Target Structure (OCI ODS bucket)
|
||||||
|
```
|
||||||
|
mrds_data_dev/ODS/C2D/C2D_MPEC_ADMIN/*.csv
|
||||||
|
mrds_data_dev/ODS/C2D/C2D_MPEC_CONTENT/*.csv
|
||||||
|
mrds_data_dev/ODS/C2D/C2D_MPEC_CONTENT_CRITERION/*.csv
|
||||||
|
```
|
||||||
|
|
||||||
- This is a **one-time** data migration
|
## Enhanced Validation Framework
|
||||||
- No package modifications required (uses existing DATA_EXPORTER)
|
|
||||||
- Export timing critical - must sync with REL_02 deployment
|
### Pre-Export Validation (Check 1-5)
|
||||||
- Complete history required for delta queries
|
1. **Source Table Analysis**: Comprehensive source table record counting with business rule validation
|
||||||
|
2. **Template Table Verification**: Ensures external table templates exist and are accessible
|
||||||
|
3. **ETL Key Validation**: Verifies integrity of load history tracking keys (expected: 2001-2010)
|
||||||
|
4. **Schema Permissions**: Validates all required schema access permissions
|
||||||
|
5. **External Table Readiness**: Checks accessibility of target external tables (ODS.C2D_MPEC_*_ODS) with proper handling of empty states
|
||||||
|
|
||||||
|
### In-Export Validation
|
||||||
|
- **Pre-Export Record Count**: Source and target table counts before export begins
|
||||||
|
- **Live Progress Monitoring**: Real-time feedback during export operations
|
||||||
|
- **Post-Export Verification**: Immediate source vs target COUNT(*) comparison table
|
||||||
|
- **Error Handling**: Comprehensive error capture with detailed diagnostic information
|
||||||
|
|
||||||
|
### Post-Export Validation
|
||||||
|
- **Record Count Verification**: Detailed source vs target COUNT(*) comparison for all exported tables
|
||||||
|
- **File Registration Validation**: Confirms all exported files are properly registered in A_SOURCE_FILE_RECEIVED
|
||||||
|
- **Data Integrity Analysis**: Validates data structure and completeness using external table access
|
||||||
|
- **Delta Query Readiness**: Confirms external tables ready for operational delta queries
|
||||||
|
mrds_data_dev/ODS/C2D/C2D_MPEC_CONTENT/*.csv
|
||||||
|
mrds_data_dev/ODS/C2D/C2D_MPEC_CONTENT_CRITERION/*.csv
|
||||||
|
```
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
### Prerequisites
|
||||||
|
**IMPORTANT**: External tables must already exist on the database (created via FILE_MANAGER procedures)
|
||||||
|
|
||||||
|
Required external tables in ODS schema:
|
||||||
|
- `ODS.C2D_MPEC_ADMIN_ODS`
|
||||||
|
- `ODS.C2D_MPEC_CONTENT_ODS`
|
||||||
|
- `ODS.C2D_MPEC_CONTENT_CRITERION_ODS`
|
||||||
|
|
||||||
|
If external tables don't exist, use `FILE_MANAGER.CREATE_EXTERNAL_TABLE` or `ODS.FILE_MANAGER_ODS.CREATE_EXTERNAL_TABLE` procedures to create them.
|
||||||
|
|
||||||
|
### Installation Command
|
||||||
|
```powershell
|
||||||
|
# Run as ADMIN user
|
||||||
|
cd c:\_git\MARS\wkcopy02\MARS_Packages\REL02_POST\MARS-956-NEW
|
||||||
|
sql "ADMIN/Cloudpass#34@ggmichalski_high" "@install_mars956.sql"
|
||||||
|
|
||||||
|
# Log file created: log/INSTALL_MARS_956_<PDB>_<timestamp>.log
|
||||||
|
```
|
||||||
|
|
||||||
|
### Alternative: Individual Scripts
|
||||||
|
```powershell
|
||||||
|
# Execute individual scripts for step-by-step validation
|
||||||
|
sql "ADMIN/Cloudpass#34@ggmichalski_high" "@00_MARS_956_pre_check_prerequisites.sql"
|
||||||
|
sql "ADMIN/Cloudpass#34@ggmichalski_high" "@01_MARS_956_export_c2d_mpec_data.sql"
|
||||||
|
sql "ADMIN/Cloudpass#34@ggmichalski_high" "@02_MARS_956_verify_exports.sql"
|
||||||
|
sql "ADMIN/Cloudpass#34@ggmichalski_high" "@03_MARS_956_verify_data_integrity.sql"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Expected Results
|
||||||
|
|
||||||
|
### File Registration
|
||||||
|
- **9 CSV files** registered in A_SOURCE_FILE_RECEIVED
|
||||||
|
- **File naming pattern**: {ETL_KEY}_1_{TIMESTAMP}Z.csv
|
||||||
|
- **Processing status**: INGESTED
|
||||||
|
- **Total size**: ~0.33 KB
|
||||||
|
|
||||||
|
### Export Distribution
|
||||||
|
- **MPEC_ADMIN**: 3 files (ETL keys 2001-2005, 3 distinct keys)
|
||||||
|
- **MPEC_CONTENT**: 3 files (ETL keys 2006-2008, 3 distinct keys)
|
||||||
|
- **MPEC_CONTENT_CRITERION**: 3 files (ETL keys 2009-2010, 3 distinct keys)
|
||||||
|
|
||||||
|
### Duration
|
||||||
|
- **Expected**: 2-5 minutes (small datasets)
|
||||||
|
- **Actual**: ~16 seconds (based on testing)
|
||||||
|
|
||||||
|
## Verification
|
||||||
|
|
||||||
|
### Manual Verification
|
||||||
|
```sql
|
||||||
|
-- Check export results
|
||||||
|
SELECT COUNT(*) AS TOTAL_FILES FROM CT_MRDS.A_SOURCE_FILE_RECEIVED
|
||||||
|
WHERE RECEPTION_DATE >= SYSDATE - 1/24 AND SOURCE_FILE_NAME LIKE '200%';
|
||||||
|
|
||||||
|
-- Check process logs
|
||||||
|
SELECT PROCESS_NAME, LOG_LEVEL, LOG_MESSAGE FROM CT_MRDS.A_PROCESS_LOG
|
||||||
|
WHERE PROCESS_NAME = 'MARS-956' ORDER BY LOG_TIMESTAMP DESC;
|
||||||
|
```
|
||||||
|
|
||||||
|
### Cloud Bucket Verification
|
||||||
|
```sql
|
||||||
|
-- List exported files in OCI bucket
|
||||||
|
SELECT object_name FROM TABLE(MRDS_LOADER.cloud_wrapper.list_objects(
|
||||||
|
credential_name => 'DEF_CRED_ARN',
|
||||||
|
location_uri => 'https://objectstorage.eu-frankfurt-1.oraclecloud.com/n/frtgjxu7zl7c/b/data/'
|
||||||
|
)) WHERE object_name LIKE 'ODS/C2D/C2D_MPEC_%';
|
||||||
|
```
|
||||||
|
|
||||||
|
## Rollback
|
||||||
|
|
||||||
|
### Full Rollback (if needed)
|
||||||
|
```powershell
|
||||||
|
cd c:\_git\MARS\wkcopy02\MARS_Packages\REL02_POST\MARS-956-NEW
|
||||||
|
sql "ADMIN/Cloudpass#34@ggmichalski_high" "@rollback_mars956.sql"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Manual Rollback
|
||||||
|
```sql
|
||||||
|
-- Remove file registrations
|
||||||
|
DELETE FROM CT_MRDS.A_SOURCE_FILE_RECEIVED
|
||||||
|
WHERE SOURCE_FILE_NAME LIKE '200%' AND RECEPTION_DATE >= SYSDATE - 7;
|
||||||
|
|
||||||
|
-- Remove process logs
|
||||||
|
DELETE FROM CT_MRDS.A_PROCESS_LOG
|
||||||
|
WHERE PROCESS_NAME IN ('MARS-956', 'MARS-956-ROLLBACK') AND LOG_TIMESTAMP >= SYSDATE - 7;
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Common Issues
|
||||||
|
|
||||||
|
1. **ORA-17008: Closed connection**
|
||||||
|
- Use MCP SQLcl server instead of traditional SQLcl
|
||||||
|
- Connection: `CT_MRDS@ggmichalski_high`
|
||||||
|
|
||||||
|
2. **No files registered**
|
||||||
|
- Check DATA_EXPORTER package version (requires v2.7.5+)
|
||||||
|
- Verify pRegisterExport=TRUE parameter
|
||||||
|
|
||||||
|
3. **Template table errors**
|
||||||
|
- Ensure CT_ET_TEMPLATES.C2D_MPEC_* tables exist
|
||||||
|
- Check column compatibility with source tables
|
||||||
|
|
||||||
|
4. **ETL key validation errors**
|
||||||
|
- Verify A_ETL_LOAD_SET_FK values exist in CT_ODS.A_LOAD_HISTORY
|
||||||
|
- Check ETL key range: 2001-2010
|
||||||
|
|
||||||
|
### Error Resolution
|
||||||
|
- Check `log/INSTALL_MARS_956_*.log` for detailed error information
|
||||||
|
- Review A_PROCESS_LOG table for runtime errors
|
||||||
|
- Use verification scripts to diagnose specific issues
|
||||||
|
|
||||||
|
### Common Validation Issues
|
||||||
|
|
||||||
|
#### External Table Access Errors
|
||||||
|
**Problem**: "✗ ERROR: Cannot access C2D_MPEC_*_ODS tables"
|
||||||
|
- **Cause**: Missing external table definitions or incorrect bucket paths
|
||||||
|
- **Solution**: Verify external tables exist and point to correct OCI bucket paths
|
||||||
|
- **Check**: `SELECT * FROM ODS.C2D_MPEC_ADMIN_ODS WHERE ROWNUM <= 1;`
|
||||||
|
- **Create**: Use `ODS.FILE_MANAGER_ODS.CREATE_EXTERNAL_TABLE` if tables don't exist
|
||||||
|
|
||||||
|
#### Record Count Mismatches
|
||||||
|
**Problem**: Source vs target COUNT(*) differences in post-export validation
|
||||||
|
- **Cause**: Export failure, external table configuration, or bucket synchronization lag
|
||||||
|
- **Solution**: Wait 30-60 seconds and re-run verification script
|
||||||
|
- **Check**: Run `@03_MARS_956_verify_data_integrity.sql` again
|
||||||
|
|
||||||
|
#### Empty Source Tables
|
||||||
|
**Problem**: "⚠ WARNING: No source data found"
|
||||||
|
- **Cause**: Source tables not populated or incorrect schema permissions
|
||||||
|
- **Solution**: Verify OU_C2D schema contains expected MPEC data
|
||||||
|
- **Check**: `SELECT COUNT(*) FROM OU_C2D.MPEC_ADMIN;` (should return 5)
|
||||||
|
|
||||||
|
#### ETL Key Validation Failures
|
||||||
|
**Problem**: ETL keys outside expected range 2001-2010
|
||||||
|
- **Cause**: Data inconsistency or load history corruption
|
||||||
|
- **Solution**: Review source data quality and CT_ODS.A_LOAD_HISTORY entries
|
||||||
|
- **Check**: Verify ETL key distribution in source tables
|
||||||
|
|
||||||
|
#### External Table Empty State Handling
|
||||||
|
**Problem**: KUP-13023 or ORA-29913 errors during validation
|
||||||
|
- **Expected**: These errors are normal for empty external tables
|
||||||
|
- **Handling**: Pre-checks properly handle empty states as normal condition
|
||||||
|
- **Action**: No action required if source tables contain data
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
### External Tables Setup (If Not Already Created)
|
||||||
|
|
||||||
|
If external tables don't exist, create them using FILE_MANAGER procedures:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- Option 1: Using ODS.FILE_MANAGER_ODS (recommended - AUTHID DEFINER)
|
||||||
|
BEGIN
|
||||||
|
ODS.FILE_MANAGER_ODS.CREATE_EXTERNAL_TABLE(
|
||||||
|
pTableName => 'C2D_MPEC_ADMIN_ODS',
|
||||||
|
pTemplateTableName => 'CT_ET_TEMPLATES.C2D_MPEC_ADMIN',
|
||||||
|
pPrefix => 'ODS/C2D/C2D_MPEC_ADMIN',
|
||||||
|
pBucketUri => CT_MRDS.ENV_MANAGER.gvDataBucketUri
|
||||||
|
);
|
||||||
|
|
||||||
|
ODS.FILE_MANAGER_ODS.CREATE_EXTERNAL_TABLE(
|
||||||
|
pTableName => 'C2D_MPEC_CONTENT_ODS',
|
||||||
|
pTemplateTableName => 'CT_ET_TEMPLATES.C2D_MPEC_CONTENT',
|
||||||
|
pPrefix => 'ODS/C2D/C2D_MPEC_CONTENT',
|
||||||
|
pBucketUri => CT_MRDS.ENV_MANAGER.gvDataBucketUri
|
||||||
|
);
|
||||||
|
|
||||||
|
ODS.FILE_MANAGER_ODS.CREATE_EXTERNAL_TABLE(
|
||||||
|
pTableName => 'C2D_MPEC_CONTENT_CRITERION_ODS',
|
||||||
|
pTemplateTableName => 'CT_ET_TEMPLATES.C2D_MPEC_CONTENT_CRITERION',
|
||||||
|
pPrefix => 'ODS/C2D/C2D_MPEC_CONTENT_CRITERION',
|
||||||
|
pBucketUri => CT_MRDS.ENV_MANAGER.gvDataBucketUri
|
||||||
|
);
|
||||||
|
END;
|
||||||
|
/
|
||||||
|
|
||||||
|
-- Option 2: Using CT_MRDS.FILE_MANAGER (AUTHID CURRENT_USER - requires ODS context)
|
||||||
|
-- Connect as ODS user first
|
||||||
|
-- Then call CT_MRDS.FILE_MANAGER.CREATE_EXTERNAL_TABLE with same parameters
|
||||||
|
```
|
||||||
|
|
||||||
|
### Package Dependencies
|
||||||
|
- **CT_MRDS.DATA_EXPORTER** v2.7.5+ (with pRegisterExport support)
|
||||||
|
- **CT_MRDS.ENV_MANAGER** v3.1.0+
|
||||||
|
- **MRDS_LOADER.cloud_wrapper** (for OCI bucket access)
|
||||||
|
|
||||||
|
### Schema Dependencies
|
||||||
|
- **OU_C2D**: Source data schema
|
||||||
|
- **CT_ET_TEMPLATES**: Template table definitions
|
||||||
|
- **CT_MRDS**: Process logging and configuration
|
||||||
|
- **CT_ODS**: ETL load history validation
|
||||||
|
|
||||||
|
### Infrastructure Dependencies
|
||||||
|
- **OCI Object Storage**: ODS bucket access
|
||||||
|
- **Database credentials**: DEF_CRED_ARN configured
|
||||||
|
- **Network connectivity**: Frankfurt region access
|
||||||
|
|
||||||
|
## Related MARS Issues
|
||||||
|
- **MARS-956**: C2D MPEC Historical Data Export (this package)
|
||||||
|
- **MARS-835**: CSDB Data Export (reference implementation)
|
||||||
|
- **Related**: DATA_EXPORTER package enhancements
|
||||||
|
|
||||||
|
## Support
|
||||||
|
For technical support or issues:
|
||||||
|
1. Check installation log files in `log/` directory
|
||||||
|
2. Review verification script outputs
|
||||||
|
3. Contact Database Team with specific error messages
|
||||||
|
4. Include A_PROCESS_LOG entries for debugging
|
||||||
|
|
||||||
|
---
|
||||||
|
**Package Version**: 1.0.0
|
||||||
|
**Created**: 2026-02-12
|
||||||
|
**Author**: System Generated (based on MARS-835 structure)
|
||||||
|
**Status**: Ready for deployment
|
||||||
@@ -1,128 +1,97 @@
|
|||||||
-- ===================================================================
|
-- ===================================================================
|
||||||
-- MARS-956 MASTER INSTALLATION SCRIPT
|
-- MARS-956 INSTALL SCRIPT: C2D MPEC Data Export to External Tables
|
||||||
-- ===================================================================
|
|
||||||
-- Purpose: Export Historical C2D MPEC data from OU_C2D to DATA bucket
|
|
||||||
-- Author: Grzegorz Michalski
|
|
||||||
-- Date: 2026-02-11
|
|
||||||
--
|
|
||||||
-- Requirements:
|
|
||||||
-- - ADMIN user access for MARS installation
|
|
||||||
-- - OU_C2D schema access for source tables
|
|
||||||
-- - DATA_EXPORTER package v2.7.4+ deployed
|
|
||||||
-- - DEF_CRED_ARN credentials configured
|
|
||||||
-- - DATA bucket accessible
|
|
||||||
-- ===================================================================
|
-- ===================================================================
|
||||||
|
-- Purpose: One-time bulk export of 3 C2D MPEC tables from OU_C2D schema
|
||||||
|
-- to OCI buckets (ODS bucket CSV format)
|
||||||
|
-- Uses DATA_EXPORTER v2.7.5 with pRegisterExport for file registration
|
||||||
|
-- Author: System Generated
|
||||||
|
-- Date: 2026-02-12
|
||||||
|
-- Version: 1.0.0
|
||||||
|
|
||||||
-- Dynamic spool file generation
|
-- Dynamic spool file generation (using SYS_CONTEXT - no DBA privileges required)
|
||||||
|
-- Log files are automatically created in log/ subdirectory
|
||||||
|
-- IMPORTANT: Ensure log/ directory exists before SPOOL (use host mkdir)
|
||||||
host mkdir log 2>nul
|
host mkdir log 2>nul
|
||||||
define spoolfile = 'log\install_mars956_'
|
|
||||||
define timestamp = ''
|
|
||||||
|
|
||||||
-- Get current timestamp for unique log filename
|
var filename VARCHAR2(100)
|
||||||
column current_time new_value timestamp
|
BEGIN
|
||||||
SELECT TO_CHAR(SYSDATE, 'YYYYMMDD_HH24MISS') AS current_time FROM dual;
|
:filename := 'log/INSTALL_MARS_956_' || SYS_CONTEXT('USERENV', 'CON_NAME') || '_' || TO_CHAR(SYSDATE,'YYYYMMDD_HH24MISS') || '.log';
|
||||||
|
END;
|
||||||
|
/
|
||||||
|
column filename new_value _filename
|
||||||
|
select :filename filename from dual;
|
||||||
|
spool &_filename
|
||||||
|
|
||||||
-- Start logging
|
SET ECHO OFF
|
||||||
spool &spoolfile.×tamp..log
|
SET TIMING ON
|
||||||
|
SET SERVEROUTPUT ON SIZE UNLIMITED
|
||||||
|
SET PAUSE OFF
|
||||||
|
|
||||||
-- Display environment information
|
-- Set current schema context (optional - use when modifying packages in specific schema)
|
||||||
PROMPT =========================================================================
|
-- ALTER SESSION SET CURRENT_SCHEMA = CT_MRDS;
|
||||||
PROMPT MARS-956 INSTALLATION - Export Historical C2D MPEC Data
|
|
||||||
PROMPT =========================================================================
|
|
||||||
PROMPT Installation Start:
|
|
||||||
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS INSTALL_START FROM DUAL;
|
|
||||||
|
|
||||||
PROMPT Current User:
|
|
||||||
SELECT USER AS CURRENT_USER FROM DUAL;
|
|
||||||
|
|
||||||
PROMPT Database Info:
|
|
||||||
SELECT INSTANCE_NAME, VERSION, STATUS FROM V$INSTANCE;
|
|
||||||
|
|
||||||
PROMPT =========================================================================
|
PROMPT =========================================================================
|
||||||
PROMPT Installation Details:
|
PROMPT MARS-956: C2D MPEC Data Export to External Tables (One-Time Migration)
|
||||||
PROMPT - Purpose: One-time export of historical C2D MPEC delta data
|
PROMPT =========================================================================
|
||||||
PROMPT - Source: OU_C2D schema tables (operational database)
|
PROMPT
|
||||||
PROMPT - Target: DATA bucket as CSV files
|
PROMPT This script will export 3 C2D MPEC tables to OCI buckets:
|
||||||
PROMPT - Tables: MPEC_ADMIN, MPEC_CONTENT, MPEC_CONTENT_CRITERION
|
PROMPT
|
||||||
PROMPT - Method: DATA_EXPORTER.EXPORT_TABLE_DATA_BY_DATE
|
PROMPT TARGET: ODS Bucket (CSV format):
|
||||||
|
PROMPT - MPEC_ADMIN: 5 records with ETL keys 2001-2005
|
||||||
|
PROMPT - MPEC_CONTENT: 5 records with ETL keys 2006-2008
|
||||||
|
PROMPT - MPEC_CONTENT_CRITERION: 9 records with ETL keys 2009-2010
|
||||||
|
PROMPT
|
||||||
|
PROMPT Key Features:
|
||||||
|
PROMPT - Files registered in A_SOURCE_FILE_RECEIVED for tracking
|
||||||
|
PROMPT - Template table column order matching (CT_ET_TEMPLATES.C2D_MPEC_*)
|
||||||
|
PROMPT - ODS/C2D bucket path structure
|
||||||
|
PROMPT
|
||||||
|
PROMPT Expected Duration: 2-5 minutes (small datasets)
|
||||||
PROMPT =========================================================================
|
PROMPT =========================================================================
|
||||||
|
|
||||||
SET SERVEROUTPUT ON SIZE 1000000
|
-- Confirm installation with user
|
||||||
SET LINESIZE 200
|
ACCEPT continue CHAR PROMPT 'Type YES to continue with installation, or Ctrl+C to abort: '
|
||||||
SET PAGESIZE 1000
|
WHENEVER SQLERROR EXIT SQL.SQLCODE
|
||||||
|
BEGIN
|
||||||
|
IF '&continue' IS NULL OR TRIM('&continue') IS NULL OR UPPER(TRIM('&continue')) != 'YES' THEN
|
||||||
|
RAISE_APPLICATION_ERROR(-20001, 'Installation aborted by user');
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
/
|
||||||
|
WHENEVER SQLERROR CONTINUE
|
||||||
|
|
||||||
PROMPT
|
PROMPT
|
||||||
PROMPT Step 1: Verify Prerequisites
|
|
||||||
PROMPT =========================================================================
|
PROMPT =========================================================================
|
||||||
|
PROMPT Pre-Check: Verify prerequisites and table readiness
|
||||||
|
PROMPT =========================================================================
|
||||||
|
@@00_MARS_956_pre_check_prerequisites.sql
|
||||||
|
|
||||||
-- Verify DATA_EXPORTER package is available
|
PROMPT
|
||||||
PROMPT Checking DATA_EXPORTER package availability...
|
PROMPT =========================================================================
|
||||||
SELECT 'DATA_EXPORTER v' || CT_MRDS.DATA_EXPORTER.PACKAGE_VERSION ||
|
PROMPT Step 1: Export C2D MPEC Data to ODS Bucket
|
||||||
' (Build: ' || CT_MRDS.DATA_EXPORTER.PACKAGE_BUILD_DATE || ')' AS PACKAGE_INFO
|
|
||||||
FROM DUAL;
|
|
||||||
|
|
||||||
-- Verify source tables exist in OU_C2D
|
|
||||||
PROMPT Checking source tables in OU_C2D schema...
|
|
||||||
SELECT table_name, num_rows
|
|
||||||
FROM all_tables
|
|
||||||
WHERE owner = 'OU_C2D'
|
|
||||||
AND table_name IN ('MPEC_ADMIN', 'MPEC_CONTENT', 'MPEC_CONTENT_CRITERION')
|
|
||||||
ORDER BY table_name;
|
|
||||||
|
|
||||||
-- Verify template tables exist in CT_ET_TEMPLATES
|
|
||||||
PROMPT Checking template tables in CT_ET_TEMPLATES schema...
|
|
||||||
SELECT table_name
|
|
||||||
FROM all_tables
|
|
||||||
WHERE owner = 'CT_ET_TEMPLATES'
|
|
||||||
AND table_name IN ('C2D_MPEC_ADMIN', 'C2D_MPEC_CONTENT', 'C2D_MPEC_CONTENT_CRITERION')
|
|
||||||
ORDER BY table_name;
|
|
||||||
|
|
||||||
PROMPT
|
|
||||||
PROMPT Step 2: Execute Historical Data Export
|
|
||||||
PROMPT =========================================================================
|
PROMPT =========================================================================
|
||||||
@@01_MARS_956_export_c2d_mpec_data.sql
|
@@01_MARS_956_export_c2d_mpec_data.sql
|
||||||
|
|
||||||
PROMPT
|
PROMPT
|
||||||
PROMPT Step 3: Track Package Versions
|
|
||||||
PROMPT =========================================================================
|
PROMPT =========================================================================
|
||||||
@@track_package_versions.sql
|
PROMPT Step 2: Verify Exports (File Registration Check)
|
||||||
|
PROMPT =========================================================================
|
||||||
|
@@02_MARS_956_verify_exports.sql
|
||||||
|
|
||||||
PROMPT
|
PROMPT
|
||||||
PROMPT Step 4: Verify Package Versions
|
|
||||||
PROMPT =========================================================================
|
PROMPT =========================================================================
|
||||||
@@verify_packages_version.sql
|
PROMPT Step 3: Verify Data Integrity (Source vs Exported)
|
||||||
|
PROMPT =========================================================================
|
||||||
|
@@03_MARS_956_verify_data_integrity.sql
|
||||||
|
|
||||||
PROMPT
|
PROMPT
|
||||||
PROMPT =========================================================================
|
PROMPT =========================================================================
|
||||||
PROMPT MARS-956 INSTALLATION SUMMARY
|
PROMPT MARS-956 Installation - COMPLETED
|
||||||
PROMPT =========================================================================
|
PROMPT =========================================================================
|
||||||
|
PROMPT Check the log file for complete installation details.
|
||||||
-- Display final summary
|
PROMPT For rollback, use: rollback_mars956.sql
|
||||||
PROMPT Installation Completed:
|
|
||||||
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS INSTALL_END FROM DUAL;
|
|
||||||
|
|
||||||
PROMPT Export Results Summary:
|
|
||||||
SELECT COUNT(*) AS EXPORT_LOG_ENTRIES,
|
|
||||||
MIN(EVENT_TIMESTAMP) AS FIRST_EXPORT,
|
|
||||||
MAX(EVENT_TIMESTAMP) AS LAST_EXPORT
|
|
||||||
FROM CT_MRDS.A_PROCESS_LOG
|
|
||||||
WHERE PACKAGE_NAME = 'MARS-956'
|
|
||||||
AND EVENT_TIMESTAMP >= SYSDATE - 1; -- Last 24 hours
|
|
||||||
|
|
||||||
PROMPT
|
|
||||||
PROMPT =========================================================================
|
|
||||||
PROMPT POST-INSTALLATION TASKS
|
|
||||||
PROMPT =========================================================================
|
|
||||||
PROMPT 1. Verify CSV files created in DATA bucket:
|
|
||||||
PROMPT - mrds_data_dev/ODS/C2D/C2D_MPEC_ADMIN/*.csv
|
|
||||||
PROMPT - mrds_data_dev/ODS/C2D/C2D_MPEC_CONTENT/*.csv
|
|
||||||
PROMPT - mrds_data_dev/ODS/C2D/C2D_MPEC_CONTENT_CRITERION/*.csv
|
|
||||||
PROMPT
|
|
||||||
PROMPT 2. Check file structure matches template tables
|
|
||||||
PROMPT 3. Validate row counts match source tables
|
|
||||||
PROMPT 4. Confirm data available for delta queries
|
|
||||||
PROMPT 5. Sync deployment timing with REL_02 deployment
|
|
||||||
PROMPT =========================================================================
|
PROMPT =========================================================================
|
||||||
|
|
||||||
spool off
|
spool off
|
||||||
|
|
||||||
quit;
|
quit;
|
||||||
@@ -1,85 +1,75 @@
|
|||||||
-- ===================================================================
|
-- ===================================================================
|
||||||
-- MARS-956 ROLLBACK SCRIPT
|
-- MARS-956 ROLLBACK SCRIPT: C2D MPEC Data Export Rollback
|
||||||
-- ===================================================================
|
|
||||||
-- Purpose: Rollback/cleanup for MARS-956 C2D MPEC historical data export
|
|
||||||
-- Author: Grzegorz Michalski
|
|
||||||
-- Date: 2026-02-11
|
|
||||||
--
|
|
||||||
-- NOTE: This is primarily for cleanup of log entries and tracking data.
|
|
||||||
-- The exported CSV files would need to be manually removed from
|
|
||||||
-- the DATA bucket if rollback is required.
|
|
||||||
-- ===================================================================
|
-- ===================================================================
|
||||||
|
-- Purpose: Rollback MARS-956 - Delete exported CSV files and file registrations
|
||||||
|
-- WARNING: This will DELETE all exported data files and registrations!
|
||||||
|
-- Author: System Generated
|
||||||
|
-- Date: 2026-02-12
|
||||||
|
|
||||||
-- Start logging
|
-- Dynamic spool file generation (using SYS_CONTEXT - no DBA privileges required)
|
||||||
spool rollback_mars956.log
|
-- IMPORTANT: Ensure log/ directory exists before SPOOL (use host mkdir)
|
||||||
|
host mkdir log 2>nul
|
||||||
|
|
||||||
|
var filename VARCHAR2(100)
|
||||||
|
BEGIN
|
||||||
|
:filename := 'log/ROLLBACK_MARS_956_' || SYS_CONTEXT('USERENV', 'CON_NAME') || '_' || TO_CHAR(SYSDATE,'YYYYMMDD_HH24MISS') || '.log';
|
||||||
|
END;
|
||||||
|
/
|
||||||
|
column filename new_value _filename
|
||||||
|
select :filename filename from dual;
|
||||||
|
spool &_filename
|
||||||
|
|
||||||
|
SET ECHO OFF
|
||||||
|
SET TIMING ON
|
||||||
|
SET SERVEROUTPUT ON SIZE UNLIMITED
|
||||||
|
SET PAUSE OFF
|
||||||
|
|
||||||
PROMPT =========================================================================
|
PROMPT =========================================================================
|
||||||
PROMPT MARS-956 ROLLBACK - Cleanup Historical C2D MPEC Export
|
PROMPT MARS-956: Rollback C2D MPEC Data Export
|
||||||
PROMPT =========================================================================
|
PROMPT =========================================================================
|
||||||
PROMPT Rollback Start:
|
PROMPT WARNING: This will DELETE exported CSV files and file registrations!
|
||||||
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS ROLLBACK_START FROM DUAL;
|
PROMPT - ODS bucket: mrds_data_dev/ODS/C2D/
|
||||||
|
PROMPT - File registrations: A_SOURCE_FILE_RECEIVED entries
|
||||||
SET SERVEROUTPUT ON SIZE 1000000
|
|
||||||
|
|
||||||
PROMPT
|
|
||||||
PROMPT Step 1: Review Export Activity
|
|
||||||
PROMPT =========================================================================
|
|
||||||
|
|
||||||
-- Show what was exported
|
|
||||||
PROMPT Recent MARS-956 export activity:
|
|
||||||
SELECT TO_CHAR(EVENT_TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS') AS EXPORT_TIME,
|
|
||||||
PROCEDURE_NAME,
|
|
||||||
EVENT_TYPE,
|
|
||||||
EVENT_MESSAGE
|
|
||||||
FROM CT_MRDS.A_PROCESS_LOG
|
|
||||||
WHERE PACKAGE_NAME = 'MARS-956'
|
|
||||||
OR PROCEDURE_NAME LIKE '%MARS_956%'
|
|
||||||
ORDER BY EVENT_TIMESTAMP DESC;
|
|
||||||
|
|
||||||
PROMPT
|
|
||||||
PROMPT Step 2: Cleanup Log Entries (Optional)
|
|
||||||
PROMPT =========================================================================
|
|
||||||
|
|
||||||
-- Optionally remove MARS-956 log entries (uncomment if needed)
|
|
||||||
/*
|
|
||||||
DELETE FROM CT_MRDS.A_PROCESS_LOG
|
|
||||||
WHERE PACKAGE_NAME = 'MARS-956'
|
|
||||||
OR PROCEDURE_NAME LIKE '%MARS_956%';
|
|
||||||
|
|
||||||
PROMPT Deleted log entries:
|
|
||||||
SELECT SQL%ROWCOUNT AS DELETED_ROWS FROM DUAL;
|
|
||||||
|
|
||||||
COMMIT;
|
|
||||||
*/
|
|
||||||
|
|
||||||
PROMPT Log cleanup skipped (uncomment DELETE statement if cleanup needed)
|
|
||||||
|
|
||||||
PROMPT
|
|
||||||
PROMPT Step 3: Manual Steps Required
|
|
||||||
PROMPT =========================================================================
|
|
||||||
|
|
||||||
PROMPT ⚠️ MANUAL CLEANUP REQUIRED:
|
|
||||||
PROMPT
|
PROMPT
|
||||||
PROMPT If complete rollback is needed, manually remove CSV files from DATA bucket:
|
PROMPT Only proceed if export failed and needs to be restarted!
|
||||||
PROMPT - mrds_data_dev/ODS/C2D/C2D_MPEC_ADMIN/*.csv
|
|
||||||
PROMPT - mrds_data_dev/ODS/C2D/C2D_MPEC_CONTENT/*.csv
|
|
||||||
PROMPT - mrds_data_dev/ODS/C2D/C2D_MPEC_CONTENT_CRITERION/*.csv
|
|
||||||
PROMPT
|
|
||||||
PROMPT Use OCI CLI or console to remove files:
|
|
||||||
PROMPT oci os object list --bucket-name mrds_data_dev --prefix "ODS/C2D/C2D_MPEC"
|
|
||||||
PROMPT oci os object delete --bucket-name mrds_data_dev --name "path/to/file.csv"
|
|
||||||
|
|
||||||
PROMPT
|
|
||||||
PROMPT =========================================================================
|
|
||||||
PROMPT MARS-956 ROLLBACK SUMMARY
|
|
||||||
PROMPT =========================================================================
|
PROMPT =========================================================================
|
||||||
|
|
||||||
PROMPT Rollback Completed:
|
-- Confirm rollback with user
|
||||||
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS ROLLBACK_END FROM DUAL;
|
ACCEPT continue CHAR PROMPT 'Type YES to continue with rollback, or Ctrl+C to abort: '
|
||||||
|
WHENEVER SQLERROR EXIT SQL.SQLCODE
|
||||||
|
BEGIN
|
||||||
|
IF '&continue' IS NULL OR TRIM('&continue') IS NULL OR UPPER(TRIM('&continue')) != 'YES' THEN
|
||||||
|
RAISE_APPLICATION_ERROR(-20001, 'Rollback aborted by user');
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
/
|
||||||
|
WHENEVER SQLERROR CONTINUE
|
||||||
|
|
||||||
PROMPT
|
PROMPT
|
||||||
PROMPT Note: This rollback script primarily cleans up log entries.
|
PROMPT =========================================================================
|
||||||
PROMPT Exported CSV files require manual removal from DATA bucket.
|
PROMPT Step 1: Delete File Registrations
|
||||||
|
PROMPT =========================================================================
|
||||||
|
@@91_MARS_956_rollback_file_registrations.sql
|
||||||
|
|
||||||
|
PROMPT
|
||||||
|
PROMPT =========================================================================
|
||||||
|
PROMPT Step 2: Clean Process Logs
|
||||||
|
PROMPT =========================================================================
|
||||||
|
@@92_MARS_956_rollback_process_logs.sql
|
||||||
|
|
||||||
|
PROMPT
|
||||||
|
PROMPT =========================================================================
|
||||||
|
PROMPT Step 3: Verify Rollback Completion
|
||||||
|
PROMPT =========================================================================
|
||||||
|
@@99_MARS_956_verify_rollback.sql
|
||||||
|
|
||||||
|
PROMPT
|
||||||
|
PROMPT =========================================================================
|
||||||
|
PROMPT MARS-956 Rollback - COMPLETED
|
||||||
|
PROMPT =========================================================================
|
||||||
|
PROMPT Check the log file for complete rollback details.
|
||||||
|
PROMPT =========================================================================
|
||||||
|
|
||||||
spool off
|
spool off
|
||||||
|
|
||||||
quit;
|
quit;
|
||||||
@@ -1,96 +0,0 @@
|
|||||||
-- ===================================================================
|
|
||||||
-- Simple Package Version Tracking Script
|
|
||||||
-- ===================================================================
|
|
||||||
-- Purpose: Track specified Oracle package versions for MARS-956
|
|
||||||
-- Author: Grzegorz Michalski
|
|
||||||
-- Date: 2026-02-11
|
|
||||||
-- Version: 3.1.0 - List-Based Edition
|
|
||||||
--
|
|
||||||
-- USAGE:
|
|
||||||
-- 1. Edit package list below (add/remove packages as needed)
|
|
||||||
-- 2. Include in your install/rollback script: @@track_package_versions.sql
|
|
||||||
-- ===================================================================
|
|
||||||
|
|
||||||
SET SERVEROUTPUT ON;
|
|
||||||
|
|
||||||
DECLARE
|
|
||||||
TYPE t_package_rec IS RECORD (
|
|
||||||
owner VARCHAR2(50),
|
|
||||||
package_name VARCHAR2(50),
|
|
||||||
version VARCHAR2(50)
|
|
||||||
);
|
|
||||||
TYPE t_packages IS TABLE OF t_package_rec;
|
|
||||||
TYPE t_string_array IS TABLE OF VARCHAR2(100);
|
|
||||||
|
|
||||||
-- ===================================================================
|
|
||||||
-- PACKAGE LIST - Edit this array to specify packages to track
|
|
||||||
-- ===================================================================
|
|
||||||
-- MARS-956: Historical C2D MPEC data export - using existing packages
|
|
||||||
-- No new packages created, tracking existing DATA_EXPORTER usage
|
|
||||||
-- ===================================================================
|
|
||||||
vPackageList t_string_array := t_string_array(
|
|
||||||
'CT_MRDS.DATA_EXPORTER'
|
|
||||||
);
|
|
||||||
-- ===================================================================
|
|
||||||
|
|
||||||
vPackages t_packages := t_packages();
|
|
||||||
vVersion VARCHAR2(50);
|
|
||||||
vCount NUMBER := 0;
|
|
||||||
vOwner VARCHAR2(50);
|
|
||||||
vPackageName VARCHAR2(50);
|
|
||||||
vDotPos NUMBER;
|
|
||||||
BEGIN
|
|
||||||
DBMS_OUTPUT.PUT_LINE('========================================');
|
|
||||||
DBMS_OUTPUT.PUT_LINE('MARS-956: Package Version Tracking');
|
|
||||||
DBMS_OUTPUT.PUT_LINE('========================================');
|
|
||||||
|
|
||||||
-- Process each package in the list
|
|
||||||
FOR i IN 1..vPackageList.COUNT LOOP
|
|
||||||
vDotPos := INSTR(vPackageList(i), '.');
|
|
||||||
IF vDotPos > 0 THEN
|
|
||||||
vOwner := SUBSTR(vPackageList(i), 1, vDotPos - 1);
|
|
||||||
vPackageName := SUBSTR(vPackageList(i), vDotPos + 1);
|
|
||||||
|
|
||||||
-- Get package version
|
|
||||||
BEGIN
|
|
||||||
EXECUTE IMMEDIATE 'SELECT ' || vOwner || '.' || vPackageName || '.GET_VERSION() FROM DUAL' INTO vVersion;
|
|
||||||
vPackages.EXTEND;
|
|
||||||
vPackages(vPackages.COUNT).owner := vOwner;
|
|
||||||
vPackages(vPackages.COUNT).package_name := vPackageName;
|
|
||||||
vPackages(vPackages.COUNT).version := vVersion;
|
|
||||||
|
|
||||||
-- Track in ENV_MANAGER
|
|
||||||
BEGIN
|
|
||||||
CT_MRDS.ENV_MANAGER.TRACK_PACKAGE_VERSION(
|
|
||||||
pPackageOwner => vOwner,
|
|
||||||
pPackageName => vPackageName,
|
|
||||||
pPackageVersion => vVersion,
|
|
||||||
pPackageBuildDate => TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'),
|
|
||||||
pPackageAuthor => 'Grzegorz Michalski'
|
|
||||||
);
|
|
||||||
vCount := vCount + 1;
|
|
||||||
EXCEPTION
|
|
||||||
WHEN OTHERS THEN NULL; -- Continue even if tracking fails
|
|
||||||
END;
|
|
||||||
EXCEPTION
|
|
||||||
WHEN OTHERS THEN NULL; -- Skip packages that fail
|
|
||||||
END;
|
|
||||||
END IF;
|
|
||||||
END LOOP;
|
|
||||||
|
|
||||||
DBMS_OUTPUT.PUT_LINE('');
|
|
||||||
DBMS_OUTPUT.PUT_LINE('Summary:');
|
|
||||||
DBMS_OUTPUT.PUT_LINE('--------');
|
|
||||||
DBMS_OUTPUT.PUT_LINE('Packages tracked: ' || vCount || '/' || vPackageList.COUNT);
|
|
||||||
|
|
||||||
IF vPackages.COUNT > 0 THEN
|
|
||||||
DBMS_OUTPUT.PUT_LINE('');
|
|
||||||
DBMS_OUTPUT.PUT_LINE('Tracked Packages:');
|
|
||||||
FOR i IN 1..vPackages.COUNT LOOP
|
|
||||||
DBMS_OUTPUT.PUT_LINE(' ' || vPackages(i).owner || '.' || vPackages(i).package_name || ' v' || vPackages(i).version);
|
|
||||||
END LOOP;
|
|
||||||
END IF;
|
|
||||||
|
|
||||||
DBMS_OUTPUT.PUT_LINE('========================================');
|
|
||||||
END;
|
|
||||||
/
|
|
||||||
@@ -1,182 +0,0 @@
|
|||||||
-- ===================================================================
|
|
||||||
-- MARS-956 POST-EXPORT VALIDATION SCRIPT
|
|
||||||
-- ===================================================================
|
|
||||||
-- Purpose: Validate C2D MPEC historical data export results
|
|
||||||
-- Author: Grzegorz Michalski
|
|
||||||
-- Date: 2026-02-11
|
|
||||||
--
|
|
||||||
-- Run after MARS-956 installation to verify export success
|
|
||||||
-- ===================================================================
|
|
||||||
|
|
||||||
SET LINESIZE 200
|
|
||||||
SET PAGESIZE 1000
|
|
||||||
SET SERVEROUTPUT ON SIZE 1000000
|
|
||||||
|
|
||||||
PROMPT =========================================================================
|
|
||||||
PROMPT MARS-956 POST-EXPORT VALIDATION
|
|
||||||
PROMPT =========================================================================
|
|
||||||
PROMPT Validation Start:
|
|
||||||
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS VALIDATION_START FROM DUAL;
|
|
||||||
|
|
||||||
PROMPT
|
|
||||||
PROMPT 1. Export Process Log Review
|
|
||||||
PROMPT =========================================================================
|
|
||||||
|
|
||||||
-- Check export completion status
|
|
||||||
PROMPT Recent MARS-956 export activity:
|
|
||||||
SELECT TO_CHAR(EVENT_TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS') AS EVENT_TIME,
|
|
||||||
PROCEDURE_NAME,
|
|
||||||
EVENT_TYPE,
|
|
||||||
SUBSTR(EVENT_MESSAGE, 1, 80) AS MESSAGE_PREVIEW
|
|
||||||
FROM CT_MRDS.A_PROCESS_LOG
|
|
||||||
WHERE PACKAGE_NAME = 'MARS-956'
|
|
||||||
OR PROCEDURE_NAME LIKE '%MARS_956%'
|
|
||||||
OR PROCEDURE_NAME LIKE '%DATA_EXPORTER%'
|
|
||||||
ORDER BY EVENT_TIMESTAMP DESC
|
|
||||||
FETCH FIRST 20 ROWS ONLY;
|
|
||||||
|
|
||||||
-- Check for any errors
|
|
||||||
PROMPT Export errors (if any):
|
|
||||||
SELECT TO_CHAR(EVENT_TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS') AS ERROR_TIME,
|
|
||||||
PROCEDURE_NAME,
|
|
||||||
EVENT_MESSAGE
|
|
||||||
FROM CT_MRDS.A_PROCESS_LOG
|
|
||||||
WHERE (PACKAGE_NAME = 'MARS-956' OR PROCEDURE_NAME LIKE '%MARS_956%')
|
|
||||||
AND EVENT_TYPE = 'ERROR'
|
|
||||||
AND EVENT_TIMESTAMP >= SYSDATE - 1; -- Last 24 hours
|
|
||||||
|
|
||||||
PROMPT
|
|
||||||
PROMPT 2. Source Table Row Counts
|
|
||||||
PROMPT =========================================================================
|
|
||||||
|
|
||||||
-- Get source table counts for comparison
|
|
||||||
PROMPT Source table row counts (OU_C2D):
|
|
||||||
SELECT 'OU_C2D' AS SCHEMA_NAME,
|
|
||||||
table_name,
|
|
||||||
num_rows,
|
|
||||||
TO_CHAR(last_analyzed, 'YYYY-MM-DD HH24:MI:SS') AS STATS_DATE
|
|
||||||
FROM all_tables
|
|
||||||
WHERE owner = 'OU_C2D'
|
|
||||||
AND table_name IN ('MPEC_ADMIN', 'MPEC_CONTENT', 'MPEC_CONTENT_CRITERION')
|
|
||||||
ORDER BY table_name;
|
|
||||||
|
|
||||||
PROMPT
|
|
||||||
PROMPT 3. Template Table Structure Verification
|
|
||||||
PROMPT =========================================================================
|
|
||||||
|
|
||||||
-- Verify template tables exist and have proper structure
|
|
||||||
PROMPT Template tables in CT_ET_TEMPLATES:
|
|
||||||
SELECT table_name,
|
|
||||||
num_rows,
|
|
||||||
TO_CHAR(last_analyzed, 'YYYY-MM-DD HH24:MI:SS') AS STATS_DATE
|
|
||||||
FROM all_tables
|
|
||||||
WHERE owner = 'CT_ET_TEMPLATES'
|
|
||||||
AND table_name IN ('C2D_MPEC_ADMIN', 'C2D_MPEC_CONTENT', 'C2D_MPEC_CONTENT_CRITERION')
|
|
||||||
ORDER BY table_name;
|
|
||||||
|
|
||||||
PROMPT
|
|
||||||
PROMPT Template table column counts:
|
|
||||||
SELECT owner, table_name, COUNT(*) AS COLUMN_COUNT
|
|
||||||
FROM all_tab_columns
|
|
||||||
WHERE owner IN ('OU_C2D', 'CT_ET_TEMPLATES')
|
|
||||||
AND ((owner = 'OU_C2D' AND table_name IN ('MPEC_ADMIN', 'MPEC_CONTENT', 'MPEC_CONTENT_CRITERION'))
|
|
||||||
OR (owner = 'CT_ET_TEMPLATES' AND table_name IN ('C2D_MPEC_ADMIN', 'C2D_MPEC_CONTENT', 'C2D_MPEC_CONTENT_CRITERION')))
|
|
||||||
GROUP BY owner, table_name
|
|
||||||
ORDER BY table_name, owner;
|
|
||||||
|
|
||||||
PROMPT
|
|
||||||
PROMPT 4. File Registration Validation
|
|
||||||
PROMPT =========================================================================
|
|
||||||
|
|
||||||
-- Check if exported files were registered in A_SOURCE_FILE_RECEIVED
|
|
||||||
PROMPT Registered export files (last 24 hours):
|
|
||||||
SELECT A_SOURCE_FILE_RECEIVED_KEY,
|
|
||||||
A_SOURCE_FILE_CONFIG_KEY,
|
|
||||||
SOURCE_FILE_NAME,
|
|
||||||
ROUND(BYTES/1024, 2) AS SIZE_KB,
|
|
||||||
PROCESSING_STATUS,
|
|
||||||
TO_CHAR(RECEPTION_DATE, 'YYYY-MM-DD HH24:MI:SS') AS REGISTERED_TIME
|
|
||||||
FROM CT_MRDS.A_SOURCE_FILE_RECEIVED
|
|
||||||
WHERE RECEPTION_DATE >= SYSDATE - 1 -- Last 24 hours
|
|
||||||
AND (SOURCE_FILE_NAME LIKE '%MPEC_%' OR A_SOURCE_FILE_CONFIG_KEY IN (
|
|
||||||
SELECT A_SOURCE_FILE_CONFIG_KEY
|
|
||||||
FROM CT_MRDS.A_SOURCE_FILE_CONFIG
|
|
||||||
WHERE A_SOURCE_KEY = 'C2D' AND TABLE_ID LIKE '%MPEC%'
|
|
||||||
))
|
|
||||||
ORDER BY RECEPTION_DATE DESC;
|
|
||||||
|
|
||||||
-- Count registered files per config key
|
|
||||||
PROMPT File registration summary:
|
|
||||||
SELECT
|
|
||||||
CASE WHEN A_SOURCE_FILE_CONFIG_KEY = -1 THEN 'Default (no config)'
|
|
||||||
ELSE 'Config Key: ' || A_SOURCE_FILE_CONFIG_KEY
|
|
||||||
END AS CONFIG_INFO,
|
|
||||||
COUNT(*) AS REGISTERED_FILES
|
|
||||||
FROM CT_MRDS.A_SOURCE_FILE_RECEIVED
|
|
||||||
WHERE RECEPTION_DATE >= SYSDATE - 1 -- Last 24 hours
|
|
||||||
AND (SOURCE_FILE_NAME LIKE '%MPEC_%' OR A_SOURCE_FILE_CONFIG_KEY IN (
|
|
||||||
SELECT A_SOURCE_FILE_CONFIG_KEY
|
|
||||||
FROM CT_MRDS.A_SOURCE_FILE_CONFIG
|
|
||||||
WHERE A_SOURCE_KEY = 'C2D' AND TABLE_ID LIKE '%MPEC%'
|
|
||||||
))
|
|
||||||
GROUP BY A_SOURCE_FILE_CONFIG_KEY
|
|
||||||
ORDER BY A_SOURCE_FILE_CONFIG_KEY;
|
|
||||||
|
|
||||||
PROMPT
|
|
||||||
PROMPT 5. Export File Validation Commands
|
|
||||||
PROMPT =========================================================================
|
|
||||||
|
|
||||||
PROMPT To validate exported CSV files, use these OCI CLI commands:
|
|
||||||
PROMPT
|
|
||||||
PROMPT # List exported files
|
|
||||||
PROMPT oci os object list --bucket-name mrds_data_dev --prefix "DATA/C2D/C2D_MPEC"
|
|
||||||
PROMPT
|
|
||||||
PROMPT # Check file sizes
|
|
||||||
PROMPT oci os object list --bucket-name mrds_data_dev --prefix "DATA/C2D/C2D_MPEC_ADMIN"
|
|
||||||
PROMPT oci os object list --bucket-name mrds_data_dev --prefix "DATA/C2D/C2D_MPEC_CONTENT"
|
|
||||||
PROMPT oci os object list --bucket-name mrds_data_dev --prefix "DATA/C2D/C2D_MPEC_CONTENT_CRITERION"
|
|
||||||
PROMPT
|
|
||||||
PROMPT # Download sample file for validation
|
|
||||||
PROMPT oci os object get --bucket-name mrds_data_dev --name "DATA/C2D/C2D_MPEC_ADMIN/filename.csv" --file sample.csv
|
|
||||||
|
|
||||||
PROMPT
|
|
||||||
PROMPT 6. Data Quality Checks (Manual)
|
|
||||||
PROMPT =========================================================================
|
|
||||||
|
|
||||||
PROMPT Manual verification steps:
|
|
||||||
PROMPT 1. Download sample CSV files from each folder
|
|
||||||
PROMPT 2. Verify CSV header matches template table columns
|
|
||||||
PROMPT 3. Check data formats (especially dates) match expectations
|
|
||||||
PROMPT 4. Confirm row counts approximately match source tables
|
|
||||||
PROMPT 5. Validate no empty files were created
|
|
||||||
PROMPT 6. Test loading sample data into external tables
|
|
||||||
PROMPT 7. Verify file registration entries in A_SOURCE_FILE_RECEIVED
|
|
||||||
|
|
||||||
PROMPT
|
|
||||||
PROMPT 7. Next Steps for ODS Integration
|
|
||||||
PROMPT =========================================================================
|
|
||||||
|
|
||||||
PROMPT After validation success:
|
|
||||||
PROMPT 1. Configure external tables pointing to CSV files
|
|
||||||
PROMPT 2. Test external table queries
|
|
||||||
PROMPT 3. Setup scheduled data refresh processes (if needed)
|
|
||||||
PROMPT 4. Document file locations and access patterns
|
|
||||||
PROMPT 5. Coordinate with REL_02 deployment timing
|
|
||||||
|
|
||||||
PROMPT
|
|
||||||
PROMPT =========================================================================
|
|
||||||
PROMPT VALIDATION COMPLETED
|
|
||||||
PROMPT =========================================================================
|
|
||||||
PROMPT Validation End:
|
|
||||||
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS VALIDATION_END FROM DUAL;
|
|
||||||
|
|
||||||
PROMPT
|
|
||||||
PROMPT Review the output above to confirm:
|
|
||||||
PROMPT ✓ Export processes completed without errors
|
|
||||||
PROMPT ✓ Source table row counts are reasonable
|
|
||||||
PROMPT ✓ Template tables exist and have matching structure
|
|
||||||
PROMPT ✓ Exported files registered in A_SOURCE_FILE_RECEIVED table
|
|
||||||
PROMPT ✓ Manual file validation steps are understood
|
|
||||||
PROMPT
|
|
||||||
PROMPT If any issues found, check export logs and re-run specific exports if needed.
|
|
||||||
PROMPT =========================================================================
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
-- ===================================================================
|
|
||||||
-- Universal Package Version Verification Script
|
|
||||||
-- ===================================================================
|
|
||||||
-- Purpose: Verify all tracked Oracle packages for code changes (MARS-956)
|
|
||||||
-- Author: Grzegorz Michalski
|
|
||||||
-- Date: 2026-02-11
|
|
||||||
-- Version: 1.0.0
|
|
||||||
--
|
|
||||||
-- USAGE:
|
|
||||||
-- Include at the end of install/rollback scripts: @@verify_packages_version.sql
|
|
||||||
--
|
|
||||||
-- OUTPUT:
|
|
||||||
-- - List of all tracked packages with their current status
|
|
||||||
-- - OK: Package has not changed since last tracking
|
|
||||||
-- - WARNING: Package code changed without version update
|
|
||||||
-- ===================================================================
|
|
||||||
|
|
||||||
SET LINESIZE 200
|
|
||||||
SET PAGESIZE 1000
|
|
||||||
SET FEEDBACK OFF
|
|
||||||
|
|
||||||
PROMPT
|
|
||||||
PROMPT ========================================
|
|
||||||
PROMPT MARS-956: Package Version Verification
|
|
||||||
PROMPT ========================================
|
|
||||||
PROMPT
|
|
||||||
|
|
||||||
COLUMN PACKAGE_OWNER FORMAT A15
|
|
||||||
COLUMN PACKAGE_NAME FORMAT A20
|
|
||||||
COLUMN VERSION FORMAT A10
|
|
||||||
COLUMN STATUS FORMAT A80
|
|
||||||
|
|
||||||
SELECT
|
|
||||||
PACKAGE_OWNER,
|
|
||||||
PACKAGE_NAME,
|
|
||||||
PACKAGE_VERSION AS VERSION,
|
|
||||||
CT_MRDS.ENV_MANAGER.CHECK_PACKAGE_CHANGES(PACKAGE_OWNER, PACKAGE_NAME) AS STATUS
|
|
||||||
FROM (
|
|
||||||
SELECT
|
|
||||||
PACKAGE_OWNER,
|
|
||||||
PACKAGE_NAME,
|
|
||||||
PACKAGE_VERSION,
|
|
||||||
ROW_NUMBER() OVER (PARTITION BY PACKAGE_OWNER, PACKAGE_NAME ORDER BY TRACKING_DATE DESC) AS RN
|
|
||||||
FROM CT_MRDS.A_PACKAGE_VERSION_TRACKING
|
|
||||||
)
|
|
||||||
WHERE RN = 1
|
|
||||||
ORDER BY PACKAGE_OWNER, PACKAGE_NAME;
|
|
||||||
|
|
||||||
PROMPT
|
|
||||||
PROMPT ========================================
|
|
||||||
PROMPT MARS-956: Verification Complete
|
|
||||||
PROMPT ========================================
|
|
||||||
PROMPT
|
|
||||||
PROMPT Legend:
|
|
||||||
PROMPT OK - Package has not changed since last tracking
|
|
||||||
PROMPT WARNING - Package code changed without version update
|
|
||||||
PROMPT
|
|
||||||
PROMPT For detailed hash information, use:
|
|
||||||
PROMPT SELECT ENV_MANAGER.GET_PACKAGE_HASH_INFO('OWNER', 'PACKAGE') FROM DUAL;
|
|
||||||
PROMPT ========================================
|
|
||||||
|
|
||||||
SET FEEDBACK ON
|
|
||||||
Reference in New Issue
Block a user