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:
Grzegorz Michalski
2026-02-12 09:56:37 +01:00
parent f2bcdb3a76
commit a7d286b1e6
13 changed files with 1871 additions and 661 deletions

View File

@@ -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;
/

View File

@@ -1,156 +1,359 @@
-- ===================================================================
-- MARS-956: Export Historical C2D MPEC Data to DATA Bucket
-- ===================================================================
-- Purpose: One-time export of historical C2D MPEC delta data from
-- OU_C2D operational database to DATA bucket as CSV files
-- Method: Using DATA_EXPORTER.EXPORT_TABLE_DATA procedure
-- Target: DATA bucket with folder structure DATA/C2D/{TABLE_NAME}
-- Format: CSV files for complete historical data access
-- ===================================================================
-- =====================================================================================
-- Script: 01_MARS_956_export_c2d_mpec_data.sql
-- Purpose: Export C2D MPEC historical data to ODS bucket
-- Author: System Generated
-- Created: 2026-02-12
-- MARS Issue: MARS-956
-- Target: mrds_data_dev/ODS/C2D/
-- =====================================================================================
PROMPT =========================================================================
PROMPT MARS-956: Starting C2D MPEC Historical Data Export
PROMPT =========================================================================
SET SERVEROUTPUT ON SIZE UNLIMITED;
SET TIMING ON;
PROMPT =====================================================================================
PROMPT MARS-956: C2D MPEC Historical Data Export
PROMPT =====================================================================================
PROMPT Export Strategy:
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 - Structure: Must match ODS template tables
PROMPT - Registration: Files registered in A_SOURCE_FILE_RECEIVED
PROMPT =========================================================================
PROMPT - Path Structure: ODS/C2D/C2D_MPEC_*/
PROMPT =====================================================================================
-- 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',
'Tables: MPEC_ADMIN, MPEC_CONTENT, MPEC_CONTENT_CRITERION');
COMMIT;
-- ===================================================================
-- TABLE 1: OU_C2D.MPEC_ADMIN -> DATA/C2D/C2D_MPEC_ADMIN
-- ===================================================================
PROMPT
PROMPT =====================================================================================
PROMPT PRE-EXPORT: Verify Source and Target Table Readiness
PROMPT =====================================================================================
PROMPT Exporting Table 1/3: OU_C2D.MPEC_ADMIN
PROMPT Target: mrds_data_dev/DATA/C2D/C2D_MPEC_ADMIN
-- Check source table counts before export
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
CT_MRDS.DATA_EXPORTER.EXPORT_TABLE_DATA(
pSchemaName => 'OU_C2D',
pTableName => 'MPEC_ADMIN',
pKeyColumnName => 'A_ETL_LOAD_SET_FK', -- ETL key for data lookup
pBucketArea => 'DATA',
pFolderName => 'DATA/C2D/C2D_MPEC_ADMIN',
pBucketArea => 'ODS',
pFolderName => 'ODS/C2D/C2D_MPEC_ADMIN',
pTemplateTableName => 'CT_ET_TEMPLATES.C2D_MPEC_ADMIN', -- Template for column order
pRegisterExport => TRUE, -- Register files in A_SOURCE_FILE_RECEIVED
pCredentialName => 'DEF_CRED_ARN'
pMaxFileSize => 104857600, -- 100MB max file size
pRegisterExport => TRUE -- Register files in A_SOURCE_FILE_RECEIVED
);
DBMS_OUTPUT.PUT_LINE('✓ MPEC_ADMIN export completed successfully');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('✗ MPEC_ADMIN export failed: ' || SQLERRM);
-- Log error but continue with other tables
INSERT INTO CT_MRDS.A_PROCESS_LOG (PACKAGE_NAME, PROCEDURE_NAME, EVENT_TYPE, EVENT_MESSAGE)
VALUES ('MARS-956', 'EXPORT_MPEC_ADMIN', 'ERROR', 'Export failed: ' || SQLERRM);
COMMIT;
RAISE;
DECLARE
vErrorMsg VARCHAR2(4000) := SUBSTR(SQLERRM, 1, 4000);
BEGIN
DBMS_OUTPUT.PUT_LINE('✗ MPEC_ADMIN export failed: ' || vErrorMsg);
-- Log error using proper ENV_MANAGER pattern
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;
/
-- ===================================================================
-- TABLE 2: OU_C2D.MPEC_CONTENT -> DATA/C2D/C2D_MPEC_CONTENT
-- ===================================================================
PROMPT Exporting Table 2/3: OU_C2D.MPEC_CONTENT
PROMPT Target: mrds_data_dev/DATA/C2D/C2D_MPEC_CONTENT
PROMPT
PROMPT =====================================================================================
PROMPT TABLE 2/3: OU_C2D.MPEC_CONTENT -> ODS/C2D/C2D_MPEC_CONTENT
PROMPT =====================================================================================
PROMPT Expected: 5 records with ETL keys 2006-2008
PROMPT Target: mrds_data_dev/ODS/C2D/C2D_MPEC_CONTENT/*.csv
BEGIN
CT_MRDS.DATA_EXPORTER.EXPORT_TABLE_DATA(
pSchemaName => 'OU_C2D',
pTableName => 'MPEC_CONTENT',
pKeyColumnName => 'A_ETL_LOAD_SET_FK', -- ETL key for data lookup
pBucketArea => 'DATA',
pFolderName => 'DATA/C2D/C2D_MPEC_CONTENT',
pTemplateTableName => 'CT_ET_TEMPLATES.C2D_MPEC_CONTENT', -- Template for column order
pRegisterExport => TRUE, -- Register files in A_SOURCE_FILE_RECEIVED
pCredentialName => 'DEF_CRED_ARN'
pKeyColumnName => 'A_ETL_LOAD_SET_FK',
pBucketArea => 'ODS',
pFolderName => 'ODS/C2D/C2D_MPEC_CONTENT',
pTemplateTableName => 'CT_ET_TEMPLATES.C2D_MPEC_CONTENT',
pMaxFileSize => 104857600, -- 100MB max file size
pRegisterExport => TRUE
);
DBMS_OUTPUT.PUT_LINE('✓ MPEC_CONTENT export completed successfully');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('✗ MPEC_CONTENT export failed: ' || SQLERRM);
-- Log error but continue with other tables
INSERT INTO CT_MRDS.A_PROCESS_LOG (PACKAGE_NAME, PROCEDURE_NAME, EVENT_TYPE, EVENT_MESSAGE)
VALUES ('MARS-956', 'EXPORT_MPEC_CONTENT', 'ERROR', 'Export failed: ' || SQLERRM);
COMMIT;
RAISE;
DECLARE
vErrorMsg VARCHAR2(4000) := SUBSTR(SQLERRM, 1, 4000);
BEGIN
DBMS_OUTPUT.PUT_LINE('✗ MPEC_CONTENT export failed: ' || vErrorMsg);
-- Log error using proper ENV_MANAGER pattern
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;
/
-- ===================================================================
-- TABLE 3: OU_C2D.MPEC_CONTENT_CRITERION -> DATA/C2D/C2D_MPEC_CONTENT_CRITERION
-- ===================================================================
PROMPT Exporting Table 3/3: OU_C2D.MPEC_CONTENT_CRITERION
PROMPT Target: mrds_data_dev/DATA/C2D/C2D_MPEC_CONTENT_CRITERION
PROMPT
PROMPT =====================================================================================
PROMPT TABLE 3/3: OU_C2D.MPEC_CONTENT_CRITERION -> ODS/C2D/C2D_MPEC_CONTENT_CRITERION
PROMPT =====================================================================================
PROMPT Expected: 9 records with ETL keys 2009-2010
PROMPT Target: mrds_data_dev/ODS/C2D/C2D_MPEC_CONTENT_CRITERION/*.csv
BEGIN
CT_MRDS.DATA_EXPORTER.EXPORT_TABLE_DATA(
pSchemaName => 'OU_C2D',
pTableName => 'MPEC_CONTENT_CRITERION',
pKeyColumnName => 'A_ETL_LOAD_SET_FK', -- ETL key for data lookup
pBucketArea => 'DATA',
pFolderName => 'DATA/C2D/C2D_MPEC_CONTENT_CRITERION',
pTemplateTableName => 'CT_ET_TEMPLATES.C2D_MPEC_CONTENT_CRITERION', -- Template for column order
pRegisterExport => TRUE, -- Register files in A_SOURCE_FILE_RECEIVED
pCredentialName => 'DEF_CRED_ARN'
pKeyColumnName => 'A_ETL_LOAD_SET_FK',
pBucketArea => 'ODS',
pFolderName => 'ODS/C2D/C2D_MPEC_CONTENT_CRITERION',
pTemplateTableName => 'CT_ET_TEMPLATES.C2D_MPEC_CONTENT_CRITERION',
pMaxFileSize => 104857600, -- 100MB max file size
pRegisterExport => TRUE
);
DBMS_OUTPUT.PUT_LINE('✓ MPEC_CONTENT_CRITERION export completed successfully');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('✗ MPEC_CONTENT_CRITERION export failed: ' || SQLERRM);
-- Log error
INSERT INTO CT_MRDS.A_PROCESS_LOG (PACKAGE_NAME, PROCEDURE_NAME, EVENT_TYPE, EVENT_MESSAGE)
VALUES ('MARS-956', 'EXPORT_MPEC_CONTENT_CRITERION', 'ERROR', 'Export failed: ' || SQLERRM);
COMMIT;
RAISE;
DECLARE
vErrorMsg VARCHAR2(4000) := SUBSTR(SQLERRM, 1, 4000);
BEGIN
DBMS_OUTPUT.PUT_LINE('✗ MPEC_CONTENT_CRITERION export failed: ' || vErrorMsg);
-- Log error using proper ENV_MANAGER pattern
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;
/
-- ===================================================================
-- Export Summary and Verification
-- ===================================================================
PROMPT =========================================================================
PROMPT
PROMPT =====================================================================================
PROMPT Export Summary - Checking Results
PROMPT =========================================================================
PROMPT =====================================================================================
-- 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');
COMMIT;
-- Display recent export activity
PROMPT Recent Export Activity (last 30 minutes):
SELECT TO_CHAR(EVENT_TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS') AS EXPORT_TIME,
PACKAGE_NAME,
SELECT TO_CHAR(LOG_TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS') AS EXPORT_TIME,
PROCESS_NAME,
PROCEDURE_NAME,
EVENT_TYPE,
EVENT_MESSAGE
LOG_LEVEL,
LOG_MESSAGE
FROM CT_MRDS.A_PROCESS_LOG
WHERE PACKAGE_NAME = 'MARS-956'
WHERE PROCESS_NAME = 'MARS-956'
OR PROCEDURE_NAME LIKE '%DATA_EXPORTER%'
AND EVENT_TIMESTAMP >= SYSTIMESTAMP - INTERVAL '30' MINUTE
ORDER BY EVENT_TIMESTAMP DESC
AND LOG_TIMESTAMP >= SYSTIMESTAMP - INTERVAL '30' MINUTE
ORDER BY LOG_TIMESTAMP DESC
FETCH FIRST 20 ROWS ONLY;
PROMPT =========================================================================
PROMPT MARS-956 Export Completed Successfully!
PROMPT =========================================================================
PROMPT Next Steps:
PROMPT 1. Verify CSV files created in DATA bucket
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 =========================================================================
PROMPT
PROMPT =====================================================================================
PROMPT MARS-956 C2D MPEC Export Completed Successfully!
PROMPT =====================================================================================
PROMPT POST-EXPORT: Source vs Target Record Count Comparison
PROMPT =====================================================================================
-- Verify record counts after export
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 =====================================================================================

View 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 =========================================================================

View File

@@ -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 =========================================================================

View File

@@ -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 =========================================================================

View File

@@ -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 =========================================================================

View File

@@ -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 =========================================================================

View File

@@ -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
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
**Output**: CSV files in DATA bucket
**Mapping**: Structure must match new ODS template tables
## Tables to Export
| Source Table (OU_C2D) | Target Location (DATA) | Export Type | Time Dependency |
|------------------------|-------------------------|-------------|------------------|
| `MPEC_ADMIN` | `mrds_data_dev/DATA/C2D/C2D_MPEC_ADMIN` | CSV to DATA | Sync with REL_02 |
| `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)
```
## Contents
- `install_mars956.sql` - Master installation script with SPOOL logging
- `rollback_mars956.sql` - Master rollback script
- `00_MARS_956_*.sql` - Prerequisites check
- `01_MARS_956_*.sql` - Data export script
- `02_MARS_956_*.sql` - Export verification
- `03_MARS_956_*.sql` - Data integrity validation
- `91_MARS_956_*.sql` - Rollback scripts
- `99_MARS_956_*.sql` - Rollback verification
## 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_EXPORTER package v2.7.5+ deployed (with pRegisterExport support)
- DEF_CRED_ARN credentials configured
- DATA bucket accessible
## Data Structure
## 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
2. Verify CSV files created in DATA bucket
3. Validate file structure matches template tables
4. Confirm row counts match source tables
5. Check file registration in A_SOURCE_FILE_RECEIVED table
### Template Tables (CT_ET_TEMPLATES schema)
- **C2D_MPEC_ADMIN**: 10 columns
- **C2D_MPEC_CONTENT**: 87 columns
- **C2D_MPEC_CONTENT_CRITERION**: 4 columns
## 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
- No package modifications required (uses existing DATA_EXPORTER)
- Export timing critical - must sync with REL_02 deployment
- Complete history required for delta queries
## Enhanced Validation Framework
### Pre-Export Validation (Check 1-5)
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

View File

@@ -1,128 +1,97 @@
-- ===================================================================
-- MARS-956 MASTER INSTALLATION SCRIPT
-- ===================================================================
-- 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
-- MARS-956 INSTALL SCRIPT: C2D MPEC Data Export to External Tables
-- ===================================================================
-- 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
define spoolfile = 'log\install_mars956_'
define timestamp = ''
-- Get current timestamp for unique log filename
column current_time new_value timestamp
SELECT TO_CHAR(SYSDATE, 'YYYYMMDD_HH24MISS') AS current_time FROM dual;
var filename VARCHAR2(100)
BEGIN
: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
spool &spoolfile.&timestamp..log
SET ECHO OFF
SET TIMING ON
SET SERVEROUTPUT ON SIZE UNLIMITED
SET PAUSE OFF
-- Display environment information
PROMPT =========================================================================
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;
-- Set current schema context (optional - use when modifying packages in specific schema)
-- ALTER SESSION SET CURRENT_SCHEMA = CT_MRDS;
PROMPT =========================================================================
PROMPT Installation Details:
PROMPT - Purpose: One-time export of historical C2D MPEC delta data
PROMPT - Source: OU_C2D schema tables (operational database)
PROMPT - Target: DATA bucket as CSV files
PROMPT - Tables: MPEC_ADMIN, MPEC_CONTENT, MPEC_CONTENT_CRITERION
PROMPT - Method: DATA_EXPORTER.EXPORT_TABLE_DATA_BY_DATE
PROMPT MARS-956: C2D MPEC Data Export to External Tables (One-Time Migration)
PROMPT =========================================================================
PROMPT
PROMPT This script will export 3 C2D MPEC tables to OCI buckets:
PROMPT
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 =========================================================================
SET SERVEROUTPUT ON SIZE 1000000
SET LINESIZE 200
SET PAGESIZE 1000
-- Confirm installation with user
ACCEPT continue CHAR PROMPT 'Type YES to continue with installation, 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, 'Installation aborted by user');
END IF;
END;
/
WHENEVER SQLERROR CONTINUE
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 Checking DATA_EXPORTER package availability...
SELECT 'DATA_EXPORTER v' || CT_MRDS.DATA_EXPORTER.PACKAGE_VERSION ||
' (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 =========================================================================
PROMPT Step 1: Export C2D MPEC Data to ODS Bucket
PROMPT =========================================================================
@@01_MARS_956_export_c2d_mpec_data.sql
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 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 MARS-956 INSTALLATION SUMMARY
PROMPT MARS-956 Installation - COMPLETED
PROMPT =========================================================================
-- Display final summary
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 Check the log file for complete installation details.
PROMPT For rollback, use: rollback_mars956.sql
PROMPT =========================================================================
spool off
quit;

View File

@@ -1,85 +1,75 @@
-- ===================================================================
-- MARS-956 ROLLBACK SCRIPT
-- ===================================================================
-- 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.
-- MARS-956 ROLLBACK SCRIPT: C2D MPEC Data Export Rollback
-- ===================================================================
-- 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
spool rollback_mars956.log
-- Dynamic spool file generation (using SYS_CONTEXT - no DBA privileges required)
-- 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 MARS-956 ROLLBACK - Cleanup Historical C2D MPEC Export
PROMPT MARS-956: Rollback C2D MPEC Data Export
PROMPT =========================================================================
PROMPT Rollback Start:
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS ROLLBACK_START FROM DUAL;
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 WARNING: This will DELETE exported CSV files and file registrations!
PROMPT - ODS bucket: mrds_data_dev/ODS/C2D/
PROMPT - File registrations: A_SOURCE_FILE_RECEIVED entries
PROMPT
PROMPT If complete rollback is needed, manually remove CSV files from 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 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 Only proceed if export failed and needs to be restarted!
PROMPT =========================================================================
PROMPT Rollback Completed:
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS ROLLBACK_END FROM DUAL;
-- Confirm rollback with user
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 Note: This rollback script primarily cleans up log entries.
PROMPT Exported CSV files require manual removal from DATA bucket.
PROMPT
PROMPT =========================================================================
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
quit;

View File

@@ -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;
/

View File

@@ -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 =========================================================================

View File

@@ -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