Init
This commit is contained in:
6
MARS_Packages/REL01_POST_DEACTIVATION/MARS-826/.gitignore
vendored
Normal file
6
MARS_Packages/REL01_POST_DEACTIVATION/MARS-826/.gitignore
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
# Exclude temporary folders from version control
|
||||
confluence/
|
||||
log/
|
||||
test/
|
||||
mock_data/
|
||||
|
||||
@@ -0,0 +1,105 @@
|
||||
-- =====================================================================================
|
||||
-- Script: 00_MARS_826_pre_check_existing_files.sql
|
||||
-- Purpose: Display existing archive files in HIST bucket before export
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Created: 2025-12-02
|
||||
-- MARS Issue: MARS-826
|
||||
-- Target Location: mrds_hist_dev/ARCHIVE/LM/
|
||||
-- =====================================================================================
|
||||
|
||||
SET SERVEROUTPUT ON SIZE UNLIMITED;
|
||||
SET FEEDBACK ON;
|
||||
SET VERIFY OFF;
|
||||
SET LINESIZE 200;
|
||||
|
||||
PROMPT =====================================================================================
|
||||
PROMPT MARS-826 Pre-Check: Listing existing archive files in HIST bucket
|
||||
PROMPT =====================================================================================
|
||||
|
||||
DECLARE
|
||||
vBucketUri VARCHAR2(500);
|
||||
vCredentialName VARCHAR2(100);
|
||||
vFileCount NUMBER := 0;
|
||||
vTotalFiles NUMBER := 0;
|
||||
|
||||
TYPE t_folder_list IS TABLE OF VARCHAR2(200);
|
||||
vFolders t_folder_list;
|
||||
BEGIN
|
||||
-- Get bucket URI and credential from FILE_MANAGER configuration
|
||||
vBucketUri := CT_MRDS.FILE_MANAGER.GET_BUCKET_URI('ARCHIVE');
|
||||
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('Bucket URI: ' || vBucketUri);
|
||||
DBMS_OUTPUT.PUT_LINE('Credential: ' || vCredentialName);
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
|
||||
-- Initialize folder list for all 19 tables
|
||||
vFolders := t_folder_list(
|
||||
'ARCHIVE/LM/LM_ADHOC_ADJUSTMENTS_HEADER/',
|
||||
'ARCHIVE/LM/LM_ADHOC_ADJUSTMENTS_ITEM/',
|
||||
'ARCHIVE/LM/LM_ADHOC_ADJUSTMENTS_ITEM_HEADER/',
|
||||
'ARCHIVE/LM/LM_BALANCESHEET_HEADER/',
|
||||
'ARCHIVE/LM/LM_BALANCESHEET_ITEM/',
|
||||
'ARCHIVE/LM/LM_CSM_ADJUSTMENTS_HEADER/',
|
||||
'ARCHIVE/LM/LM_CSM_ADJUSTMENTS_ITEM/',
|
||||
'ARCHIVE/LM/LM_CSM_ADJUSTMENTS_ITEM_HEADER/',
|
||||
'ARCHIVE/LM/LM_STANDING_FACILITIES/',
|
||||
'ARCHIVE/LM/LM_STANDING_FACILITIES_HEADER/',
|
||||
'ARCHIVE/LM/LM_CURRENT_ACCOUNTS_HEADER/',
|
||||
'ARCHIVE/LM/LM_CURRENT_ACCOUNTS_ITEM/',
|
||||
'ARCHIVE/LM/LM_FORECAST_HEADER/',
|
||||
'ARCHIVE/LM/LM_FORECAST_ITEM/',
|
||||
'ARCHIVE/LM/LM_QRE_ADJUSTMENTS_HEADER/',
|
||||
'ARCHIVE/LM/LM_QRE_ADJUSTMENTS_ITEM/',
|
||||
'ARCHIVE/LM/LM_QRE_ADJUSTMENTS_ITEM_HEADER/',
|
||||
'ARCHIVE/LM/LM_TTS_HEADER/',
|
||||
'ARCHIVE/LM/LM_TTS_ITEM/'
|
||||
);
|
||||
|
||||
-- Check each folder
|
||||
FOR i IN 1..vFolders.COUNT LOOP
|
||||
vFileCount := 0;
|
||||
|
||||
-- List all Parquet files in the folder
|
||||
FOR rec IN (
|
||||
SELECT object_name, bytes
|
||||
FROM TABLE(DBMS_CLOUD.LIST_OBJECTS(
|
||||
credential_name => vCredentialName,
|
||||
location_uri => vBucketUri || vFolders(i)
|
||||
))
|
||||
WHERE object_name LIKE '%.parquet'
|
||||
ORDER BY object_name
|
||||
) LOOP
|
||||
IF vFileCount = 0 THEN
|
||||
DBMS_OUTPUT.PUT_LINE('Folder: ' || vFolders(i));
|
||||
END IF;
|
||||
|
||||
vFileCount := vFileCount + 1;
|
||||
DBMS_OUTPUT.PUT_LINE(' [' || vFileCount || '] ' || rec.object_name || ' (' ||
|
||||
ROUND(rec.bytes/1024/1024, 2) || ' MB)');
|
||||
END LOOP;
|
||||
|
||||
IF vFileCount > 0 THEN
|
||||
DBMS_OUTPUT.PUT_LINE('Folder summary: ' || vFileCount || ' files found');
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
vTotalFiles := vTotalFiles + vFileCount;
|
||||
END IF;
|
||||
END LOOP;
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||
DBMS_OUTPUT.PUT_LINE('PRE-CHECK COMPLETE: Total existing files: ' || vTotalFiles);
|
||||
IF vTotalFiles = 0 THEN
|
||||
DBMS_OUTPUT.PUT_LINE('STATUS: No existing archive files found - ready for initial export');
|
||||
ELSE
|
||||
DBMS_OUTPUT.PUT_LINE('WARNING: Existing archive files found - export will add new files or overwrite existing ones');
|
||||
END IF;
|
||||
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
DBMS_OUTPUT.PUT_LINE('ERROR: ' || SQLERRM);
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
@@ -0,0 +1,76 @@
|
||||
-- ============================================================================
|
||||
-- MARS-826 Export Step 01: ADHOC_ADJ Tables
|
||||
-- ============================================================================
|
||||
-- Purpose: Export ADHOC_ADJ table group to HIST bucket
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Tables: 3 tables (~209 records total)
|
||||
-- Target: mrds_hist_dev/ARCHIVE/LM/LM_ADHOC_ADJUSTMENTS_*
|
||||
-- ============================================================================
|
||||
|
||||
SET SERVEROUTPUT ON SIZE UNLIMITED
|
||||
|
||||
PROMPT
|
||||
PROMPT ============================================================================
|
||||
PROMPT Step 01: Exporting ADHOC_ADJ Tables (3 tables)
|
||||
PROMPT ============================================================================
|
||||
|
||||
-- Table 1: LEGACY_ADHOC_ADJ_HEADER (~5 records)
|
||||
PROMPT
|
||||
PROMPT Exporting OU_LM.LEGACY_ADHOC_ADJ_HEADER...
|
||||
BEGIN
|
||||
CT_MRDS.DATA_EXPORTER.EXPORT_TABLE_DATA_BY_DATE(
|
||||
pSchemaName => 'OU_LM',
|
||||
pTableName => 'LEGACY_ADHOC_ADJ_HEADER',
|
||||
pKeyColumnName => 'A_ETL_LOAD_SET_KEY_FK',
|
||||
pBucketArea => 'ARCHIVE',
|
||||
pFolderName => 'ARCHIVE/LM/LM_ADHOC_ADJUSTMENTS_HEADER'
|
||||
);
|
||||
DBMS_OUTPUT.PUT_LINE('SUCCESS: LEGACY_ADHOC_ADJ_HEADER exported');
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('ERROR exporting ADHOC_ADJ_HEADER: ' || SQLERRM);
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
|
||||
-- Table 2: LEGACY_ADHOC_ADJ_ITEM (~102 records)
|
||||
PROMPT
|
||||
PROMPT Exporting OU_LM.LEGACY_ADHOC_ADJ_ITEM...
|
||||
BEGIN
|
||||
CT_MRDS.DATA_EXPORTER.EXPORT_TABLE_DATA_BY_DATE(
|
||||
pSchemaName => 'OU_LM',
|
||||
pTableName => 'LEGACY_ADHOC_ADJ_ITEM',
|
||||
pKeyColumnName => 'A_ETL_LOAD_SET_KEY_FK',
|
||||
pBucketArea => 'ARCHIVE',
|
||||
pFolderName => 'ARCHIVE/LM/LM_ADHOC_ADJUSTMENTS_ITEM'
|
||||
);
|
||||
DBMS_OUTPUT.PUT_LINE('SUCCESS: LEGACY_ADHOC_ADJ_ITEM exported');
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('ERROR exporting ADHOC_ADJ_ITEM: ' || SQLERRM);
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
|
||||
-- Table 3: LEGACY_ADHOC_ADJ_ITEM_HEADER (~102 records)
|
||||
PROMPT
|
||||
PROMPT Exporting OU_LM.LEGACY_ADHOC_ADJ_ITEM_HEADER...
|
||||
BEGIN
|
||||
CT_MRDS.DATA_EXPORTER.EXPORT_TABLE_DATA_BY_DATE(
|
||||
pSchemaName => 'OU_LM',
|
||||
pTableName => 'LEGACY_ADHOC_ADJ_ITEM_HEADER',
|
||||
pKeyColumnName => 'A_ETL_LOAD_SET_KEY_FK',
|
||||
pBucketArea => 'ARCHIVE',
|
||||
pFolderName => 'ARCHIVE/LM/LM_ADHOC_ADJUSTMENTS_ITEM_HEADER'
|
||||
);
|
||||
DBMS_OUTPUT.PUT_LINE('SUCCESS: LEGACY_ADHOC_ADJ_ITEM_HEADER exported');
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('ERROR exporting ADHOC_ADJ_ITEM_HEADER: ' || SQLERRM);
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
|
||||
PROMPT
|
||||
PROMPT Step 01 completed: All ADHOC_ADJ tables exported
|
||||
PROMPT
|
||||
@@ -0,0 +1,66 @@
|
||||
-- ============================================================================
|
||||
-- MARS-826 Export Step 02: BALANCESHEET Tables
|
||||
-- ============================================================================
|
||||
-- Purpose: Export BALANCESHEET table group to HIST bucket
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Tables: 2 tables (~7.6M records total - LARGE DATASET)
|
||||
-- Target: mrds_hist_dev/ARCHIVE/LM/LM_BALANCESHEET_*
|
||||
-- ============================================================================
|
||||
|
||||
SET SERVEROUTPUT ON SIZE UNLIMITED
|
||||
|
||||
PROMPT
|
||||
PROMPT ============================================================================
|
||||
PROMPT Step 02: Exporting BALANCESHEET Tables (2 tables, ~7.6M records)
|
||||
PROMPT WARNING: Large dataset - this may take significant time
|
||||
PROMPT ============================================================================
|
||||
|
||||
-- START TIMING
|
||||
PROMPT
|
||||
SELECT 'START_TIME: ' || TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS TIMING FROM DUAL;
|
||||
|
||||
-- Table 1: LEGACY_BALANCESHEET_HEADER (~81,853 records)
|
||||
PROMPT
|
||||
PROMPT Exporting OU_LM.LEGACY_BALANCESHEET_HEADER...
|
||||
BEGIN
|
||||
CT_MRDS.DATA_EXPORTER.EXPORT_TABLE_DATA_BY_DATE(
|
||||
pSchemaName => 'OU_LM',
|
||||
pTableName => 'LEGACY_BALANCESHEET_HEADER',
|
||||
pKeyColumnName => 'A_ETL_LOAD_SET_KEY',
|
||||
pBucketArea => 'ARCHIVE',
|
||||
pFolderName => 'ARCHIVE/LM/LM_BALANCESHEET_HEADER'
|
||||
);
|
||||
DBMS_OUTPUT.PUT_LINE('SUCCESS: LEGACY_BALANCESHEET_HEADER exported');
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('ERROR exporting BALANCESHEET_HEADER: ' || SQLERRM);
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
|
||||
-- Table 2: LEGACY_BALANCESHEET_ITEM (~7,603,340 records - VERY LARGE)
|
||||
PROMPT
|
||||
PROMPT Exporting OU_LM.LEGACY_BALANCESHEET_ITEM (LARGE TABLE ~7.6M records)...
|
||||
BEGIN
|
||||
CT_MRDS.DATA_EXPORTER.EXPORT_TABLE_DATA_BY_DATE(
|
||||
pSchemaName => 'OU_LM',
|
||||
pTableName => 'LEGACY_BALANCESHEET_ITEM',
|
||||
pKeyColumnName => 'A_ETL_LOAD_SET_KEY',
|
||||
pBucketArea => 'ARCHIVE',
|
||||
pFolderName => 'ARCHIVE/LM/LM_BALANCESHEET_ITEM'
|
||||
);
|
||||
DBMS_OUTPUT.PUT_LINE('SUCCESS: LEGACY_BALANCESHEET_ITEM exported');
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('ERROR exporting BALANCESHEET_ITEM: ' || SQLERRM);
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
|
||||
-- END TIMING
|
||||
PROMPT
|
||||
SELECT 'END_TIME: ' || TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS TIMING FROM DUAL;
|
||||
|
||||
PROMPT
|
||||
PROMPT Step 02 completed: All BALANCESHEET tables exported
|
||||
PROMPT
|
||||
@@ -0,0 +1,76 @@
|
||||
-- ============================================================================
|
||||
-- MARS-826 Export Step 03: CSM_ADJ Tables
|
||||
-- ============================================================================
|
||||
-- Purpose: Export CSM_ADJ table group to HIST bucket
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Tables: 3 tables (~7,756 records total)
|
||||
-- Target: mrds_hist_dev/ARCHIVE/LM/LM_CSM_ADJUSTMENTS_*
|
||||
-- ============================================================================
|
||||
|
||||
SET SERVEROUTPUT ON SIZE UNLIMITED
|
||||
|
||||
PROMPT
|
||||
PROMPT ============================================================================
|
||||
PROMPT Step 03: Exporting CSM_ADJ Tables (3 tables)
|
||||
PROMPT ============================================================================
|
||||
|
||||
-- Table 1: LEGACY_CSM_ADJ_HEADER (~186 records)
|
||||
PROMPT
|
||||
PROMPT Exporting OU_LM.LEGACY_CSM_ADJ_HEADER...
|
||||
BEGIN
|
||||
CT_MRDS.DATA_EXPORTER.EXPORT_TABLE_DATA_BY_DATE(
|
||||
pSchemaName => 'OU_LM',
|
||||
pTableName => 'LEGACY_CSM_ADJ_HEADER',
|
||||
pKeyColumnName => 'A_ETL_LOAD_SET_KEY_FK',
|
||||
pBucketArea => 'ARCHIVE',
|
||||
pFolderName => 'ARCHIVE/LM/LM_CSM_ADJUSTMENTS_HEADER'
|
||||
);
|
||||
DBMS_OUTPUT.PUT_LINE('SUCCESS: LEGACY_CSM_ADJ_HEADER exported');
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('ERROR exporting CSM_ADJ_HEADER: ' || SQLERRM);
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
|
||||
-- Table 2: LEGACY_CSM_ADJ_ITEM (~3,785 records)
|
||||
PROMPT
|
||||
PROMPT Exporting OU_LM.LEGACY_CSM_ADJ_ITEM...
|
||||
BEGIN
|
||||
CT_MRDS.DATA_EXPORTER.EXPORT_TABLE_DATA_BY_DATE(
|
||||
pSchemaName => 'OU_LM',
|
||||
pTableName => 'LEGACY_CSM_ADJ_ITEM',
|
||||
pKeyColumnName => 'A_ETL_LOAD_SET_KEY_FK',
|
||||
pBucketArea => 'ARCHIVE',
|
||||
pFolderName => 'ARCHIVE/LM/LM_CSM_ADJUSTMENTS_ITEM'
|
||||
);
|
||||
DBMS_OUTPUT.PUT_LINE('SUCCESS: LEGACY_CSM_ADJ_ITEM exported');
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('ERROR exporting CSM_ADJ_ITEM: ' || SQLERRM);
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
|
||||
-- Table 3: LEGACY_CSM_ADJ_ITEM_HEADER (~3,785 records)
|
||||
PROMPT
|
||||
PROMPT Exporting OU_LM.LEGACY_CSM_ADJ_ITEM_HEADER...
|
||||
BEGIN
|
||||
CT_MRDS.DATA_EXPORTER.EXPORT_TABLE_DATA_BY_DATE(
|
||||
pSchemaName => 'OU_LM',
|
||||
pTableName => 'LEGACY_CSM_ADJ_ITEM_HEADER',
|
||||
pKeyColumnName => 'A_ETL_LOAD_SET_KEY_FK',
|
||||
pBucketArea => 'ARCHIVE',
|
||||
pFolderName => 'ARCHIVE/LM/LM_CSM_ADJUSTMENTS_ITEM_HEADER'
|
||||
);
|
||||
DBMS_OUTPUT.PUT_LINE('SUCCESS: LEGACY_CSM_ADJ_ITEM_HEADER exported');
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('ERROR exporting CSM_ADJ_ITEM_HEADER: ' || SQLERRM);
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
|
||||
PROMPT
|
||||
PROMPT Step 03 completed: All CSM_ADJ tables exported
|
||||
PROMPT
|
||||
@@ -0,0 +1,66 @@
|
||||
-- ============================================================================
|
||||
-- MARS-826 Export Step 04: STANDING_FACILITY Tables
|
||||
-- ============================================================================
|
||||
-- Purpose: Export STANDING_FACILITY table group to HIST bucket
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Tables: 2 tables (~1.2M records total - LARGE DATASET)
|
||||
-- Target: mrds_hist_dev/ARCHIVE/LM/LM_STANDING_FACILITIES*
|
||||
-- ============================================================================
|
||||
|
||||
SET SERVEROUTPUT ON SIZE UNLIMITED
|
||||
|
||||
PROMPT
|
||||
PROMPT ============================================================================
|
||||
PROMPT Step 04: Exporting STANDING_FACILITY Tables (2 tables, ~1.2M records)
|
||||
PROMPT WARNING: Large dataset - this may take significant time
|
||||
PROMPT ============================================================================
|
||||
|
||||
-- START TIMING
|
||||
PROMPT
|
||||
SELECT 'START_TIME: ' || TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS TIMING FROM DUAL;
|
||||
|
||||
-- Table 1: LEGACY_STANDING_FACILITY (~1,205,002 records - VERY LARGE)
|
||||
PROMPT
|
||||
PROMPT Exporting OU_LM.LEGACY_STANDING_FACILITY (LARGE TABLE ~1.2M records)...
|
||||
BEGIN
|
||||
CT_MRDS.DATA_EXPORTER.EXPORT_TABLE_DATA_BY_DATE(
|
||||
pSchemaName => 'OU_LM',
|
||||
pTableName => 'LEGACY_STANDING_FACILITY',
|
||||
pKeyColumnName => 'A_ETL_LOAD_SET_FK',
|
||||
pBucketArea => 'ARCHIVE',
|
||||
pFolderName => 'ARCHIVE/LM/LM_STANDING_FACILITIES'
|
||||
);
|
||||
DBMS_OUTPUT.PUT_LINE('SUCCESS: LEGACY_STANDING_FACILITY exported');
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('ERROR exporting STANDING_FACILITY: ' || SQLERRM);
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
|
||||
-- Table 2: LEGACY_STANDING_FACILITY_HEADER (~2,647 records)
|
||||
PROMPT
|
||||
PROMPT Exporting OU_LM.LEGACY_STANDING_FACILITY_HEADER...
|
||||
BEGIN
|
||||
CT_MRDS.DATA_EXPORTER.EXPORT_TABLE_DATA_BY_DATE(
|
||||
pSchemaName => 'OU_LM',
|
||||
pTableName => 'LEGACY_STANDING_FACILITY_HEADER',
|
||||
pKeyColumnName => 'A_ETL_LOAD_SET_FK',
|
||||
pBucketArea => 'ARCHIVE',
|
||||
pFolderName => 'ARCHIVE/LM/LM_STANDING_FACILITIES_HEADER'
|
||||
);
|
||||
DBMS_OUTPUT.PUT_LINE('SUCCESS: LEGACY_STANDING_FACILITY_HEADER exported');
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('ERROR exporting STANDING_FACILITY_HEADER: ' || SQLERRM);
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
|
||||
-- END TIMING
|
||||
PROMPT
|
||||
SELECT 'END_TIME: ' || TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS TIMING FROM DUAL;
|
||||
|
||||
PROMPT
|
||||
PROMPT Step 04 completed: All STANDING_FACILITY tables exported
|
||||
PROMPT
|
||||
@@ -0,0 +1,58 @@
|
||||
-- ============================================================================
|
||||
-- MARS-826 Export Step 05: MRR_IND_CURR_ACC Tables
|
||||
-- ============================================================================
|
||||
-- Purpose: Export MRR_IND_CURR_ACC table group to HIST bucket
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Schema: OU_MRR (different from other groups)
|
||||
-- Tables: 2 tables
|
||||
-- Target: mrds_hist_dev/ARCHIVE/LM/LM_CURRENT_ACCOUNTS_*
|
||||
-- ============================================================================
|
||||
|
||||
SET SERVEROUTPUT ON SIZE UNLIMITED
|
||||
|
||||
PROMPT
|
||||
PROMPT ============================================================================
|
||||
PROMPT Step 05: Exporting MRR_IND_CURR_ACC Tables (2 tables from OU_MRR schema)
|
||||
PROMPT ============================================================================
|
||||
|
||||
-- Table 1: LEGACY_MRR_IND_CURRENT_ACCOUNT_HEADER
|
||||
PROMPT
|
||||
PROMPT Exporting OU_MRR.LEGACY_MRR_IND_CURRENT_ACCOUNT_HEADER...
|
||||
BEGIN
|
||||
CT_MRDS.DATA_EXPORTER.EXPORT_TABLE_DATA_BY_DATE(
|
||||
pSchemaName => 'OU_MRR',
|
||||
pTableName => 'LEGACY_MRR_IND_CURRENT_ACCOUNT_HEADER',
|
||||
pKeyColumnName => 'A_ETL_LOAD_SET_KEY',
|
||||
pBucketArea => 'ARCHIVE',
|
||||
pFolderName => 'ARCHIVE/LM/LM_CURRENT_ACCOUNTS_HEADER'
|
||||
);
|
||||
DBMS_OUTPUT.PUT_LINE('SUCCESS: LEGACY_MRR_IND_CURRENT_ACCOUNT_HEADER exported');
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('ERROR exporting MRR_IND_CURRENT_ACCOUNT_HEADER: ' || SQLERRM);
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
|
||||
-- Table 2: LEGACY_MRR_IND_CURRENT_ACCOUNT_ITEM
|
||||
PROMPT
|
||||
PROMPT Exporting OU_MRR.LEGACY_MRR_IND_CURRENT_ACCOUNT_ITEM...
|
||||
BEGIN
|
||||
CT_MRDS.DATA_EXPORTER.EXPORT_TABLE_DATA_BY_DATE(
|
||||
pSchemaName => 'OU_MRR',
|
||||
pTableName => 'LEGACY_MRR_IND_CURRENT_ACCOUNT_ITEM',
|
||||
pKeyColumnName => 'A_ETL_LOAD_SET_KEY',
|
||||
pBucketArea => 'ARCHIVE',
|
||||
pFolderName => 'ARCHIVE/LM/LM_CURRENT_ACCOUNTS_ITEM'
|
||||
);
|
||||
DBMS_OUTPUT.PUT_LINE('SUCCESS: LEGACY_MRR_IND_CURRENT_ACCOUNT_ITEM exported');
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('ERROR exporting MRR_IND_CURRENT_ACCOUNT_ITEM: ' || SQLERRM);
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
|
||||
PROMPT
|
||||
PROMPT Step 05 completed: All MRR_IND_CURRENT_ACCOUNT tables exported
|
||||
PROMPT
|
||||
@@ -0,0 +1,66 @@
|
||||
-- ============================================================================
|
||||
-- MARS-826 Export Step 06: FORECAST Tables
|
||||
-- ============================================================================
|
||||
-- Purpose: Export FORECAST table group to HIST bucket
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Tables: 2 tables (~21.6M records total - VERY LARGE DATASET)
|
||||
-- Target: mrds_hist_dev/ARCHIVE/LM/LM_FORECAST_*
|
||||
-- ============================================================================
|
||||
|
||||
SET SERVEROUTPUT ON SIZE UNLIMITED
|
||||
|
||||
PROMPT
|
||||
PROMPT ============================================================================
|
||||
PROMPT Step 06: Exporting FORECAST Tables (2 tables, ~21.6M records)
|
||||
PROMPT WARNING: LARGEST DATASET - this may take significant time
|
||||
PROMPT ============================================================================
|
||||
|
||||
-- START TIMING
|
||||
PROMPT
|
||||
SELECT 'START_TIME: ' || TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS TIMING FROM DUAL;
|
||||
|
||||
-- Table 1: LEGACY_FORECAST_HEADER (~42,504 records)
|
||||
PROMPT
|
||||
PROMPT Exporting OU_LM.LEGACY_FORECAST_HEADER...
|
||||
BEGIN
|
||||
CT_MRDS.DATA_EXPORTER.EXPORT_TABLE_DATA_BY_DATE(
|
||||
pSchemaName => 'OU_LM',
|
||||
pTableName => 'LEGACY_FORECAST_HEADER',
|
||||
pKeyColumnName => 'A_ETL_LOAD_SET_FK',
|
||||
pBucketArea => 'ARCHIVE',
|
||||
pFolderName => 'ARCHIVE/LM/LM_FORECAST_HEADER'
|
||||
);
|
||||
DBMS_OUTPUT.PUT_LINE('SUCCESS: LEGACY_FORECAST_HEADER exported');
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('ERROR exporting FORECAST_HEADER: ' || SQLERRM);
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
|
||||
-- Table 2: LEGACY_FORECAST_ITEM (~21,643,855 records - LARGEST TABLE)
|
||||
PROMPT
|
||||
PROMPT Exporting OU_LM.LEGACY_FORECAST_ITEM (LARGEST TABLE ~21.6M records)...
|
||||
BEGIN
|
||||
CT_MRDS.DATA_EXPORTER.EXPORT_TABLE_DATA_BY_DATE(
|
||||
pSchemaName => 'OU_LM',
|
||||
pTableName => 'LEGACY_FORECAST_ITEM',
|
||||
pKeyColumnName => 'A_ETL_LOAD_SET_FK',
|
||||
pBucketArea => 'ARCHIVE',
|
||||
pFolderName => 'ARCHIVE/LM/LM_FORECAST_ITEM'
|
||||
);
|
||||
DBMS_OUTPUT.PUT_LINE('SUCCESS: LEGACY_FORECAST_ITEM exported');
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('ERROR exporting FORECAST_ITEM: ' || SQLERRM);
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
|
||||
-- END TIMING
|
||||
PROMPT
|
||||
SELECT 'END_TIME: ' || TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS TIMING FROM DUAL;
|
||||
|
||||
PROMPT
|
||||
PROMPT Step 06 completed: All FORECAST tables exported
|
||||
PROMPT
|
||||
@@ -0,0 +1,76 @@
|
||||
-- ============================================================================
|
||||
-- MARS-826 Export Step 07: QR_ADJ Tables
|
||||
-- ============================================================================
|
||||
-- Purpose: Export QR_ADJ table group to HIST bucket
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Tables: 3 tables (~62,573 records total)
|
||||
-- Target: mrds_hist_dev/ARCHIVE/LM/LM_QRE_ADJUSTMENTS_*
|
||||
-- ============================================================================
|
||||
|
||||
SET SERVEROUTPUT ON SIZE UNLIMITED
|
||||
|
||||
PROMPT
|
||||
PROMPT ============================================================================
|
||||
PROMPT Step 07: Exporting QR_ADJ Tables (3 tables)
|
||||
PROMPT ============================================================================
|
||||
|
||||
-- Table 1: LEGACY_QR_ADJ_HEADER (~123 records)
|
||||
PROMPT
|
||||
PROMPT Exporting OU_LM.LEGACY_QR_ADJ_HEADER...
|
||||
BEGIN
|
||||
CT_MRDS.DATA_EXPORTER.EXPORT_TABLE_DATA_BY_DATE(
|
||||
pSchemaName => 'OU_LM',
|
||||
pTableName => 'LEGACY_QR_ADJ_HEADER',
|
||||
pKeyColumnName => 'A_ETL_LOAD_SET_KEY_FK',
|
||||
pBucketArea => 'ARCHIVE',
|
||||
pFolderName => 'ARCHIVE/LM/LM_QRE_ADJUSTMENTS_HEADER'
|
||||
);
|
||||
DBMS_OUTPUT.PUT_LINE('SUCCESS: LEGACY_QR_ADJ_HEADER exported');
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('ERROR exporting QR_ADJ_HEADER: ' || SQLERRM);
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
|
||||
-- Table 2: LEGACY_QR_ADJ_ITEM (~59,952 records)
|
||||
PROMPT
|
||||
PROMPT Exporting OU_LM.LEGACY_QR_ADJ_ITEM...
|
||||
BEGIN
|
||||
CT_MRDS.DATA_EXPORTER.EXPORT_TABLE_DATA_BY_DATE(
|
||||
pSchemaName => 'OU_LM',
|
||||
pTableName => 'LEGACY_QR_ADJ_ITEM',
|
||||
pKeyColumnName => 'A_ETL_LOAD_SET_KEY_FK',
|
||||
pBucketArea => 'ARCHIVE',
|
||||
pFolderName => 'ARCHIVE/LM/LM_QRE_ADJUSTMENTS_ITEM'
|
||||
);
|
||||
DBMS_OUTPUT.PUT_LINE('SUCCESS: LEGACY_QR_ADJ_ITEM exported');
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('ERROR exporting QR_ADJ_ITEM: ' || SQLERRM);
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
|
||||
-- Table 3: LEGACY_QR_ADJ_ITEM_HEADER (~2,498 records)
|
||||
PROMPT
|
||||
PROMPT Exporting OU_LM.LEGACY_QR_ADJ_ITEM_HEADER...
|
||||
BEGIN
|
||||
CT_MRDS.DATA_EXPORTER.EXPORT_TABLE_DATA_BY_DATE(
|
||||
pSchemaName => 'OU_LM',
|
||||
pTableName => 'LEGACY_QR_ADJ_ITEM_HEADER',
|
||||
pKeyColumnName => 'A_ETL_LOAD_SET_KEY_FK',
|
||||
pBucketArea => 'ARCHIVE',
|
||||
pFolderName => 'ARCHIVE/LM/LM_QRE_ADJUSTMENTS_ITEM_HEADER'
|
||||
);
|
||||
DBMS_OUTPUT.PUT_LINE('SUCCESS: LEGACY_QR_ADJ_ITEM_HEADER exported');
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('ERROR exporting QR_ADJ_ITEM_HEADER: ' || SQLERRM);
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
|
||||
PROMPT
|
||||
PROMPT Step 07 completed: All QR_ADJ tables exported
|
||||
PROMPT
|
||||
@@ -0,0 +1,57 @@
|
||||
-- ============================================================================
|
||||
-- MARS-826 Export Step 08: TTS Tables
|
||||
-- ============================================================================
|
||||
-- Purpose: Export TTS table group to HIST bucket
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Tables: 2 tables (~1,120 records total)
|
||||
-- Target: mrds_hist_dev/ARCHIVE/LM/LM_TTS_*
|
||||
-- ============================================================================
|
||||
|
||||
SET SERVEROUTPUT ON SIZE UNLIMITED
|
||||
|
||||
PROMPT
|
||||
PROMPT ============================================================================
|
||||
PROMPT Step 08: Exporting TTS Tables (2 tables)
|
||||
PROMPT ============================================================================
|
||||
|
||||
-- Table 1: LEGACY_TTS_HEADER (~560 records)
|
||||
PROMPT
|
||||
PROMPT Exporting OU_LM.LEGACY_TTS_HEADER...
|
||||
BEGIN
|
||||
CT_MRDS.DATA_EXPORTER.EXPORT_TABLE_DATA_BY_DATE(
|
||||
pSchemaName => 'OU_LM',
|
||||
pTableName => 'LEGACY_TTS_HEADER',
|
||||
pKeyColumnName => 'A_ETL_LOAD_SET_FK',
|
||||
pBucketArea => 'ARCHIVE',
|
||||
pFolderName => 'ARCHIVE/LM/LM_TTS_HEADER'
|
||||
);
|
||||
DBMS_OUTPUT.PUT_LINE('SUCCESS: LEGACY_TTS_HEADER exported');
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('ERROR exporting TTS_HEADER: ' || SQLERRM);
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
|
||||
-- Table 2: LEGACY_TTS_ITEM (~560 records)
|
||||
PROMPT
|
||||
PROMPT Exporting OU_LM.LEGACY_TTS_ITEM...
|
||||
BEGIN
|
||||
CT_MRDS.DATA_EXPORTER.EXPORT_TABLE_DATA_BY_DATE(
|
||||
pSchemaName => 'OU_LM',
|
||||
pTableName => 'LEGACY_TTS_ITEM',
|
||||
pKeyColumnName => 'A_ETL_LOAD_SET_FK',
|
||||
pBucketArea => 'ARCHIVE',
|
||||
pFolderName => 'ARCHIVE/LM/LM_TTS_ITEM'
|
||||
);
|
||||
DBMS_OUTPUT.PUT_LINE('SUCCESS: LEGACY_TTS_ITEM exported');
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('ERROR exporting TTS_ITEM: ' || SQLERRM);
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
|
||||
PROMPT
|
||||
PROMPT Step 08 completed: All TTS tables exported
|
||||
PROMPT
|
||||
@@ -0,0 +1,138 @@
|
||||
-- =====================================================================================
|
||||
-- Script: 09_MARS_826_verify_exports.sql
|
||||
-- Purpose: Verify all exported Parquet files exist in HIST bucket
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Created: 2025-12-02
|
||||
-- MARS Issue: MARS-826
|
||||
-- Target Location: mrds_hist_dev/ARCHIVE/LM/
|
||||
-- =====================================================================================
|
||||
|
||||
SET SERVEROUTPUT ON SIZE UNLIMITED;
|
||||
SET FEEDBACK ON;
|
||||
SET VERIFY OFF;
|
||||
SET LINESIZE 200;
|
||||
|
||||
PROMPT =====================================================================================
|
||||
PROMPT MARS-826 Verification: Checking exported files in HIST bucket
|
||||
PROMPT =====================================================================================
|
||||
|
||||
DECLARE
|
||||
vBucketUri VARCHAR2(500);
|
||||
vCredentialName VARCHAR2(100);
|
||||
vFileCount NUMBER := 0;
|
||||
vTotalFiles NUMBER := 0;
|
||||
vTotalSize NUMBER := 0;
|
||||
vFolderSize NUMBER := 0;
|
||||
|
||||
TYPE t_folder_list IS TABLE OF VARCHAR2(200);
|
||||
vFolders t_folder_list;
|
||||
|
||||
TYPE t_table_list IS TABLE OF VARCHAR2(100);
|
||||
vTables t_table_list;
|
||||
BEGIN
|
||||
-- Get bucket URI and credential from FILE_MANAGER configuration
|
||||
vBucketUri := CT_MRDS.FILE_MANAGER.GET_BUCKET_URI('ARCHIVE');
|
||||
vCredentialName := CT_MRDS.ENV_MANAGER.gvCredentialName;
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('VERIFICATION TIME: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3'));
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
|
||||
-- Initialize folder and table lists for all 19 tables
|
||||
vFolders := t_folder_list(
|
||||
'ARCHIVE/LM/LM_ADHOC_ADJUSTMENTS_HEADER/',
|
||||
'ARCHIVE/LM/LM_ADHOC_ADJUSTMENTS_ITEM/',
|
||||
'ARCHIVE/LM/LM_ADHOC_ADJUSTMENTS_ITEM_HEADER/',
|
||||
'ARCHIVE/LM/LM_BALANCESHEET_HEADER/',
|
||||
'ARCHIVE/LM/LM_BALANCESHEET_ITEM/',
|
||||
'ARCHIVE/LM/LM_CSM_ADJUSTMENTS_HEADER/',
|
||||
'ARCHIVE/LM/LM_CSM_ADJUSTMENTS_ITEM/',
|
||||
'ARCHIVE/LM/LM_CSM_ADJUSTMENTS_ITEM_HEADER/',
|
||||
'ARCHIVE/LM/LM_STANDING_FACILITIES/',
|
||||
'ARCHIVE/LM/LM_STANDING_FACILITIES_HEADER/',
|
||||
'ARCHIVE/LM/LM_CURRENT_ACCOUNTS_HEADER/',
|
||||
'ARCHIVE/LM/LM_CURRENT_ACCOUNTS_ITEM/',
|
||||
'ARCHIVE/LM/LM_FORECAST_HEADER/',
|
||||
'ARCHIVE/LM/LM_FORECAST_ITEM/',
|
||||
'ARCHIVE/LM/LM_QRE_ADJUSTMENTS_HEADER/',
|
||||
'ARCHIVE/LM/LM_QRE_ADJUSTMENTS_ITEM/',
|
||||
'ARCHIVE/LM/LM_QRE_ADJUSTMENTS_ITEM_HEADER/',
|
||||
'ARCHIVE/LM/LM_TTS_HEADER/',
|
||||
'ARCHIVE/LM/LM_TTS_ITEM/'
|
||||
);
|
||||
|
||||
vTables := t_table_list(
|
||||
'ADHOC_ADJ_HEADER',
|
||||
'ADHOC_ADJ_ITEM',
|
||||
'ADHOC_ADJ_ITEM_HEADER',
|
||||
'BALANCESHEET_HEADER',
|
||||
'BALANCESHEET_ITEM',
|
||||
'CSM_ADJ_HEADER',
|
||||
'CSM_ADJ_ITEM',
|
||||
'CSM_ADJ_ITEM_HEADER',
|
||||
'STANDING_FACILITY',
|
||||
'STANDING_FACILITY_HEADER',
|
||||
'MRR_IND_CURRENT_ACCOUNT_HEADER',
|
||||
'MRR_IND_CURRENT_ACCOUNT_ITEM',
|
||||
'FORECAST_HEADER',
|
||||
'FORECAST_ITEM',
|
||||
'QR_ADJ_HEADER',
|
||||
'QR_ADJ_ITEM',
|
||||
'QR_ADJ_ITEM_HEADER',
|
||||
'TTS_HEADER',
|
||||
'TTS_ITEM'
|
||||
);
|
||||
|
||||
-- Check each folder
|
||||
FOR i IN 1..vFolders.COUNT LOOP
|
||||
vFileCount := 0;
|
||||
vFolderSize := 0;
|
||||
|
||||
-- List all Parquet files in the folder
|
||||
FOR rec IN (
|
||||
SELECT object_name, bytes
|
||||
FROM TABLE(DBMS_CLOUD.LIST_OBJECTS(
|
||||
credential_name => vCredentialName,
|
||||
location_uri => vBucketUri || vFolders(i)
|
||||
))
|
||||
WHERE object_name LIKE '%.parquet'
|
||||
ORDER BY object_name
|
||||
) LOOP
|
||||
vFileCount := vFileCount + 1;
|
||||
vFolderSize := vFolderSize + rec.bytes;
|
||||
END LOOP;
|
||||
|
||||
IF vFileCount > 0 THEN
|
||||
DBMS_OUTPUT.PUT_LINE('[OK] ' || RPAD(vTables(i), 35) || ' : ' ||
|
||||
LPAD(vFileCount, 5) || ' files, ' ||
|
||||
LPAD(ROUND(vFolderSize/1024/1024, 2), 10) || ' MB');
|
||||
vTotalFiles := vTotalFiles + vFileCount;
|
||||
vTotalSize := vTotalSize + vFolderSize;
|
||||
ELSE
|
||||
DBMS_OUTPUT.PUT_LINE('[MISSING] ' || vTables(i) || ' - NO FILES FOUND!');
|
||||
END IF;
|
||||
END LOOP;
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||
DBMS_OUTPUT.PUT_LINE('VERIFICATION SUMMARY:');
|
||||
DBMS_OUTPUT.PUT_LINE(' Total tables exported: ' || vTables.COUNT);
|
||||
DBMS_OUTPUT.PUT_LINE(' Total files created: ' || vTotalFiles);
|
||||
DBMS_OUTPUT.PUT_LINE(' Total export size: ' || ROUND(vTotalSize/1024/1024/1024, 2) || ' GB');
|
||||
|
||||
IF vTotalFiles = 0 THEN
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
DBMS_OUTPUT.PUT_LINE('ERROR: No export files found! Export may have failed.');
|
||||
RAISE_APPLICATION_ERROR(-20001, 'Export verification failed - no files found');
|
||||
ELSE
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
DBMS_OUTPUT.PUT_LINE('STATUS: Export verification SUCCESSFUL');
|
||||
END IF;
|
||||
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
DBMS_OUTPUT.PUT_LINE('VERIFICATION ERROR: ' || SQLERRM);
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
@@ -0,0 +1,144 @@
|
||||
-- =====================================================================================
|
||||
-- Script: 10_MARS_826_verify_record_counts.sql
|
||||
-- Purpose: Compare source table record counts with archive table counts in ODS
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Created: 2025-12-02
|
||||
-- Updated: 2025-12-15
|
||||
-- MARS Issue: MARS-826
|
||||
-- Note: Validates export process by comparing source vs archive record counts
|
||||
-- =====================================================================================
|
||||
|
||||
SET SERVEROUTPUT ON SIZE UNLIMITED;
|
||||
SET FEEDBACK ON;
|
||||
SET VERIFY OFF;
|
||||
SET LINESIZE 200;
|
||||
|
||||
PROMPT =====================================================================================
|
||||
PROMPT MARS-826 Record Count Verification: Source vs Archive Tables
|
||||
PROMPT =====================================================================================
|
||||
|
||||
DECLARE
|
||||
vSourceCount NUMBER;
|
||||
vArchiveCount NUMBER;
|
||||
vTotalSourceRecords NUMBER := 0;
|
||||
vTotalArchiveRecords NUMBER := 0;
|
||||
vTableName VARCHAR2(100);
|
||||
vSchemaName VARCHAR2(30);
|
||||
vArchiveTableName VARCHAR2(100);
|
||||
|
||||
TYPE t_table_rec IS RECORD (
|
||||
schema_name VARCHAR2(30),
|
||||
table_name VARCHAR2(100),
|
||||
display_name VARCHAR2(100),
|
||||
archive_table_name VARCHAR2(100)
|
||||
);
|
||||
TYPE t_table_list IS TABLE OF t_table_rec;
|
||||
vTables t_table_list;
|
||||
BEGIN
|
||||
DBMS_OUTPUT.PUT_LINE('VERIFICATION TIME: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3'));
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
DBMS_OUTPUT.PUT_LINE(RPAD('TABLE NAME', 40) || RPAD('SCHEMA', 12) || LPAD('SOURCE COUNT', 15) || LPAD('ARCHIVE COUNT', 15) || LPAD('DIFF', 10) || ' STATUS');
|
||||
DBMS_OUTPUT.PUT_LINE(RPAD('-', 40, '-') || RPAD('-', 12, '-') || LPAD('-', 15, '-') || LPAD('-', 15, '-') || LPAD('-', 10, '-') || ' ------');
|
||||
|
||||
-- Initialize table list with schema, table names, and corresponding archive tables
|
||||
vTables := t_table_list(
|
||||
t_table_rec('OU_LM', 'LEGACY_ADHOC_ADJ_HEADER', 'LEGACY_ADHOC_ADJ_HEADER', 'LM_ADHOC_ADJUSTMENTS_HEADER_ARCHIVE'),
|
||||
t_table_rec('OU_LM', 'LEGACY_ADHOC_ADJ_ITEM', 'LEGACY_ADHOC_ADJ_ITEM', 'LM_ADHOC_ADJUSTMENTS_ITEM_ARCHIVE'),
|
||||
t_table_rec('OU_LM', 'LEGACY_ADHOC_ADJ_ITEM_HEADER', 'LEGACY_ADHOC_ADJ_ITEM_HEADER', 'LM_ADHOC_ADJUSTMENTS_ITEM_HEADER_ARCHIVE'),
|
||||
t_table_rec('OU_LM', 'LEGACY_BALANCESHEET_HEADER', 'LEGACY_BALANCESHEET_HEADER', 'LM_BALANCESHEET_HEADER_ARCHIVE'),
|
||||
t_table_rec('OU_LM', 'LEGACY_BALANCESHEET_ITEM', 'LEGACY_BALANCESHEET_ITEM', 'LM_BALANCESHEET_ITEM_ARCHIVE'),
|
||||
t_table_rec('OU_LM', 'LEGACY_CSM_ADJ_HEADER', 'LEGACY_CSM_ADJ_HEADER', 'LM_CSM_ADJUSTMENTS_HEADER_ARCHIVE'),
|
||||
t_table_rec('OU_LM', 'LEGACY_CSM_ADJ_ITEM', 'LEGACY_CSM_ADJ_ITEM', 'LM_CSM_ADJUSTMENTS_ITEM_ARCHIVE'),
|
||||
t_table_rec('OU_LM', 'LEGACY_CSM_ADJ_ITEM_HEADER', 'LEGACY_CSM_ADJ_ITEM_HEADER', 'LM_CSM_ADJUSTMENTS_ITEM_HEADER_ARCHIVE'),
|
||||
t_table_rec('OU_LM', 'LEGACY_STANDING_FACILITY', 'LEGACY_STANDING_FACILITY', 'LM_STANDING_FACILITIES_ARCHIVE'),
|
||||
t_table_rec('OU_LM', 'LEGACY_STANDING_FACILITY_HEADER', 'LEGACY_STANDING_FACILITY_HEADER', 'LM_STANDING_FACILITIES_HEADER_ARCHIVE'),
|
||||
t_table_rec('OU_MRR', 'LEGACY_MRR_IND_CURRENT_ACCOUNT_HEADER', 'LEGACY_MRR_IND_CURRENT_ACCOUNT_HEADER', 'LM_CURRENT_ACCOUNTS_HEADER_ARCHIVE'),
|
||||
t_table_rec('OU_MRR', 'LEGACY_MRR_IND_CURRENT_ACCOUNT_ITEM', 'LEGACY_MRR_IND_CURRENT_ACCOUNT_ITEM', 'LM_CURRENT_ACCOUNTS_ITEM_ARCHIVE'),
|
||||
t_table_rec('OU_LM', 'LEGACY_FORECAST_HEADER', 'LEGACY_FORECAST_HEADER', 'LM_FORECAST_HEADER_ARCHIVE'),
|
||||
t_table_rec('OU_LM', 'LEGACY_FORECAST_ITEM', 'LEGACY_FORECAST_ITEM', 'LM_FORECAST_ITEM_ARCHIVE'),
|
||||
t_table_rec('OU_LM', 'LEGACY_QR_ADJ_HEADER', 'LEGACY_QR_ADJ_HEADER', 'LM_QRE_ADJUSTMENTS_HEADER_ARCHIVE'),
|
||||
t_table_rec('OU_LM', 'LEGACY_QR_ADJ_ITEM', 'LEGACY_QR_ADJ_ITEM', 'LM_QRE_ADJUSTMENTS_ITEM_ARCHIVE'),
|
||||
t_table_rec('OU_LM', 'LEGACY_QR_ADJ_ITEM_HEADER', 'LEGACY_QR_ADJ_ITEM_HEADER', 'LM_QRE_ADJUSTMENTS_ITEM_HEADER_ARCHIVE'),
|
||||
t_table_rec('OU_LM', 'LEGACY_TTS_HEADER', 'LEGACY_TTS_HEADER', 'LM_TTS_HEADER_ARCHIVE'),
|
||||
t_table_rec('OU_LM', 'LEGACY_TTS_ITEM', 'LEGACY_TTS_ITEM', 'LM_TTS_ITEM_ARCHIVE')
|
||||
);
|
||||
|
||||
-- Query each table for record count comparison
|
||||
FOR i IN 1..vTables.COUNT LOOP
|
||||
BEGIN
|
||||
-- Get source table count
|
||||
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || vTables(i).schema_name || '.' || vTables(i).table_name
|
||||
INTO vSourceCount;
|
||||
|
||||
-- Get archive table count
|
||||
BEGIN
|
||||
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ODS.' || vTables(i).archive_table_name
|
||||
INTO vArchiveCount;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
vArchiveCount := -1; -- Mark as archive error
|
||||
END;
|
||||
|
||||
-- Display comparison
|
||||
DBMS_OUTPUT.PUT_LINE(
|
||||
RPAD(vTables(i).display_name, 40) ||
|
||||
RPAD(vTables(i).schema_name, 12) ||
|
||||
LPAD(TO_CHAR(vSourceCount), 15) ||
|
||||
LPAD(CASE WHEN vArchiveCount = -1 THEN 'ERROR' ELSE TO_CHAR(vArchiveCount) END, 15) ||
|
||||
LPAD(CASE WHEN vArchiveCount = -1 THEN 'N/A' ELSE TO_CHAR(vSourceCount - vArchiveCount) END, 10) ||
|
||||
' ' || CASE
|
||||
WHEN vArchiveCount = -1 THEN 'ARCH_ERROR'
|
||||
WHEN vSourceCount = vArchiveCount THEN 'MATCH'
|
||||
WHEN vSourceCount > vArchiveCount THEN 'SOURCE_HIGHER'
|
||||
ELSE 'ARCHIVE_HIGHER'
|
||||
END
|
||||
);
|
||||
|
||||
vTotalSourceRecords := vTotalSourceRecords + vSourceCount;
|
||||
IF vArchiveCount > 0 THEN
|
||||
vTotalArchiveRecords := vTotalArchiveRecords + vArchiveCount;
|
||||
END IF;
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE(
|
||||
RPAD(vTables(i).display_name, 40) ||
|
||||
RPAD(vTables(i).schema_name, 12) ||
|
||||
LPAD('ERROR', 15) ||
|
||||
LPAD('ERROR', 15) ||
|
||||
LPAD('N/A', 10) ||
|
||||
' SOURCE_ERROR'
|
||||
);
|
||||
END;
|
||||
END LOOP;
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||
DBMS_OUTPUT.PUT_LINE('RECORD COUNT SUMMARY:');
|
||||
DBMS_OUTPUT.PUT_LINE(' Total tables compared: ' || vTables.COUNT);
|
||||
DBMS_OUTPUT.PUT_LINE(' Total source records: ' || TO_CHAR(vTotalSourceRecords));
|
||||
DBMS_OUTPUT.PUT_LINE(' Total archive records: ' || TO_CHAR(vTotalArchiveRecords));
|
||||
DBMS_OUTPUT.PUT_LINE(' Total difference: ' || TO_CHAR(vTotalSourceRecords - vTotalArchiveRecords));
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
IF vTotalSourceRecords = vTotalArchiveRecords THEN
|
||||
DBMS_OUTPUT.PUT_LINE('VALIDATION RESULT: PASS - Source and Archive record counts match perfectly');
|
||||
ELSE
|
||||
DBMS_OUTPUT.PUT_LINE('VALIDATION RESULT: REVIEW - Source and Archive record counts differ');
|
||||
DBMS_OUTPUT.PUT_LINE(' Check individual table statuses above for detailed analysis');
|
||||
END IF;
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
DBMS_OUTPUT.PUT_LINE('LEGEND:');
|
||||
DBMS_OUTPUT.PUT_LINE(' MATCH - Source and Archive counts are identical');
|
||||
DBMS_OUTPUT.PUT_LINE(' SOURCE_HIGHER - Source has more records than Archive');
|
||||
DBMS_OUTPUT.PUT_LINE(' ARCHIVE_HIGHER - Archive has more records than Source');
|
||||
DBMS_OUTPUT.PUT_LINE(' ARCH_ERROR - Archive table access error');
|
||||
DBMS_OUTPUT.PUT_LINE(' SOURCE_ERROR - Source table access error');
|
||||
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
DBMS_OUTPUT.PUT_LINE('VERIFICATION ERROR: ' || SQLERRM);
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
@@ -0,0 +1,98 @@
|
||||
-- =====================================================================================
|
||||
-- Script: 91_MARS_826_rollback_ADHOC_ADJ_tables.sql
|
||||
-- Purpose: Rollback ADHOC_ADJ tables export - delete files from HIST bucket
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Created: 2025-12-02
|
||||
-- MARS Issue: MARS-826
|
||||
-- Target Tables:
|
||||
-- - OU_LM.ADHOC_ADJ_HEADER (~1 records)
|
||||
-- - OU_LM.ADHOC_ADJ_ITEM (~104 records)
|
||||
-- - OU_LM.ADHOC_ADJ_ITEM_HEADER (~104 records)
|
||||
-- Target Location: mrds_hist_dev/ARCHIVE/LM/LM_ADHOC_ADJUSTMENTS_*
|
||||
-- =====================================================================================
|
||||
|
||||
SET SERVEROUTPUT ON SIZE UNLIMITED;
|
||||
SET FEEDBACK ON;
|
||||
SET VERIFY OFF;
|
||||
|
||||
PROMPT =====================================================================================
|
||||
PROMPT MARS-826 Rollback: Deleting ADHOC_ADJ table exports from HIST bucket
|
||||
PROMPT =====================================================================================
|
||||
|
||||
DECLARE
|
||||
vBucketUri VARCHAR2(500);
|
||||
vCredentialName VARCHAR2(100);
|
||||
vFileCount NUMBER := 0;
|
||||
vDeletedCount NUMBER := 0;
|
||||
vTotalDeleted NUMBER := 0;
|
||||
|
||||
TYPE t_folder_list IS TABLE OF VARCHAR2(200);
|
||||
vFolders t_folder_list;
|
||||
BEGIN
|
||||
-- Get bucket URI and credential from FILE_MANAGER configuration
|
||||
vBucketUri := CT_MRDS.FILE_MANAGER.GET_BUCKET_URI('ARCHIVE');
|
||||
vCredentialName := CT_MRDS.ENV_MANAGER.gvCredentialName;
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('START TIME: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3'));
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
|
||||
-- Initialize folder list for ADHOC_ADJ tables
|
||||
vFolders := t_folder_list(
|
||||
'ARCHIVE/LM/LM_ADHOC_ADJUSTMENTS_HEADER/',
|
||||
'ARCHIVE/LM/LM_ADHOC_ADJUSTMENTS_ITEM/',
|
||||
'ARCHIVE/LM/LM_ADHOC_ADJUSTMENTS_ITEM_HEADER/'
|
||||
);
|
||||
|
||||
-- Process each folder
|
||||
FOR i IN 1..vFolders.COUNT LOOP
|
||||
DBMS_OUTPUT.PUT_LINE('Processing folder: ' || vFolders(i));
|
||||
vFileCount := 0;
|
||||
vDeletedCount := 0;
|
||||
|
||||
-- List and delete all Parquet files in the folder
|
||||
FOR rec IN (
|
||||
SELECT object_name
|
||||
FROM TABLE(DBMS_CLOUD.LIST_OBJECTS(
|
||||
credential_name => vCredentialName,
|
||||
location_uri => vBucketUri || vFolders(i)
|
||||
))
|
||||
WHERE object_name LIKE '%.parquet'
|
||||
ORDER BY object_name
|
||||
) LOOP
|
||||
vFileCount := vFileCount + 1;
|
||||
|
||||
BEGIN
|
||||
-- Delete the Parquet file
|
||||
DBMS_CLOUD.DELETE_OBJECT(
|
||||
credential_name => vCredentialName,
|
||||
object_uri => vBucketUri || vFolders(i) || rec.object_name
|
||||
);
|
||||
|
||||
vDeletedCount := vDeletedCount + 1;
|
||||
DBMS_OUTPUT.PUT_LINE(' [' || vDeletedCount || '] Deleted: ' || rec.object_name);
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE(' ERROR deleting ' || rec.object_name || ': ' || SQLERRM);
|
||||
END;
|
||||
END LOOP;
|
||||
|
||||
vTotalDeleted := vTotalDeleted + vDeletedCount;
|
||||
DBMS_OUTPUT.PUT_LINE('Folder summary: Found ' || vFileCount || ' files, deleted ' || vDeletedCount || ' files');
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
|
||||
END LOOP;
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||
DBMS_OUTPUT.PUT_LINE('ROLLBACK COMPLETE: Total files deleted: ' || vTotalDeleted);
|
||||
DBMS_OUTPUT.PUT_LINE('END TIME: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3'));
|
||||
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
DBMS_OUTPUT.PUT_LINE('FATAL ERROR: ' || SQLERRM);
|
||||
DBMS_OUTPUT.PUT_LINE('Error occurred at: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3'));
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
@@ -0,0 +1,96 @@
|
||||
-- =====================================================================================
|
||||
-- Script: 92_MARS_826_rollback_BALANCESHEET_tables.sql
|
||||
-- Purpose: Rollback BALANCESHEET tables export - delete files from HIST bucket
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Created: 2025-12-02
|
||||
-- MARS Issue: MARS-826
|
||||
-- Target Tables:
|
||||
-- - OU_LM.BALANCESHEET_HEADER (~133,816 records)
|
||||
-- - OU_LM.BALANCESHEET_ITEM (~7,653,012 records) - LARGE TABLE
|
||||
-- Target Location: mrds_hist_dev/ARCHIVE/LM/LM_BALANCESHEET_*
|
||||
-- =====================================================================================
|
||||
|
||||
SET SERVEROUTPUT ON SIZE UNLIMITED;
|
||||
SET FEEDBACK ON;
|
||||
SET VERIFY OFF;
|
||||
|
||||
PROMPT =====================================================================================
|
||||
PROMPT MARS-826 Rollback: Deleting BALANCESHEET table exports from HIST bucket
|
||||
PROMPT =====================================================================================
|
||||
|
||||
DECLARE
|
||||
vBucketUri VARCHAR2(500);
|
||||
vCredentialName VARCHAR2(100);
|
||||
vFileCount NUMBER := 0;
|
||||
vDeletedCount NUMBER := 0;
|
||||
vTotalDeleted NUMBER := 0;
|
||||
|
||||
TYPE t_folder_list IS TABLE OF VARCHAR2(200);
|
||||
vFolders t_folder_list;
|
||||
BEGIN
|
||||
-- Get bucket URI and credential from FILE_MANAGER configuration
|
||||
vBucketUri := CT_MRDS.FILE_MANAGER.GET_BUCKET_URI('ARCHIVE');
|
||||
vCredentialName := CT_MRDS.ENV_MANAGER.gvCredentialName;
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('START TIME: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3'));
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
|
||||
-- Initialize folder list for BALANCESHEET tables
|
||||
vFolders := t_folder_list(
|
||||
'ARCHIVE/LM/LM_BALANCESHEET_HEADER/',
|
||||
'ARCHIVE/LM/LM_BALANCESHEET_ITEM/'
|
||||
);
|
||||
|
||||
-- Process each folder
|
||||
FOR i IN 1..vFolders.COUNT LOOP
|
||||
DBMS_OUTPUT.PUT_LINE('Processing folder: ' || vFolders(i));
|
||||
vFileCount := 0;
|
||||
vDeletedCount := 0;
|
||||
|
||||
-- List and delete all Parquet files in the folder
|
||||
FOR rec IN (
|
||||
SELECT object_name
|
||||
FROM TABLE(DBMS_CLOUD.LIST_OBJECTS(
|
||||
credential_name => vCredentialName,
|
||||
location_uri => vBucketUri || vFolders(i)
|
||||
))
|
||||
WHERE object_name LIKE '%.parquet'
|
||||
ORDER BY object_name
|
||||
) LOOP
|
||||
vFileCount := vFileCount + 1;
|
||||
|
||||
BEGIN
|
||||
-- Delete the Parquet file
|
||||
DBMS_CLOUD.DELETE_OBJECT(
|
||||
credential_name => vCredentialName,
|
||||
object_uri => vBucketUri || vFolders(i) || rec.object_name
|
||||
);
|
||||
|
||||
vDeletedCount := vDeletedCount + 1;
|
||||
DBMS_OUTPUT.PUT_LINE(' [' || vDeletedCount || '] Deleted: ' || rec.object_name);
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE(' ERROR deleting ' || rec.object_name || ': ' || SQLERRM);
|
||||
END;
|
||||
END LOOP;
|
||||
|
||||
vTotalDeleted := vTotalDeleted + vDeletedCount;
|
||||
DBMS_OUTPUT.PUT_LINE('Folder summary: Found ' || vFileCount || ' files, deleted ' || vDeletedCount || ' files');
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
|
||||
END LOOP;
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||
DBMS_OUTPUT.PUT_LINE('ROLLBACK COMPLETE: Total files deleted: ' || vTotalDeleted);
|
||||
DBMS_OUTPUT.PUT_LINE('END TIME: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3'));
|
||||
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
DBMS_OUTPUT.PUT_LINE('FATAL ERROR: ' || SQLERRM);
|
||||
DBMS_OUTPUT.PUT_LINE('Error occurred at: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3'));
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
@@ -0,0 +1,98 @@
|
||||
-- =====================================================================================
|
||||
-- Script: 93_MARS_826_rollback_CSM_ADJ_tables.sql
|
||||
-- Purpose: Rollback CSM_ADJ tables export - delete files from HIST bucket
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Created: 2025-12-02
|
||||
-- MARS Issue: MARS-826
|
||||
-- Target Tables:
|
||||
-- - OU_LM.CSM_ADJ_HEADER (~388 records)
|
||||
-- - OU_LM.CSM_ADJ_ITEM (~3,980 records)
|
||||
-- - OU_LM.CSM_ADJ_ITEM_HEADER (~3,388 records)
|
||||
-- Target Location: mrds_hist_dev/ARCHIVE/LM/LM_CSM_ADJUSTMENTS_*
|
||||
-- =====================================================================================
|
||||
|
||||
SET SERVEROUTPUT ON SIZE UNLIMITED;
|
||||
SET FEEDBACK ON;
|
||||
SET VERIFY OFF;
|
||||
|
||||
PROMPT =====================================================================================
|
||||
PROMPT MARS-826 Rollback: Deleting CSM_ADJ table exports from HIST bucket
|
||||
PROMPT =====================================================================================
|
||||
|
||||
DECLARE
|
||||
vBucketUri VARCHAR2(500);
|
||||
vCredentialName VARCHAR2(100);
|
||||
vFileCount NUMBER := 0;
|
||||
vDeletedCount NUMBER := 0;
|
||||
vTotalDeleted NUMBER := 0;
|
||||
|
||||
TYPE t_folder_list IS TABLE OF VARCHAR2(200);
|
||||
vFolders t_folder_list;
|
||||
BEGIN
|
||||
-- Get bucket URI and credential from FILE_MANAGER configuration
|
||||
vBucketUri := CT_MRDS.FILE_MANAGER.GET_BUCKET_URI('ARCHIVE');
|
||||
vCredentialName := CT_MRDS.ENV_MANAGER.gvCredentialName;
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('START TIME: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3'));
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
|
||||
-- Initialize folder list for CSM_ADJ tables
|
||||
vFolders := t_folder_list(
|
||||
'ARCHIVE/LM/LM_CSM_ADJUSTMENTS_HEADER/',
|
||||
'ARCHIVE/LM/LM_CSM_ADJUSTMENTS_ITEM/',
|
||||
'ARCHIVE/LM/LM_CSM_ADJUSTMENTS_ITEM_HEADER/'
|
||||
);
|
||||
|
||||
-- Process each folder
|
||||
FOR i IN 1..vFolders.COUNT LOOP
|
||||
DBMS_OUTPUT.PUT_LINE('Processing folder: ' || vFolders(i));
|
||||
vFileCount := 0;
|
||||
vDeletedCount := 0;
|
||||
|
||||
-- List and delete all Parquet files in the folder
|
||||
FOR rec IN (
|
||||
SELECT object_name
|
||||
FROM TABLE(DBMS_CLOUD.LIST_OBJECTS(
|
||||
credential_name => vCredentialName,
|
||||
location_uri => vBucketUri || vFolders(i)
|
||||
))
|
||||
WHERE object_name LIKE '%.parquet'
|
||||
ORDER BY object_name
|
||||
) LOOP
|
||||
vFileCount := vFileCount + 1;
|
||||
|
||||
BEGIN
|
||||
-- Delete the Parquet file
|
||||
DBMS_CLOUD.DELETE_OBJECT(
|
||||
credential_name => vCredentialName,
|
||||
object_uri => vBucketUri || vFolders(i) || rec.object_name
|
||||
);
|
||||
|
||||
vDeletedCount := vDeletedCount + 1;
|
||||
DBMS_OUTPUT.PUT_LINE(' [' || vDeletedCount || '] Deleted: ' || rec.object_name);
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE(' ERROR deleting ' || rec.object_name || ': ' || SQLERRM);
|
||||
END;
|
||||
END LOOP;
|
||||
|
||||
vTotalDeleted := vTotalDeleted + vDeletedCount;
|
||||
DBMS_OUTPUT.PUT_LINE('Folder summary: Found ' || vFileCount || ' files, deleted ' || vDeletedCount || ' files');
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
|
||||
END LOOP;
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||
DBMS_OUTPUT.PUT_LINE('ROLLBACK COMPLETE: Total files deleted: ' || vTotalDeleted);
|
||||
DBMS_OUTPUT.PUT_LINE('END TIME: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3'));
|
||||
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
DBMS_OUTPUT.PUT_LINE('FATAL ERROR: ' || SQLERRM);
|
||||
DBMS_OUTPUT.PUT_LINE('Error occurred at: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3'));
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
@@ -0,0 +1,96 @@
|
||||
-- =====================================================================================
|
||||
-- Script: 94_MARS_826_rollback_STANDING_FACILITY_tables.sql
|
||||
-- Purpose: Rollback STANDING_FACILITY tables export - delete files from HIST bucket
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Created: 2025-12-02
|
||||
-- MARS Issue: MARS-826
|
||||
-- Target Tables:
|
||||
-- - OU_LM.STANDING_FACILITY (~1,258,920 records)
|
||||
-- - OU_LM.STANDING_FACILITY_HEADER (~62,946 records)
|
||||
-- Target Location: mrds_hist_dev/ARCHIVE/LM/LM_STANDING_FACILITIES*
|
||||
-- =====================================================================================
|
||||
|
||||
SET SERVEROUTPUT ON SIZE UNLIMITED;
|
||||
SET FEEDBACK ON;
|
||||
SET VERIFY OFF;
|
||||
|
||||
PROMPT =====================================================================================
|
||||
PROMPT MARS-826 Rollback: Deleting STANDING_FACILITY table exports from HIST bucket
|
||||
PROMPT =====================================================================================
|
||||
|
||||
DECLARE
|
||||
vBucketUri VARCHAR2(500);
|
||||
vCredentialName VARCHAR2(100);
|
||||
vFileCount NUMBER := 0;
|
||||
vDeletedCount NUMBER := 0;
|
||||
vTotalDeleted NUMBER := 0;
|
||||
|
||||
TYPE t_folder_list IS TABLE OF VARCHAR2(200);
|
||||
vFolders t_folder_list;
|
||||
BEGIN
|
||||
-- Get bucket URI and credential from FILE_MANAGER configuration
|
||||
vBucketUri := CT_MRDS.FILE_MANAGER.GET_BUCKET_URI('ARCHIVE');
|
||||
vCredentialName := CT_MRDS.ENV_MANAGER.gvCredentialName;
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('START TIME: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3'));
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
|
||||
-- Initialize folder list for STANDING_FACILITY tables
|
||||
vFolders := t_folder_list(
|
||||
'ARCHIVE/LM/LM_STANDING_FACILITIES/',
|
||||
'ARCHIVE/LM/LM_STANDING_FACILITIES_HEADER/'
|
||||
);
|
||||
|
||||
-- Process each folder
|
||||
FOR i IN 1..vFolders.COUNT LOOP
|
||||
DBMS_OUTPUT.PUT_LINE('Processing folder: ' || vFolders(i));
|
||||
vFileCount := 0;
|
||||
vDeletedCount := 0;
|
||||
|
||||
-- List and delete all Parquet files in the folder
|
||||
FOR rec IN (
|
||||
SELECT object_name
|
||||
FROM TABLE(DBMS_CLOUD.LIST_OBJECTS(
|
||||
credential_name => vCredentialName,
|
||||
location_uri => vBucketUri || vFolders(i)
|
||||
))
|
||||
WHERE object_name LIKE '%.parquet'
|
||||
ORDER BY object_name
|
||||
) LOOP
|
||||
vFileCount := vFileCount + 1;
|
||||
|
||||
BEGIN
|
||||
-- Delete the Parquet file
|
||||
DBMS_CLOUD.DELETE_OBJECT(
|
||||
credential_name => vCredentialName,
|
||||
object_uri => vBucketUri || vFolders(i) || rec.object_name
|
||||
);
|
||||
|
||||
vDeletedCount := vDeletedCount + 1;
|
||||
DBMS_OUTPUT.PUT_LINE(' [' || vDeletedCount || '] Deleted: ' || rec.object_name);
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE(' ERROR deleting ' || rec.object_name || ': ' || SQLERRM);
|
||||
END;
|
||||
END LOOP;
|
||||
|
||||
vTotalDeleted := vTotalDeleted + vDeletedCount;
|
||||
DBMS_OUTPUT.PUT_LINE('Folder summary: Found ' || vFileCount || ' files, deleted ' || vDeletedCount || ' files');
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
|
||||
END LOOP;
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||
DBMS_OUTPUT.PUT_LINE('ROLLBACK COMPLETE: Total files deleted: ' || vTotalDeleted);
|
||||
DBMS_OUTPUT.PUT_LINE('END TIME: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3'));
|
||||
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
DBMS_OUTPUT.PUT_LINE('FATAL ERROR: ' || SQLERRM);
|
||||
DBMS_OUTPUT.PUT_LINE('Error occurred at: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3'));
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
@@ -0,0 +1,96 @@
|
||||
-- =====================================================================================
|
||||
-- Script: 95_MARS_826_rollback_MRR_IND_CURR_ACC_tables.sql
|
||||
-- Purpose: Rollback MRR_IND_CURR_ACC table exports by deleting Parquet files from HIST bucket
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Created: 2025-12-02
|
||||
-- MARS Issue: MARS-826
|
||||
-- Target Tables:
|
||||
-- - OU_MRR.MRR_IND_CURRENT_ACCOUNT_HEADER (~16,696 records)
|
||||
-- - OU_MRR.MRR_IND_CURRENT_ACCOUNT_ITEM (~350,632 records)
|
||||
-- Target Location: mrds_hist_dev/ARCHIVE/LM/LM_CURRENT_ACCOUNTS_*
|
||||
-- =====================================================================================
|
||||
|
||||
SET SERVEROUTPUT ON SIZE UNLIMITED;
|
||||
SET FEEDBACK ON;
|
||||
SET VERIFY OFF;
|
||||
|
||||
PROMPT =====================================================================================
|
||||
PROMPT MARS-826 Rollback: Deleting MRR_IND_CURR_ACC table exports from HIST bucket
|
||||
PROMPT =====================================================================================
|
||||
|
||||
DECLARE
|
||||
vBucketUri VARCHAR2(500);
|
||||
vCredentialName VARCHAR2(100);
|
||||
vFileCount NUMBER := 0;
|
||||
vDeletedCount NUMBER := 0;
|
||||
vTotalDeleted NUMBER := 0;
|
||||
|
||||
TYPE t_folder_list IS TABLE OF VARCHAR2(200);
|
||||
vFolders t_folder_list;
|
||||
BEGIN
|
||||
-- Get bucket URI and credential from FILE_MANAGER configuration
|
||||
vBucketUri := CT_MRDS.FILE_MANAGER.GET_BUCKET_URI('ARCHIVE');
|
||||
vCredentialName := CT_MRDS.ENV_MANAGER.gvCredentialName;
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('START TIME: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3'));
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
|
||||
-- Initialize folder list for MRR_IND_CURR_ACC tables (OU_MRR schema)
|
||||
vFolders := t_folder_list(
|
||||
'ARCHIVE/LM/LM_CURRENT_ACCOUNTS_HEADER/',
|
||||
'ARCHIVE/LM/LM_CURRENT_ACCOUNTS_ITEM/'
|
||||
);
|
||||
|
||||
-- Process each folder
|
||||
FOR i IN 1..vFolders.COUNT LOOP
|
||||
DBMS_OUTPUT.PUT_LINE('Processing folder: ' || vFolders(i));
|
||||
vFileCount := 0;
|
||||
vDeletedCount := 0;
|
||||
|
||||
-- List and delete all Parquet files in the folder
|
||||
FOR rec IN (
|
||||
SELECT object_name
|
||||
FROM TABLE(DBMS_CLOUD.LIST_OBJECTS(
|
||||
credential_name => vCredentialName,
|
||||
location_uri => vBucketUri || vFolders(i)
|
||||
))
|
||||
WHERE object_name LIKE '%.parquet'
|
||||
ORDER BY object_name
|
||||
) LOOP
|
||||
vFileCount := vFileCount + 1;
|
||||
|
||||
BEGIN
|
||||
-- Delete the Parquet file
|
||||
DBMS_CLOUD.DELETE_OBJECT(
|
||||
credential_name => vCredentialName,
|
||||
object_uri => vBucketUri || vFolders(i) || rec.object_name
|
||||
);
|
||||
|
||||
vDeletedCount := vDeletedCount + 1;
|
||||
DBMS_OUTPUT.PUT_LINE(' [' || vDeletedCount || '] Deleted: ' || rec.object_name);
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE(' ERROR deleting ' || rec.object_name || ': ' || SQLERRM);
|
||||
END;
|
||||
END LOOP;
|
||||
|
||||
vTotalDeleted := vTotalDeleted + vDeletedCount;
|
||||
DBMS_OUTPUT.PUT_LINE('Folder summary: Found ' || vFileCount || ' files, deleted ' || vDeletedCount || ' files');
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
|
||||
END LOOP;
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||
DBMS_OUTPUT.PUT_LINE('ROLLBACK COMPLETE: Total files deleted: ' || vTotalDeleted);
|
||||
DBMS_OUTPUT.PUT_LINE('END TIME: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3'));
|
||||
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
DBMS_OUTPUT.PUT_LINE('FATAL ERROR: ' || SQLERRM);
|
||||
DBMS_OUTPUT.PUT_LINE('Error occurred at: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3'));
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
@@ -0,0 +1,96 @@
|
||||
-- =====================================================================================
|
||||
-- Script: 96_MARS_826_rollback_FORECAST_tables.sql
|
||||
-- Purpose: Rollback FORECAST tables export - delete files from HIST bucket
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Created: 2025-12-02
|
||||
-- MARS Issue: MARS-826
|
||||
-- Target Tables:
|
||||
-- - OU_LM.FORECAST_HEADER (~72,932 records)
|
||||
-- - OU_LM.FORECAST_ITEM (~21,679,568 records) - LARGEST TABLE
|
||||
-- Target Location: mrds_hist_dev/ARCHIVE/LM/LM_FORECAST_*
|
||||
-- =====================================================================================
|
||||
|
||||
SET SERVEROUTPUT ON SIZE UNLIMITED;
|
||||
SET FEEDBACK ON;
|
||||
SET VERIFY OFF;
|
||||
|
||||
PROMPT =====================================================================================
|
||||
PROMPT MARS-826 Rollback: Deleting FORECAST table exports from HIST bucket
|
||||
PROMPT =====================================================================================
|
||||
|
||||
DECLARE
|
||||
vBucketUri VARCHAR2(500);
|
||||
vCredentialName VARCHAR2(100);
|
||||
vFileCount NUMBER := 0;
|
||||
vDeletedCount NUMBER := 0;
|
||||
vTotalDeleted NUMBER := 0;
|
||||
|
||||
TYPE t_folder_list IS TABLE OF VARCHAR2(200);
|
||||
vFolders t_folder_list;
|
||||
BEGIN
|
||||
-- Get bucket URI and credential from FILE_MANAGER configuration
|
||||
vBucketUri := CT_MRDS.FILE_MANAGER.GET_BUCKET_URI('ARCHIVE');
|
||||
vCredentialName := CT_MRDS.ENV_MANAGER.gvCredentialName;
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('START TIME: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3'));
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
|
||||
-- Initialize folder list for FORECAST tables
|
||||
vFolders := t_folder_list(
|
||||
'ARCHIVE/LM/LM_FORECAST_HEADER/',
|
||||
'ARCHIVE/LM/LM_FORECAST_ITEM/'
|
||||
);
|
||||
|
||||
-- Process each folder
|
||||
FOR i IN 1..vFolders.COUNT LOOP
|
||||
DBMS_OUTPUT.PUT_LINE('Processing folder: ' || vFolders(i));
|
||||
vFileCount := 0;
|
||||
vDeletedCount := 0;
|
||||
|
||||
-- List and delete all Parquet files in the folder
|
||||
FOR rec IN (
|
||||
SELECT object_name
|
||||
FROM TABLE(DBMS_CLOUD.LIST_OBJECTS(
|
||||
credential_name => vCredentialName,
|
||||
location_uri => vBucketUri || vFolders(i)
|
||||
))
|
||||
WHERE object_name LIKE '%.parquet'
|
||||
ORDER BY object_name
|
||||
) LOOP
|
||||
vFileCount := vFileCount + 1;
|
||||
|
||||
BEGIN
|
||||
-- Delete the Parquet file
|
||||
DBMS_CLOUD.DELETE_OBJECT(
|
||||
credential_name => vCredentialName,
|
||||
object_uri => vBucketUri || vFolders(i) || rec.object_name
|
||||
);
|
||||
|
||||
vDeletedCount := vDeletedCount + 1;
|
||||
DBMS_OUTPUT.PUT_LINE(' [' || vDeletedCount || '] Deleted: ' || rec.object_name);
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE(' ERROR deleting ' || rec.object_name || ': ' || SQLERRM);
|
||||
END;
|
||||
END LOOP;
|
||||
|
||||
vTotalDeleted := vTotalDeleted + vDeletedCount;
|
||||
DBMS_OUTPUT.PUT_LINE('Folder summary: Found ' || vFileCount || ' files, deleted ' || vDeletedCount || ' files');
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
|
||||
END LOOP;
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||
DBMS_OUTPUT.PUT_LINE('ROLLBACK COMPLETE: Total files deleted: ' || vTotalDeleted);
|
||||
DBMS_OUTPUT.PUT_LINE('END TIME: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3'));
|
||||
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
DBMS_OUTPUT.PUT_LINE('FATAL ERROR: ' || SQLERRM);
|
||||
DBMS_OUTPUT.PUT_LINE('Error occurred at: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3'));
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
@@ -0,0 +1,98 @@
|
||||
-- =====================================================================================
|
||||
-- Script: 97_MARS_826_rollback_QR_ADJ_tables.sql
|
||||
-- Purpose: Rollback QR_ADJ tables export - delete files from HIST bucket
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Created: 2025-12-02
|
||||
-- MARS Issue: MARS-826
|
||||
-- Target Tables:
|
||||
-- - OU_LM.QR_ADJ_HEADER (~3,121 records)
|
||||
-- - OU_LM.QR_ADJ_ITEM (~29,576 records)
|
||||
-- - OU_LM.QR_ADJ_ITEM_HEADER (~29,876 records)
|
||||
-- Target Location: mrds_hist_dev/ARCHIVE/LM/LM_QRE_ADJUSTMENTS_*
|
||||
-- =====================================================================================
|
||||
|
||||
SET SERVEROUTPUT ON SIZE UNLIMITED;
|
||||
SET FEEDBACK ON;
|
||||
SET VERIFY OFF;
|
||||
|
||||
PROMPT =====================================================================================
|
||||
PROMPT MARS-826 Rollback: Deleting QR_ADJ table exports from HIST bucket
|
||||
PROMPT =====================================================================================
|
||||
|
||||
DECLARE
|
||||
vBucketUri VARCHAR2(500);
|
||||
vCredentialName VARCHAR2(100);
|
||||
vFileCount NUMBER := 0;
|
||||
vDeletedCount NUMBER := 0;
|
||||
vTotalDeleted NUMBER := 0;
|
||||
|
||||
TYPE t_folder_list IS TABLE OF VARCHAR2(200);
|
||||
vFolders t_folder_list;
|
||||
BEGIN
|
||||
-- Get bucket URI and credential from FILE_MANAGER configuration
|
||||
vBucketUri := CT_MRDS.FILE_MANAGER.GET_BUCKET_URI('ARCHIVE');
|
||||
vCredentialName := CT_MRDS.ENV_MANAGER.gvCredentialName;
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('START TIME: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3'));
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
|
||||
-- Initialize folder list for QR_ADJ tables
|
||||
vFolders := t_folder_list(
|
||||
'ARCHIVE/LM/LM_QRE_ADJUSTMENTS_HEADER/',
|
||||
'ARCHIVE/LM/LM_QRE_ADJUSTMENTS_ITEM/',
|
||||
'ARCHIVE/LM/LM_QRE_ADJUSTMENTS_ITEM_HEADER/'
|
||||
);
|
||||
|
||||
-- Process each folder
|
||||
FOR i IN 1..vFolders.COUNT LOOP
|
||||
DBMS_OUTPUT.PUT_LINE('Processing folder: ' || vFolders(i));
|
||||
vFileCount := 0;
|
||||
vDeletedCount := 0;
|
||||
|
||||
-- List and delete all Parquet files in the folder
|
||||
FOR rec IN (
|
||||
SELECT object_name
|
||||
FROM TABLE(DBMS_CLOUD.LIST_OBJECTS(
|
||||
credential_name => vCredentialName,
|
||||
location_uri => vBucketUri || vFolders(i)
|
||||
))
|
||||
WHERE object_name LIKE '%.parquet'
|
||||
ORDER BY object_name
|
||||
) LOOP
|
||||
vFileCount := vFileCount + 1;
|
||||
|
||||
BEGIN
|
||||
-- Delete the Parquet file
|
||||
DBMS_CLOUD.DELETE_OBJECT(
|
||||
credential_name => vCredentialName,
|
||||
object_uri => vBucketUri || vFolders(i) || rec.object_name
|
||||
);
|
||||
|
||||
vDeletedCount := vDeletedCount + 1;
|
||||
DBMS_OUTPUT.PUT_LINE(' [' || vDeletedCount || '] Deleted: ' || rec.object_name);
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE(' ERROR deleting ' || rec.object_name || ': ' || SQLERRM);
|
||||
END;
|
||||
END LOOP;
|
||||
|
||||
vTotalDeleted := vTotalDeleted + vDeletedCount;
|
||||
DBMS_OUTPUT.PUT_LINE('Folder summary: Found ' || vFileCount || ' files, deleted ' || vDeletedCount || ' files');
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
|
||||
END LOOP;
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||
DBMS_OUTPUT.PUT_LINE('ROLLBACK COMPLETE: Total files deleted: ' || vTotalDeleted);
|
||||
DBMS_OUTPUT.PUT_LINE('END TIME: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3'));
|
||||
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
DBMS_OUTPUT.PUT_LINE('FATAL ERROR: ' || SQLERRM);
|
||||
DBMS_OUTPUT.PUT_LINE('Error occurred at: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3'));
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
@@ -0,0 +1,96 @@
|
||||
-- =====================================================================================
|
||||
-- Script: 98_MARS_826_rollback_TTS_tables.sql
|
||||
-- Purpose: Rollback TTS tables export - delete files from HIST bucket
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Created: 2025-12-02
|
||||
-- MARS Issue: MARS-826
|
||||
-- Target Tables:
|
||||
-- - OU_LM.TTS_HEADER (~56 records)
|
||||
-- - OU_LM.TTS_ITEM (~1,064 records)
|
||||
-- Target Location: mrds_hist_dev/ARCHIVE/LM/LM_TTS_*
|
||||
-- =====================================================================================
|
||||
|
||||
SET SERVEROUTPUT ON SIZE UNLIMITED;
|
||||
SET FEEDBACK ON;
|
||||
SET VERIFY OFF;
|
||||
|
||||
PROMPT =====================================================================================
|
||||
PROMPT MARS-826 Rollback: Deleting TTS table exports from HIST bucket
|
||||
PROMPT =====================================================================================
|
||||
|
||||
DECLARE
|
||||
vBucketUri VARCHAR2(500);
|
||||
vCredentialName VARCHAR2(100);
|
||||
vFileCount NUMBER := 0;
|
||||
vDeletedCount NUMBER := 0;
|
||||
vTotalDeleted NUMBER := 0;
|
||||
|
||||
TYPE t_folder_list IS TABLE OF VARCHAR2(200);
|
||||
vFolders t_folder_list;
|
||||
BEGIN
|
||||
-- Get bucket URI and credential from FILE_MANAGER configuration
|
||||
vBucketUri := CT_MRDS.FILE_MANAGER.GET_BUCKET_URI('ARCHIVE');
|
||||
vCredentialName := CT_MRDS.ENV_MANAGER.gvCredentialName;
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('START TIME: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3'));
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
|
||||
-- Initialize folder list for TTS tables
|
||||
vFolders := t_folder_list(
|
||||
'ARCHIVE/LM/LM_TTS_HEADER/',
|
||||
'ARCHIVE/LM/LM_TTS_ITEM/'
|
||||
);
|
||||
|
||||
-- Process each folder
|
||||
FOR i IN 1..vFolders.COUNT LOOP
|
||||
DBMS_OUTPUT.PUT_LINE('Processing folder: ' || vFolders(i));
|
||||
vFileCount := 0;
|
||||
vDeletedCount := 0;
|
||||
|
||||
-- List and delete all Parquet files in the folder
|
||||
FOR rec IN (
|
||||
SELECT object_name
|
||||
FROM TABLE(DBMS_CLOUD.LIST_OBJECTS(
|
||||
credential_name => vCredentialName,
|
||||
location_uri => vBucketUri || vFolders(i)
|
||||
))
|
||||
WHERE object_name LIKE '%.parquet'
|
||||
ORDER BY object_name
|
||||
) LOOP
|
||||
vFileCount := vFileCount + 1;
|
||||
|
||||
BEGIN
|
||||
-- Delete the Parquet file
|
||||
DBMS_CLOUD.DELETE_OBJECT(
|
||||
credential_name => vCredentialName,
|
||||
object_uri => vBucketUri || vFolders(i) || rec.object_name
|
||||
);
|
||||
|
||||
vDeletedCount := vDeletedCount + 1;
|
||||
DBMS_OUTPUT.PUT_LINE(' [' || vDeletedCount || '] Deleted: ' || rec.object_name);
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE(' ERROR deleting ' || rec.object_name || ': ' || SQLERRM);
|
||||
END;
|
||||
END LOOP;
|
||||
|
||||
vTotalDeleted := vTotalDeleted + vDeletedCount;
|
||||
DBMS_OUTPUT.PUT_LINE('Folder summary: Found ' || vFileCount || ' files, deleted ' || vDeletedCount || ' files');
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
|
||||
END LOOP;
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||
DBMS_OUTPUT.PUT_LINE('ROLLBACK COMPLETE: Total files deleted: ' || vTotalDeleted);
|
||||
DBMS_OUTPUT.PUT_LINE('END TIME: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3'));
|
||||
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
DBMS_OUTPUT.PUT_LINE('FATAL ERROR: ' || SQLERRM);
|
||||
DBMS_OUTPUT.PUT_LINE('Error occurred at: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3'));
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
@@ -0,0 +1,155 @@
|
||||
-- =====================================================================================
|
||||
-- Script: 99_MARS_826_verify_rollback.sql
|
||||
-- Purpose: Verify complete cleanup of MARS-826 exported files from HIST bucket
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Created: 2025-12-02
|
||||
-- Updated: 2025-12-15
|
||||
-- MARS Issue: MARS-826
|
||||
-- Target Location: mrds_hist_dev/ARCHIVE/LM/
|
||||
-- =====================================================================================
|
||||
|
||||
SET SERVEROUTPUT ON SIZE UNLIMITED;
|
||||
SET FEEDBACK ON;
|
||||
SET VERIFY OFF;
|
||||
SET LINESIZE 200;
|
||||
|
||||
PROMPT =====================================================================================
|
||||
PROMPT MARS-826 Rollback Verification: Complete Cleanup Check
|
||||
PROMPT =====================================================================================
|
||||
|
||||
DECLARE
|
||||
vBucketUri VARCHAR2(500);
|
||||
vCredentialName VARCHAR2(100);
|
||||
vFileCount NUMBER := 0;
|
||||
vTotalFiles NUMBER := 0;
|
||||
vTablesWithFiles NUMBER := 0;
|
||||
vTablesClean NUMBER := 0;
|
||||
vRollbackSuccess BOOLEAN := TRUE;
|
||||
|
||||
TYPE t_folder_list IS TABLE OF VARCHAR2(200);
|
||||
vFolders t_folder_list;
|
||||
|
||||
TYPE t_table_list IS TABLE OF VARCHAR2(100);
|
||||
vTables t_table_list;
|
||||
BEGIN
|
||||
-- Get bucket URI and credential from FILE_MANAGER configuration
|
||||
vBucketUri := CT_MRDS.FILE_MANAGER.GET_BUCKET_URI('ARCHIVE');
|
||||
vCredentialName := CT_MRDS.ENV_MANAGER.gvCredentialName;
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('VERIFICATION TIME: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3'));
|
||||
DBMS_OUTPUT.PUT_LINE('Bucket URI: ' || vBucketUri);
|
||||
DBMS_OUTPUT.PUT_LINE('Checking 19 MARS-826 export folders for remaining files...');
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
|
||||
-- Initialize folder and table lists for all 19 tables
|
||||
vFolders := t_folder_list(
|
||||
'ARCHIVE/LM/LM_ADHOC_ADJUSTMENTS_HEADER/',
|
||||
'ARCHIVE/LM/LM_ADHOC_ADJUSTMENTS_ITEM/',
|
||||
'ARCHIVE/LM/LM_ADHOC_ADJUSTMENTS_ITEM_HEADER/',
|
||||
'ARCHIVE/LM/LM_BALANCESHEET_HEADER/',
|
||||
'ARCHIVE/LM/LM_BALANCESHEET_ITEM/',
|
||||
'ARCHIVE/LM/LM_CSM_ADJUSTMENTS_HEADER/',
|
||||
'ARCHIVE/LM/LM_CSM_ADJUSTMENTS_ITEM/',
|
||||
'ARCHIVE/LM/LM_CSM_ADJUSTMENTS_ITEM_HEADER/',
|
||||
'ARCHIVE/LM/LM_STANDING_FACILITIES/',
|
||||
'ARCHIVE/LM/LM_STANDING_FACILITIES_HEADER/',
|
||||
'ARCHIVE/LM/LM_CURRENT_ACCOUNTS_HEADER/',
|
||||
'ARCHIVE/LM/LM_CURRENT_ACCOUNTS_ITEM/',
|
||||
'ARCHIVE/LM/LM_FORECAST_HEADER/',
|
||||
'ARCHIVE/LM/LM_FORECAST_ITEM/',
|
||||
'ARCHIVE/LM/LM_QRE_ADJUSTMENTS_HEADER/',
|
||||
'ARCHIVE/LM/LM_QRE_ADJUSTMENTS_ITEM/',
|
||||
'ARCHIVE/LM/LM_QRE_ADJUSTMENTS_ITEM_HEADER/',
|
||||
'ARCHIVE/LM/LM_TTS_HEADER/',
|
||||
'ARCHIVE/LM/LM_TTS_ITEM/'
|
||||
);
|
||||
|
||||
vTables := t_table_list(
|
||||
'ADHOC_ADJ_HEADER',
|
||||
'ADHOC_ADJ_ITEM',
|
||||
'ADHOC_ADJ_ITEM_HEADER',
|
||||
'BALANCESHEET_HEADER',
|
||||
'BALANCESHEET_ITEM',
|
||||
'CSM_ADJ_HEADER',
|
||||
'CSM_ADJ_ITEM',
|
||||
'CSM_ADJ_ITEM_HEADER',
|
||||
'STANDING_FACILITY',
|
||||
'STANDING_FACILITY_HEADER',
|
||||
'MRR_IND_CURRENT_ACCOUNT_HEADER',
|
||||
'MRR_IND_CURRENT_ACCOUNT_ITEM',
|
||||
'FORECAST_HEADER',
|
||||
'FORECAST_ITEM',
|
||||
'QR_ADJ_HEADER',
|
||||
'QR_ADJ_ITEM',
|
||||
'QR_ADJ_ITEM_HEADER',
|
||||
'TTS_HEADER',
|
||||
'TTS_ITEM'
|
||||
);
|
||||
|
||||
-- Check each folder for remaining files
|
||||
FOR i IN 1..vFolders.COUNT LOOP
|
||||
vFileCount := 0;
|
||||
|
||||
-- Count files in folder (using exception handling for missing folders)
|
||||
BEGIN
|
||||
FOR rec IN (
|
||||
SELECT object_name, bytes
|
||||
FROM TABLE(DBMS_CLOUD.LIST_OBJECTS(
|
||||
credential_name => vCredentialName,
|
||||
location_uri => vBucketUri || vFolders(i)
|
||||
))
|
||||
WHERE object_name LIKE '%.parquet'
|
||||
ORDER BY object_name
|
||||
) LOOP
|
||||
IF vFileCount = 0 THEN
|
||||
DBMS_OUTPUT.PUT_LINE('ISSUE: ' || RPAD(vTables(i), 40) || ' - Files still exist:');
|
||||
vRollbackSuccess := FALSE;
|
||||
vTablesWithFiles := vTablesWithFiles + 1;
|
||||
END IF;
|
||||
|
||||
vFileCount := vFileCount + 1;
|
||||
DBMS_OUTPUT.PUT_LINE(' [' || vFileCount || '] ' || rec.object_name || ' (' || ROUND(rec.bytes/1024, 1) || ' KB)');
|
||||
END LOOP;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
-- Folder doesn't exist or access error - this is actually good for rollback
|
||||
NULL;
|
||||
END;
|
||||
|
||||
IF vFileCount = 0 THEN
|
||||
DBMS_OUTPUT.PUT_LINE('OK: ' || RPAD(vTables(i), 40) || ' - Clean (no files)');
|
||||
vTablesClean := vTablesClean + 1;
|
||||
ELSE
|
||||
vTotalFiles := vTotalFiles + vFileCount;
|
||||
END IF;
|
||||
END LOOP;
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||
DBMS_OUTPUT.PUT_LINE('ROLLBACK VERIFICATION SUMMARY:');
|
||||
DBMS_OUTPUT.PUT_LINE(' Total tables checked: ' || vTables.COUNT);
|
||||
DBMS_OUTPUT.PUT_LINE(' Tables completely clean: ' || vTablesClean);
|
||||
DBMS_OUTPUT.PUT_LINE(' Tables with remaining files: ' || vTablesWithFiles);
|
||||
DBMS_OUTPUT.PUT_LINE(' Total remaining files: ' || vTotalFiles);
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
|
||||
IF vRollbackSuccess THEN
|
||||
DBMS_OUTPUT.PUT_LINE('RESULT: ROLLBACK SUCCESSFUL');
|
||||
DBMS_OUTPUT.PUT_LINE('STATUS: All MARS-826 exported files have been completely removed');
|
||||
DBMS_OUTPUT.PUT_LINE('ACTION: No further action required - rollback is complete');
|
||||
ELSE
|
||||
DBMS_OUTPUT.PUT_LINE('RESULT: ROLLBACK INCOMPLETE');
|
||||
DBMS_OUTPUT.PUT_LINE('STATUS: ' || vTotalFiles || ' files remain in ' || vTablesWithFiles || ' folder(s)');
|
||||
DBMS_OUTPUT.PUT_LINE('ACTION: 1. Review rollback scripts for completeness');
|
||||
DBMS_OUTPUT.PUT_LINE(' 2. Manual cleanup may be required for remaining files');
|
||||
DBMS_OUTPUT.PUT_LINE(' 3. Check file permissions and bucket access');
|
||||
END IF;
|
||||
DBMS_OUTPUT.PUT_LINE('=====================================================================================');
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
DBMS_OUTPUT.PUT_LINE('VERIFICATION ERROR: ' || SQLERRM);
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
301
MARS_Packages/REL01_POST_DEACTIVATION/MARS-826/README.md
Normal file
301
MARS_Packages/REL01_POST_DEACTIVATION/MARS-826/README.md
Normal file
@@ -0,0 +1,301 @@
|
||||
# MARS-826: CSDB Historical Data Export to HIST Bucket
|
||||
|
||||
## 🎯 Implementation Status: 🚧 IN DEVELOPMENT
|
||||
|
||||
**Implementation Date:** 2025-12-02
|
||||
**Database Version:** Oracle 23ai
|
||||
**Package Used:** CT_MRDS.DATA_EXPORTER
|
||||
**Status:** Development ⚙️
|
||||
|
||||
---
|
||||
|
||||
## 📋 Overview
|
||||
|
||||
MARS-826 implements one-time historical data export for CSDB tables from operational database (OU_LM/OU_MRR schemas) to HIST bucket (ARCHIVE) in Parquet format with Hive-style partitioning.
|
||||
|
||||
### Key Objectives
|
||||
- **Data Migration**: Move historical CSDB data from LEGACY_ tables to HIST bucket
|
||||
- **Column Mapping**: Map A_ETL_LOAD_SET_KEY[_FK] → A_WORKFLOW_HISTORY_KEY
|
||||
- **Bulk Export**: Process 19 tables with ~31M total records
|
||||
- **Weekend Execution**: Non-critical timing allows weekend bulk processing
|
||||
- **Prerequisites**: LEGACY_ prefixed tables must exist before running export
|
||||
|
||||
---
|
||||
|
||||
## 📁 Project Structure
|
||||
|
||||
```
|
||||
MARS_Packages/REL01_POST_DEACTIVATION/MARS-826/
|
||||
├── install_mars826.sql # 📥 Main Installation Script
|
||||
├── 00_MARS_826_pre_check_existing_files.sql # Pre-check: Existing archive files
|
||||
├── 01_MARS_826_export_ADHOC_ADJ_tables.sql # Export ADHOC_ADJ (3 tables)
|
||||
├── 02_MARS_826_export_BALANCESHEET_tables.sql # Export BALANCESHEET (2 tables, 7.6M records)
|
||||
├── 03_MARS_826_export_CSM_ADJ_tables.sql # Export CSM_ADJ (3 tables)
|
||||
├── 04_MARS_826_export_STANDING_FACILITY_tables.sql # Export STANDING_FACILITY (2 tables, 1.2M records)
|
||||
├── 05_MARS_826_export_MRR_IND_CURR_ACC_tables.sql # Export MRR_IND_CURR_ACC (2 tables)
|
||||
├── 06_MARS_826_export_FORECAST_tables.sql # Export FORECAST (2 tables, 21.6M records)
|
||||
├── 07_MARS_826_export_QR_ADJ_tables.sql # Export QR_ADJ (3 tables)
|
||||
├── 08_MARS_826_export_TTS_tables.sql # Export TTS (2 tables)
|
||||
├── 09_MARS_826_verify_exports.sql # Verification: File listing
|
||||
├── 10_MARS_826_verify_record_counts.sql # Verification: Record count comparison
|
||||
├── rollback_mars826.sql # 🔄 Main Rollback Script
|
||||
├── 91_MARS_826_rollback_ADHOC_ADJ_tables.sql # Rollback ADHOC_ADJ
|
||||
├── 92_MARS_826_rollback_BALANCESHEET_tables.sql # Rollback BALANCESHEET
|
||||
├── 93_MARS_826_rollback_CSM_ADJ_tables.sql # Rollback CSM_ADJ
|
||||
├── 94_MARS_826_rollback_STANDING_FACILITY_tables.sql # Rollback STANDING_FACILITY
|
||||
├── 95_MARS_826_rollback_MRR_IND_CURR_ACC_tables.sql # Rollback MRR_IND_CURR_ACC
|
||||
├── 96_MARS_826_rollback_FORECAST_tables.sql # Rollback FORECAST
|
||||
├── 97_MARS_826_rollback_QR_ADJ_tables.sql # Rollback QR_ADJ
|
||||
├── 98_MARS_826_rollback_TTS_tables.sql # Rollback TTS
|
||||
├── 99_MARS_826_verify_rollback.sql # Rollback Verification
|
||||
└── README.md # 📝 This Documentation
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 Tables to Export (19 Total)
|
||||
|
||||
### Group 1: ADHOC_ADJ Tables (3 tables, ~209 records)
|
||||
1. **OU_LM.LEGACY_ADHOC_ADJ_HEADER** → history/ARCHIVE/LM/LM_ADHOC_ADJUSTMENTS_HEADER (~5 records)
|
||||
2. **OU_LM.LEGACY_ADHOC_ADJ_ITEM** → history/ARCHIVE/LM/LM_ADHOC_ADJUSTMENTS_ITEM (~102 records)
|
||||
3. **OU_LM.LEGACY_ADHOC_ADJ_ITEM_HEADER** → history/ARCHIVE/LM/LM_ADHOC_ADJUSTMENTS_ITEM_HEADER (~102 records)
|
||||
|
||||
### Group 2: BALANCESHEET Tables (2 tables, ~7.6M records) ⚠️ LARGE
|
||||
4. **OU_LM.LEGACY_BALANCESHEET_HEADER** → history/ARCHIVE/LM/LM_BALANCESHEET_HEADER (~81,853 records)
|
||||
5. **OU_LM.LEGACY_BALANCESHEET_ITEM** → history/ARCHIVE/LM/LM_BALANCESHEET_ITEM (~7,603,340 records)
|
||||
|
||||
### Group 3: CSM_ADJ Tables (3 tables, ~7,756 records)
|
||||
6. **OU_LM.LEGACY_CSM_ADJ_HEADER** → history/ARCHIVE/LM/LM_CSM_ADJUSTMENTS_HEADER (~186 records)
|
||||
7. **OU_LM.LEGACY_CSM_ADJ_ITEM** → history/ARCHIVE/LM/LM_CSM_ADJUSTMENTS_ITEM (~3,785 records)
|
||||
8. **OU_LM.LEGACY_CSM_ADJ_ITEM_HEADER** → history/ARCHIVE/LM/LM_CSM_ADJUSTMENTS_ITEM_HEADER (~3,785 records)
|
||||
|
||||
### Group 4: STANDING_FACILITY Tables (2 tables, ~1.2M records) ⚠️ LARGE
|
||||
9. **OU_LM.LEGACY_STANDING_FACILITY** → history/ARCHIVE/LM/LM_STANDING_FACILITIES (~1,205,002 records)
|
||||
10. **OU_LM.LEGACY_STANDING_FACILITY_HEADER** → history/ARCHIVE/LM/LM_STANDING_FACILITIES_HEADER (~2,647 records)
|
||||
|
||||
### Group 5: MRR_IND_CURR_ACC Tables (2 tables - OU_MRR schema)
|
||||
11. **OU_MRR.LEGACY_MRR_IND_CURRENT_ACCOUNT_HEADER** → history/ARCHIVE/LM/LM_CURRENT_ACCOUNTS_HEADER
|
||||
12. **OU_MRR.LEGACY_MRR_IND_CURRENT_ACCOUNT_ITEM** → history/ARCHIVE/LM/LM_CURRENT_ACCOUNTS_ITEM
|
||||
|
||||
### Group 6: FORECAST Tables (2 tables, ~21.6M records) ⚠️ VERY LARGE
|
||||
13. **OU_LM.LEGACY_FORECAST_HEADER** → history/ARCHIVE/LM/LM_FORECAST_HEADER (~42,504 records)
|
||||
14. **OU_LM.LEGACY_FORECAST_ITEM** → history/ARCHIVE/LM/LM_FORECAST_ITEM (~21,643,855 records)
|
||||
|
||||
### Group 7: QR_ADJ Tables (3 tables, ~62,573 records)
|
||||
15. **OU_LM.LEGACY_QR_ADJ_HEADER** → history/ARCHIVE/LM/LM_QRE_ADJUSTMENTS_HEADER (~123 records)
|
||||
16. **OU_LM.LEGACY_QR_ADJ_ITEM** → history/ARCHIVE/LM/LM_QRE_ADJUSTMENTS_ITEM (~59,952 records)
|
||||
17. **OU_LM.LEGACY_QR_ADJ_ITEM_HEADER** → history/ARCHIVE/LM/LM_QRE_ADJUSTMENTS_ITEM_HEADER (~2,498 records)
|
||||
|
||||
### Group 8: TTS Tables (2 tables, ~1,120 records)
|
||||
18. **OU_LM.LEGACY_TTS_HEADER** → history/ARCHIVE/LM/LM_TTS_HEADER (~560 records)
|
||||
19. **OU_LM.LEGACY_TTS_ITEM** → history/ARCHIVE/LM/LM_TTS_ITEM (~560 records)
|
||||
|
||||
**Total Records:** ~31,000,000 records across 19 tables
|
||||
|
||||
### Complete Table List
|
||||
1. OU_LM.LEGACY_ADHOC_ADJ_HEADER
|
||||
2. OU_LM.LEGACY_ADHOC_ADJ_ITEM
|
||||
3. OU_LM.LEGACY_ADHOC_ADJ_ITEM_HEADER
|
||||
4. OU_LM.LEGACY_BALANCESHEET_HEADER
|
||||
5. OU_LM.LEGACY_BALANCESHEET_ITEM
|
||||
6. OU_LM.LEGACY_CSM_ADJ_HEADER
|
||||
7. OU_LM.LEGACY_CSM_ADJ_ITEM
|
||||
8. OU_LM.LEGACY_CSM_ADJ_ITEM_HEADER
|
||||
9. OU_LM.LEGACY_STANDING_FACILITY
|
||||
10. OU_LM.LEGACY_STANDING_FACILITY_HEADER
|
||||
11. OU_MRR.LEGACY_MRR_IND_CURRENT_ACCOUNT_HEADER
|
||||
12. OU_MRR.LEGACY_MRR_IND_CURRENT_ACCOUNT_ITEM
|
||||
13. OU_LM.LEGACY_FORECAST_HEADER
|
||||
14. OU_LM.LEGACY_FORECAST_ITEM
|
||||
15. OU_LM.LEGACY_QR_ADJ_HEADER
|
||||
16. OU_LM.LEGACY_QR_ADJ_ITEM
|
||||
17. OU_LM.LEGACY_QR_ADJ_ITEM_HEADER
|
||||
18. OU_LM.LEGACY_TTS_HEADER
|
||||
19. OU_LM.LEGACY_TTS_ITEM
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Column Mapping
|
||||
|
||||
All tables require mapping of the key column used for partitioning:
|
||||
|
||||
| Old Column Name | New Column Name | Tables Affected |
|
||||
|----------------|-----------------|-----------------|
|
||||
| `A_ETL_LOAD_SET_KEY_FK` | `A_WORKFLOW_HISTORY_KEY` | ADHOC_ADJ (3), CSM_ADJ (3), STANDING_FACILITY (2), FORECAST (2), QR_ADJ (3), TTS (2) |
|
||||
| `A_ETL_LOAD_SET_KEY` | `A_WORKFLOW_HISTORY_KEY` | BALANCESHEET (2), MRR_IND_CURR_ACC (2) |
|
||||
|
||||
**Mapping Implementation:**
|
||||
```sql
|
||||
-- Example for tables with A_ETL_LOAD_SET_KEY_FK
|
||||
pColumnList => 'T.COL1, T.COL2, ..., T.A_ETL_LOAD_SET_KEY_FK AS A_WORKFLOW_HISTORY_KEY'
|
||||
|
||||
-- Example for tables with A_ETL_LOAD_SET_KEY
|
||||
pColumnList => 'T.COL1, T.COL2, ..., T.A_ETL_LOAD_SET_KEY AS A_WORKFLOW_HISTORY_KEY'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📥 Installation
|
||||
|
||||
### Prerequisites
|
||||
- Oracle Database 23ai with CT_MRDS.DATA_EXPORTER package
|
||||
- Access to OU_LM and OU_MRR schemas
|
||||
- HIST bucket (history) configured and accessible
|
||||
- Sufficient storage space for ~31M records in Parquet format
|
||||
|
||||
### Execution Requirements
|
||||
- **Timing:** Weekend bulk execution (non-time-critical)
|
||||
- **Duration:** Estimated 2-4 hours depending on system load
|
||||
- **Connection:** Execute as ADMIN user for cross-schema operations
|
||||
|
||||
### Installation Steps
|
||||
|
||||
```powershell
|
||||
# Execute installation script
|
||||
Get-Content "MARS_Packages/REL01_POST_DEACTIVATION/MARS-826/install_mars826.sql" | sql "ADMIN/password@service"
|
||||
|
||||
# Log file will be created: INSTALL_MARS_826_<PDB>_<timestamp>.log
|
||||
```
|
||||
|
||||
**Installation Script Workflow:**
|
||||
1. **01_** Export ADHOC_ADJ tables (3 tables)
|
||||
2. **02_** Export BALANCESHEET tables (2 tables, ~7.6M records) ⏱️
|
||||
3. **03_** Export CSM_ADJ tables (3 tables)
|
||||
4. **04_** Export STANDING_FACILITY tables (2 tables, ~1.2M records) ⏱️
|
||||
5. **05_** Export MRR_IND_CURR_ACC tables (2 tables)
|
||||
6. **06_** Export FORECAST tables (2 tables, ~21.6M records) ⏱️⏱️
|
||||
7. **07_** Export QR_ADJ tables (3 tables)
|
||||
8. **08_** Export TTS tables (2 tables)
|
||||
9. **09_** Verify all exports completed successfully
|
||||
|
||||
---
|
||||
|
||||
## 🧪 Verification
|
||||
|
||||
The installation includes comprehensive automated verification:
|
||||
|
||||
### Pre-Installation Check (00_*)
|
||||
- **Existing Files Audit**: Lists all current Parquet files in HIST bucket before export
|
||||
- **Storage Analysis**: Shows file counts, total size (MB), and status for each table
|
||||
- **Baseline Establishment**: Determines if export is fresh or will overwrite existing data
|
||||
|
||||
### Post-Export Verification (09_* and 10_*)
|
||||
|
||||
**File Verification (09_)**:
|
||||
```sql
|
||||
-- Automated check of exported files in HIST bucket
|
||||
-- Groups by table name with file counts and sizes
|
||||
-- Verifies Hive-style partitioning structure
|
||||
```
|
||||
|
||||
**Record Count Validation (10_)**:
|
||||
```sql
|
||||
-- Compares source table row counts with exported Parquet files
|
||||
-- Shows schema, table name, source records, file count, and size
|
||||
-- Validates data completeness for all 19 tables
|
||||
```
|
||||
|
||||
### Manual Verification
|
||||
```sql
|
||||
-- Check HIST bucket for exported files
|
||||
SELECT object_name, bytes, time_created
|
||||
FROM DBMS_CLOUD.LIST_OBJECTS(
|
||||
credential_name => 'DEF_CRED_ARN',
|
||||
location_uri => 'https://objectstorage.eu-frankfurt-1.oraclecloud.com/n/frtgjxu7zl7c/b/history/'
|
||||
)
|
||||
WHERE object_name LIKE 'ARCHIVE/LM/%'
|
||||
ORDER BY time_created DESC;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 Expected Output
|
||||
|
||||
### HIST Bucket Structure (Parquet with Hive Partitioning)
|
||||
```
|
||||
history/ARCHIVE/LM/
|
||||
├── LM_ADHOC_ADJUSTMENTS_HEADER/
|
||||
│ └── PARTITION_YEAR=YYYY/PARTITION_MONTH=MM/*.parquet
|
||||
├── LM_BALANCESHEET_ITEM/
|
||||
│ └── PARTITION_YEAR=YYYY/PARTITION_MONTH=MM/*.parquet (7.6M records)
|
||||
├── LM_FORECAST_ITEM/
|
||||
│ └── PARTITION_YEAR=YYYY/PARTITION_MONTH=MM/*.parquet (21.6M records)
|
||||
└── ... (15 more table folders)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ Important Notes
|
||||
|
||||
### Performance Considerations
|
||||
- **Large Tables:** BALANCESHEET_ITEM (7.6M), FORECAST_ITEM (21.6M) may take significant time
|
||||
- **Weekend Execution:** Recommended to avoid impact on production workloads
|
||||
- **Monitoring:** Check log file for progress and any errors
|
||||
|
||||
### Data Validation
|
||||
- **Column Mapping:** Verify A_WORKFLOW_HISTORY_KEY is correctly mapped
|
||||
- **Record Counts:** Compare source vs. exported record counts
|
||||
- **Date Ranges:** Ensure all historical data is included
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Rollback
|
||||
|
||||
This package includes comprehensive rollback scripts to restore the state before installation by **deleting all exported Parquet files from HIST bucket**:
|
||||
|
||||
### Rollback Scripts
|
||||
- `rollback_mars826.sql` - Master rollback orchestration script (with SPOOL logging)
|
||||
- `91_MARS_826_rollback_ADHOC_ADJ_tables.sql` - Delete ADHOC_ADJ exports (3 tables)
|
||||
- `92_MARS_826_rollback_BALANCESHEET_tables.sql` - Delete BALANCESHEET exports (2 tables, ~7.6M records)
|
||||
- `93_MARS_826_rollback_CSM_ADJ_tables.sql` - Delete CSM_ADJ exports (3 tables)
|
||||
- `94_MARS_826_rollback_STANDING_FACILITY_tables.sql` - Delete STANDING_FACILITY exports (2 tables, ~1.2M records)
|
||||
- `95_MARS_826_rollback_MRR_IND_CURR_ACC_tables.sql` - Delete MRR_IND_CURR_ACC exports (2 tables)
|
||||
- `96_MARS_826_rollback_FORECAST_tables.sql` - Delete FORECAST exports (2 tables, ~21.6M records - LARGEST)
|
||||
- `97_MARS_826_rollback_QR_ADJ_tables.sql` - Delete QR_ADJ exports (3 tables)
|
||||
- `98_MARS_826_rollback_TTS_tables.sql` - Delete TTS exports (2 tables)
|
||||
- `99_MARS_826_verify_rollback.sql` - Verify complete file deletion
|
||||
|
||||
### Rollback Execution
|
||||
```sql
|
||||
-- Execute from SQLcl/SQL*Plus as CT_MRDS user
|
||||
@rollback_mars826.sql
|
||||
-- Prompts for confirmation (type YES to proceed)
|
||||
-- Creates log file: rollback_mars826_YYYYMMDD.log
|
||||
```
|
||||
|
||||
### What Rollback Does
|
||||
1. **Deletes all exported Parquet files** from `HIST/ARCHIVE/LM/{TABLE_NAME}/` folders
|
||||
2. **Uses DBMS_CLOUD.DELETE_OBJECT** for each file in all 19 table directories
|
||||
3. **Verifies cleanup** by counting remaining files (should be 0)
|
||||
4. **Logs all operations** to timestamped log file
|
||||
|
||||
### Important Notes
|
||||
- **Source tables remain untouched** (read-only operations, no data modifications)
|
||||
- **Rollback is destructive** - permanently deletes exported files from HIST bucket
|
||||
- **Large datasets warning** - FORECAST_ITEM deletion may take several minutes (~21.6M records)
|
||||
- **Re-export possible** - can re-run install_mars826.sql after rollback if needed
|
||||
|
||||
---
|
||||
|
||||
## 🔗 Related Documentation
|
||||
|
||||
- [DATA_EXPORTER Package Documentation](../../confluence/DATA_EXPORTER_Guide.md)
|
||||
- [Table Setup Guide for FILE PROCESSOR System](../../confluence/Tables_setup.md)
|
||||
- [File Manager Configuration Guide](../../confluence/FILE_MANAGER_Configuration_Guide.md)
|
||||
|
||||
---
|
||||
|
||||
## 📞 Support
|
||||
|
||||
For questions or issues with the export process:
|
||||
|
||||
1. Check log file: `INSTALL_MARS_826_<PDB>_<timestamp>.log`
|
||||
2. Verify bucket access and credentials
|
||||
3. Check process logs: `SELECT * FROM CT_MRDS.A_PROCESS_LOG WHERE LOG_TIMESTAMP > SYSDATE - 1 ORDER BY LOG_TIMESTAMP DESC;`
|
||||
4. Contact database team lead
|
||||
|
||||
---
|
||||
|
||||
**Last Updated:** 2025-12-02
|
||||
**Document Version:** 1.0.0
|
||||
**Author:** Grzegorz Michalski
|
||||
@@ -0,0 +1,154 @@
|
||||
-- ===================================================================
|
||||
-- MARS-826 INSTALL SCRIPT: CSDB Historical Data Export to HIST Bucket
|
||||
-- ===================================================================
|
||||
-- Purpose: One-time export of 19 CSDB tables from OU_LM/OU_MRR to HIST bucket
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Date: 2025-12-02
|
||||
-- Version: 1.0.0
|
||||
--
|
||||
-- Description:
|
||||
-- Exports historical data from operational CSDB tables to ARCHIVE/LM/
|
||||
-- in HIST bucket with Parquet format and Hive-style partitioning.
|
||||
-- Column mapping: A_ETL_LOAD_SET_KEY[_FK] -> A_WORKFLOW_HISTORY_KEY
|
||||
--
|
||||
-- Execution: ADMIN user required for cross-schema operations
|
||||
-- Timing: Weekend bulk execution recommended (non-time-critical)
|
||||
-- Duration: Estimated 2-4 hours for ~31M total records
|
||||
-- ===================================================================
|
||||
|
||||
-- Create log directory if it doesn't exist
|
||||
host mkdir log 2>nul
|
||||
|
||||
-- Dynamic spool file generation (using SYS_CONTEXT - no DBA privileges required)
|
||||
-- Log files are automatically created in log/ subdirectory
|
||||
var filename VARCHAR2(100)
|
||||
BEGIN
|
||||
:filename := 'log/INSTALL_MARS_826_' || 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-826: CSDB Historical Data Export to HIST Bucket
|
||||
PROMPT =========================================================================
|
||||
PROMPT
|
||||
PROMPT This script will export 19 CSDB tables from OU_LM/OU_MRR schemas
|
||||
PROMPT to HIST bucket in Parquet format.
|
||||
PROMPT
|
||||
PROMPT Export Groups:
|
||||
PROMPT 1. ADHOC_ADJ tables (3 tables, ~209 records)
|
||||
PROMPT 2. BALANCESHEET tables (2 tables, ~7.6M records) - LARGE
|
||||
PROMPT 3. CSM_ADJ tables (3 tables, ~7,756 records)
|
||||
PROMPT 4. STANDING_FACILITY tables (2 tables, ~1.2M records) - LARGE
|
||||
PROMPT 5. MRR_IND_CURR_ACC tables (2 tables)
|
||||
PROMPT 6. FORECAST tables (2 tables, ~21.6M records) - VERY LARGE
|
||||
PROMPT 7. QR_ADJ tables (3 tables, ~62,573 records)
|
||||
PROMPT 8. TTS tables (2 tables, ~1,120 records)
|
||||
PROMPT
|
||||
PROMPT Total: ~31 million records across 19 tables
|
||||
PROMPT
|
||||
PROMPT Column Mapping: A_ETL_LOAD_SET_KEY[_FK] -> A_WORKFLOW_HISTORY_KEY
|
||||
PROMPT
|
||||
|
||||
PROMPT =========================================================================
|
||||
|
||||
-- Confirm installation with user
|
||||
ACCEPT continue CHAR PROMPT 'Type YES to continue with data export, 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 =========================================================================
|
||||
PROMPT Pre-Check: Existing Archive Files in HIST Bucket
|
||||
PROMPT =========================================================================
|
||||
@@00_MARS_826_pre_check_existing_files.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT =========================================================================
|
||||
PROMPT Step 1: Export ADHOC_ADJ Tables (3 tables)
|
||||
PROMPT =========================================================================
|
||||
@@01_MARS_826_export_ADHOC_ADJ_tables.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT =========================================================================
|
||||
PROMPT Step 2: Export BALANCESHEET Tables (2 tables, ~7.6M records)
|
||||
PROMPT =========================================================================
|
||||
@@02_MARS_826_export_BALANCESHEET_tables.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT =========================================================================
|
||||
PROMPT Step 3: Export CSM_ADJ Tables (3 tables)
|
||||
PROMPT =========================================================================
|
||||
@@03_MARS_826_export_CSM_ADJ_tables.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT =========================================================================
|
||||
PROMPT Step 4: Export STANDING_FACILITY Tables (2 tables, ~1.2M records)
|
||||
PROMPT =========================================================================
|
||||
@@04_MARS_826_export_STANDING_FACILITY_tables.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT =========================================================================
|
||||
PROMPT Step 5: Export MRR_IND_CURRENT_ACCOUNT Tables (2 tables)
|
||||
PROMPT =========================================================================
|
||||
@@05_MARS_826_export_MRR_IND_CURRENT_ACCOUNT_tables.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT =========================================================================
|
||||
PROMPT Step 6: Export FORECAST Tables (2 tables, ~21.6M records)
|
||||
PROMPT =========================================================================
|
||||
@@06_MARS_826_export_FORECAST_tables.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT =========================================================================
|
||||
PROMPT Step 7: Export QR_ADJ Tables (3 tables)
|
||||
PROMPT =========================================================================
|
||||
@@07_MARS_826_export_QR_ADJ_tables.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT =========================================================================
|
||||
PROMPT Step 8: Export TTS Tables (2 tables)
|
||||
PROMPT =========================================================================
|
||||
@@08_MARS_826_export_TTS_tables.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT =========================================================================
|
||||
PROMPT Step 9: Verify Exports
|
||||
PROMPT =========================================================================
|
||||
@@09_MARS_826_verify_exports.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT =========================================================================
|
||||
PROMPT Step 10: Verify Record Counts
|
||||
PROMPT =========================================================================
|
||||
@@10_MARS_826_verify_record_counts.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT =========================================================================
|
||||
PROMPT MARS-826 Installation - COMPLETED
|
||||
PROMPT =========================================================================
|
||||
PROMPT All 19 CSDB tables have been exported to HIST bucket.
|
||||
PROMPT Check the log file for complete export details.
|
||||
PROMPT
|
||||
PROMPT Next Steps:
|
||||
PROMPT 1. Review log file for any errors or warnings
|
||||
PROMPT 2. Verify record counts match source tables
|
||||
PROMPT 3. Check HIST bucket for Parquet files with Hive partitioning
|
||||
PROMPT =========================================================================
|
||||
|
||||
spool off
|
||||
|
||||
quit;
|
||||
@@ -0,0 +1,79 @@
|
||||
-- ============================================================================
|
||||
-- MARS-826 Rollback Script
|
||||
-- ============================================================================
|
||||
-- Purpose: Remove exported historical data from HIST bucket
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Schema: OU_LM, OU_MRR (source schemas - read-only)
|
||||
-- Target: HIST bucket cleanup (delete exported Parquet files)
|
||||
-- Date: 2025-12-02
|
||||
-- ============================================================================
|
||||
|
||||
-- Create log directory if it doesn't exist
|
||||
host mkdir log 2>nul
|
||||
|
||||
-- Dynamic spool file generation (using SYS_CONTEXT - no DBA privileges required)
|
||||
-- Log files are automatically created in log/ subdirectory
|
||||
var filename VARCHAR2(100)
|
||||
BEGIN
|
||||
:filename := 'log/ROLLBACK_MARS_826_' || 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-826 Rollback - Remove Exported Historical Data
|
||||
PROMPT ============================================================================
|
||||
PROMPT
|
||||
PROMPT This rollback will DELETE all exported Parquet files from HIST bucket.
|
||||
PROMPT
|
||||
PROMPT Tables affected: 19 tables from OU_LM and OU_MRR schemas
|
||||
PROMPT Bucket location: history/ARCHIVE/LM/
|
||||
PROMPT
|
||||
PROMPT ============================================================================
|
||||
ACCEPT confirmation CHAR PROMPT 'Do you want to proceed with rollback? (YES/NO): '
|
||||
|
||||
WHENEVER SQLERROR EXIT SQL.SQLCODE
|
||||
|
||||
-- Validate confirmation
|
||||
BEGIN
|
||||
IF UPPER('&confirmation') != 'YES' THEN
|
||||
RAISE_APPLICATION_ERROR(-20001, 'Rollback cancelled by user');
|
||||
END IF;
|
||||
END;
|
||||
/
|
||||
|
||||
PROMPT
|
||||
PROMPT Starting rollback execution...
|
||||
PROMPT Timestamp:
|
||||
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS ROLLBACK_START FROM DUAL;
|
||||
PROMPT
|
||||
PROMPT ============================================================================
|
||||
|
||||
-- Execute rollback scripts
|
||||
@@91_MARS_826_rollback_ADHOC_ADJ_tables.sql
|
||||
@@92_MARS_826_rollback_BALANCESHEET_tables.sql
|
||||
@@93_MARS_826_rollback_CSM_ADJ_tables.sql
|
||||
@@94_MARS_826_rollback_STANDING_FACILITY_tables.sql
|
||||
@@95_MARS_826_rollback_MRR_IND_CURRENT_ACCOUNT_tables.sql
|
||||
@@96_MARS_826_rollback_FORECAST_tables.sql
|
||||
@@97_MARS_826_rollback_QR_ADJ_tables.sql
|
||||
@@98_MARS_826_rollback_TTS_tables.sql
|
||||
@@99_MARS_826_verify_rollback.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT ============================================================================
|
||||
PROMPT Rollback completed successfully
|
||||
PROMPT Timestamp:
|
||||
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS ROLLBACK_END FROM DUAL;
|
||||
PROMPT ============================================================================
|
||||
|
||||
spool off
|
||||
|
||||
quit;
|
||||
Reference in New Issue
Block a user