This commit is contained in:
Grzegorz Michalski
2026-02-02 10:59:29 +01:00
commit ecd833f682
679 changed files with 122717 additions and 0 deletions

View File

@@ -0,0 +1,6 @@
# Exclude temporary folders from version control
confluence/
log/
test/
mock_data/

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View 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

View File

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

View File

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