Compare commits
2 Commits
ffcb288afa
...
00063f1d0b
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
00063f1d0b | ||
| b4eb235154 |
@@ -0,0 +1,310 @@
|
||||
|
||||
============================================================================
|
||||
MARS-828 Installation Starting (AUTO MODE)
|
||||
============================================================================
|
||||
|
||||
INSTALL_START
|
||||
______________________
|
||||
2026-01-28 06:49:11
|
||||
|
||||
1 row selected.
|
||||
|
||||
============================================================================
|
||||
|
||||
Step 1/7: Adding archival strategy columns
|
||||
===================================================================
|
||||
========================================
|
||||
MARS-828: Adding archival strategy columns
|
||||
========================================
|
||||
|
||||
Error starting at line : 11 File @ C:\_git\_local_rep\working_dir_02\MARS_Packages\REL01_ADDITIONS\MARS-828\01_MARS_828_install_add_archival_strategy_columns.sql
|
||||
In command -
|
||||
ALTER TABLE CT_MRDS.A_SOURCE_FILE_CONFIG ADD (
|
||||
ARCHIVAL_STRATEGY VARCHAR2(30) DEFAULT 'THRESHOLD_BASED' NOT NULL,
|
||||
MINIMUM_AGE_MONTHS NUMBER(3) DEFAULT NULL
|
||||
)
|
||||
Error report -
|
||||
ORA-01430: column being added already exists in table
|
||||
|
||||
https://docs.oracle.com/error-help/db/ora-01430/
|
||||
01430. 00000 - "column being added already exists in table"
|
||||
*Cause: An ALTER TABLE ADD statement specified the name of a
|
||||
column that was already in the table. All column names must be
|
||||
unique within a table.
|
||||
*Action: Specify a unique name for the new column, then
|
||||
re-execute the statement.
|
||||
|
||||
Error starting at line : 17 File @ C:\_git\_local_rep\working_dir_02\MARS_Packages\REL01_ADDITIONS\MARS-828\01_MARS_828_install_add_archival_strategy_columns.sql
|
||||
In command -
|
||||
ALTER TABLE CT_MRDS.A_SOURCE_FILE_CONFIG ADD CONSTRAINT
|
||||
CHK_ARCHIVAL_STRATEGY CHECK (
|
||||
ARCHIVAL_STRATEGY IN ('THRESHOLD_BASED', 'CURRENT_MONTH_ONLY', 'MINIMUM_AGE_MONTHS', 'HYBRID')
|
||||
)
|
||||
Error report -
|
||||
ORA-02264: name already used by an existing constraint
|
||||
|
||||
https://docs.oracle.com/error-help/db/ora-02264/
|
||||
02264. 00000 - "name already used by an existing constraint"
|
||||
*Cause: The specified constraint name has to be unique.
|
||||
*Action: Specify a unique constraint name for the constraint.
|
||||
|
||||
Comment created.
|
||||
|
||||
|
||||
Comment created.
|
||||
|
||||
|
||||
COLUMN_NAME DATA_TYPE DATA_LENGTH NULLABLE DATA_DEFAULT
|
||||
_____________________ ____________ ______________ ___________ _____________________
|
||||
ARCHIVAL_STRATEGY VARCHAR2 30 N 'THRESHOLD_BASED'
|
||||
MINIMUM_AGE_MONTHS NUMBER 22 Y NULL
|
||||
|
||||
2 rows selected.
|
||||
|
||||
========================================
|
||||
Archival strategy columns added successfully
|
||||
========================================
|
||||
|
||||
Step 2/7: Creating validation trigger
|
||||
======================================
|
||||
========================================
|
||||
MARS-828: Creating archival strategy validation trigger
|
||||
========================================
|
||||
|
||||
Trigger CT_MRDS.TRG_BI_A_SRC_FILE_CFG_ARCH_VAL compiled
|
||||
|
||||
|
||||
TRIGGER_NAME STATUS TRIGGER_TYPE TRIGGERING_EVENT
|
||||
_________________________________ __________ __________________ ___________________
|
||||
TRG_BI_A_SRC_FILE_CFG_ARCH_VAL ENABLED BEFORE EACH ROW INSERT OR UPDATE
|
||||
|
||||
1 row selected.
|
||||
|
||||
========================================
|
||||
Archival strategy validation trigger created successfully
|
||||
========================================
|
||||
|
||||
Step 3/7: Deploying FILE_ARCHIVER Spec v3.0.0
|
||||
===============================================================
|
||||
|
||||
Package CT_MRDS.FILE_ARCHIVER compiled
|
||||
|
||||
========================================
|
||||
FILE_ARCHIVER Specification v3.0.0 ready for installation
|
||||
========================================
|
||||
|
||||
Step 4/7: Deploying FILE_ARCHIVER Body v3.0.0
|
||||
======================================================
|
||||
|
||||
Package Body CT_MRDS.FILE_ARCHIVER compiled
|
||||
|
||||
LINE/COL ERROR
|
||||
--------- -------------------------------------------------------------
|
||||
36/10 PLS-00103: Encountered the symbol "\" when expecting one of the following: ( begin case declare else end exit for goto if loop mod null pragma raise return select update when while with <an identifier> <a double-quoted delimited-identifier> <a bind variable> << continue close current delete fetch lock insert open rollback savepoint set sql execute commit forall merge pipe purge json_object The symbol "case was inserted before "\" to continue.
|
||||
49/8 PLS-00103: Encountered the symbol "GET_ARCHIVAL_WHERE_CLAUSE" when expecting one of the following: case
|
||||
67/9 PLS-00103: Encountered the symbol "JOIN" when expecting one of the following: , ; for group having intersect minus order start union where connect
|
||||
Errors: check compiler log
|
||||
|
||||
Step 5/7: Verifying installation
|
||||
=================================
|
||||
========================================
|
||||
MARS-828: Verification Script
|
||||
========================================
|
||||
|
||||
1. Verifying A_SOURCE_FILE_CONFIG columns...
|
||||
|
||||
COLUMN_NAME DATA_TYPE NULLABLE DATA_DEFAULT
|
||||
_____________________ ____________ ___________ _____________________
|
||||
ARCHIVAL_STRATEGY VARCHAR2 N 'THRESHOLD_BASED'
|
||||
MINIMUM_AGE_MONTHS NUMBER Y NULL
|
||||
|
||||
2 rows selected.
|
||||
|
||||
|
||||
2. Verifying check constraint...
|
||||
|
||||
CONSTRAINT_NAME CONSTRAINT_TYPE SEARCH_CONDITION
|
||||
________________________ __________________ _________________________________________________________________________________________________
|
||||
CHK_ARCHIVAL_STRATEGY C ARCHIVAL_STRATEGY IN ('THRESHOLD_BASED', 'CURRENT_MONTH_ONLY', 'MINIMUM_AGE_MONTHS', 'HYBRID')
|
||||
|
||||
1 row selected.
|
||||
|
||||
|
||||
3. Verifying validation trigger...
|
||||
|
||||
TRIGGER_NAME STATUS TRIGGER_TYPE
|
||||
_________________________________ __________ __________________
|
||||
TRG_BI_A_SRC_FILE_CFG_ARCH_VAL ENABLED BEFORE EACH ROW
|
||||
|
||||
1 row selected.
|
||||
|
||||
|
||||
4. Checking FILE_ARCHIVER package status...
|
||||
|
||||
OBJECT_NAME OBJECT_TYPE STATUS LAST_DDL_TIME
|
||||
________________ _______________ __________ ______________________
|
||||
FILE_ARCHIVER PACKAGE VALID 2026-01-28 06:49:14
|
||||
FILE_ARCHIVER PACKAGE BODY INVALID 2026-01-28 06:49:15
|
||||
|
||||
2 rows selected.
|
||||
|
||||
|
||||
5. Checking for compilation errors...
|
||||
|
||||
NAME TYPE LINE POSITION TEXT
|
||||
________________ _______________ _______ ___________ _____________________________________________________________________________
|
||||
FILE_ARCHIVER PACKAGE BODY 36 10 PLS-00103: Encountered the symbol "\" when expecting one of the following:
|
||||
|
||||
( begin case declare else end exit for goto if loop mod null
|
||||
pragma raise return select update when while with
|
||||
<an identifier> <a double-quoted delimited-identifier>
|
||||
<a bind variable> << continue close current delete fetch lock
|
||||
insert open rollback savepoint set sql execute commit forall
|
||||
merge pipe purge json_object
|
||||
The symbol "case was inserted before "\" to continue.
|
||||
|
||||
FILE_ARCHIVER PACKAGE BODY 49 8 PLS-00103: Encountered the symbol "GET_ARCHIVAL_WHERE_CLAUSE" when expecting one of the following:
|
||||
|
||||
case
|
||||
|
||||
FILE_ARCHIVER PACKAGE BODY 67 9 PLS-00103: Encountered the symbol "JOIN" when expecting one of the following:
|
||||
|
||||
, ; for group having intersect minus order start union where
|
||||
connect
|
||||
|
||||
|
||||
3 rows selected.
|
||||
|
||||
|
||||
6. Verifying FILE_ARCHIVER version...
|
||||
|
||||
Error starting at line : 79 File @ C:\_git\_local_rep\working_dir_02\MARS_Packages\REL01_ADDITIONS\MARS-828\05_MARS_828_verify_installation.sql
|
||||
In command -
|
||||
SELECT CT_MRDS.FILE_ARCHIVER.GET_VERSION() as package_version FROM DUAL
|
||||
Error at Command Line : 79 Column : 68 File @ C:\_git\_local_rep\working_dir_02\MARS_Packages\REL01_ADDITIONS\MARS-828\05_MARS_828_verify_installation.sql
|
||||
Error report -
|
||||
SQL Error: ORA-04063: package body "CT_MRDS.FILE_ARCHIVER" has errors
|
||||
|
||||
https://docs.oracle.com/error-help/db/ora-04063/04063. 00000 - "%s has errors"
|
||||
*Cause: Attempt to execute a stored procedure or use a view that has
|
||||
errors. For stored procedures, the problem could be syntax errors
|
||||
or references to other, non-existent procedures. For views,
|
||||
the problem could be a reference in the view's defining query to
|
||||
a non-existent table.
|
||||
Can also be a table which has references to non-existent or
|
||||
inaccessible types.
|
||||
*Action: Fix the errors and/or create referenced objects as necessary.
|
||||
|
||||
More Details :
|
||||
https://docs.oracle.com/error-help/db/ora-04063/
|
||||
|
||||
7. Testing trigger validation (should fail)...
|
||||
SUCCESS: Trigger validation working correctly
|
||||
Expected error: ORA-20999: MINIMUM_AGE_MONTHS is required for MINIMUM_AGE_MONTHS strategy
|
||||
ORA-06512: at "CT_MRDS.TRG_BI_A_SRC_FILE_CFG_ARCH_VAL", line 26
|
||||
ORA-06512: at "CT_MRDS.TRG_BI_A_SRC_FILE_CFG_ARCH_VAL", line 8
|
||||
ORA-04088: error during execution of trigger 'CT_MRDS.TRG_BI_A_SRC_FILE_CFG_ARCH_VAL'
|
||||
|
||||
|
||||
PL/SQL procedure successfully completed.
|
||||
|
||||
|
||||
========================================
|
||||
MARS-828: Verification Complete
|
||||
========================================
|
||||
|
||||
Step 6/7: Tracking package versions
|
||||
====================================
|
||||
========================================
|
||||
Package Version Tracking
|
||||
========================================
|
||||
|
||||
Summary:
|
||||
--------
|
||||
Packages tracked: 0/1
|
||||
========================================
|
||||
|
||||
|
||||
PL/SQL procedure successfully completed.
|
||||
|
||||
|
||||
Step 7/7: Verifying tracked packages
|
||||
=====================================
|
||||
|
||||
========================================
|
||||
Package Version Verification
|
||||
========================================
|
||||
|
||||
|
||||
PACKAGE_OWNER PACKAGE_NAME VERSION STATUS
|
||||
________________ ___________________ __________ _______________________________________________________
|
||||
CT_MRDS DATA_EXPORTER 2.5.0 OK: Package CT_MRDS.DATA_EXPORTER has not changed.
|
||||
Last Tracked: 2026-01-26 17:15:41
|
||||
Version: 2.5.0
|
||||
CT_MRDS ENV_MANAGER 3.2.0 OK: Package CT_MRDS.ENV_MANAGER has not changed.
|
||||
Last Tracked: 2026-01-26 17:15:41
|
||||
Version: 3.2.0
|
||||
CT_MRDS FILE_ARCHIVER 2.0.0 WARNING: Package CT_MRDS.FILE_ARCHIVER has changed!
|
||||
========================================
|
||||
Last Tracked Version: 2.0.0
|
||||
Last Tracked Date: 2025-11-25 16:00:36
|
||||
|
||||
SPECIFICATION Changed:
|
||||
Current Hash: 71a835e531971ca7...
|
||||
Last Hash: 836641155e237fc5...
|
||||
|
||||
BODY Changed:
|
||||
Current Hash: 6f87dff6b0394529...
|
||||
Last Hash: 9bf9b3c0e059493c...
|
||||
|
||||
RECOMMENDATION:
|
||||
1. Update PACKAGE_VERSION constant
|
||||
2. Update PACKAGE_BUILD_DATE constant
|
||||
3. Add entry to VERSION_HISTORY
|
||||
4. Call TRACK_PACKAGE_VERSION to update tracking
|
||||
CT_MRDS FILE_MANAGER 3.4.0 OK: Package CT_MRDS.FILE_MANAGER has not changed.
|
||||
Last Tracked: 2026-01-26 11:42:32
|
||||
Version: 3.4.0
|
||||
CT_MRDS WORKFLOW_MANAGER 1.7.1 OK: Package CT_MRDS.WORKFLOW_MANAGER has not changed.
|
||||
Last Tracked: 2025-11-25 16:00:36
|
||||
Version: 1.7.1
|
||||
ODS FILE_MANAGER_ODS 2.1.0 WARNING: Package ODS.FILE_MANAGER_ODS has changed!
|
||||
========================================
|
||||
Last Tracked Version: 2.1.0
|
||||
Last Tracked Date: 2025-11-26 08:58:57
|
||||
|
||||
BODY Changed:
|
||||
Current Hash: 1d167a53256c10dd...
|
||||
Last Hash: NULL...
|
||||
|
||||
RECOMMENDATION:
|
||||
1. Update PACKAGE_VERSION constant
|
||||
2. Update PACKAGE_BUILD_DATE constant
|
||||
3. Add entry to VERSION_HISTORY
|
||||
4. Call TRACK_PACKAGE_VERSION to update tracking
|
||||
EnvironmentID set to: dev
|
||||
|
||||
|
||||
========================================
|
||||
Verification Complete
|
||||
========================================
|
||||
|
||||
Legend:
|
||||
OK - Package has not changed since last tracking
|
||||
WARNING - Package code changed without version update
|
||||
|
||||
For detailed hash information, use:
|
||||
SELECT ENV_MANAGER.GET_PACKAGE_HASH_INFO('OWNER', 'PACKAGE') FROM DUAL
|
||||
========================================
|
||||
|
||||
============================================================================
|
||||
MARS-828 Installation Completed
|
||||
============================================================================
|
||||
|
||||
INSTALL_END
|
||||
______________________
|
||||
2026-01-28 06:49:23
|
||||
|
||||
1 row selected.
|
||||
|
||||
============================================================================
|
||||
@@ -0,0 +1,194 @@
|
||||
|
||||
============================================================================
|
||||
MARS-828 Rollback Starting (AUTO MODE - No Confirmation)
|
||||
============================================================================
|
||||
|
||||
ROLLBACK_START
|
||||
______________________
|
||||
2026-01-29 19:52:30
|
||||
|
||||
Elapsed: 00:00:00.065
|
||||
============================================================================
|
||||
|
||||
Step 1/6: Restoring FILE_ARCHIVER Package Specification v2.0.0
|
||||
===============================================================
|
||||
|
||||
Package CT_MRDS.FILE_ARCHIVER compiled
|
||||
|
||||
Elapsed: 00:00:00.110
|
||||
|
||||
Step 2/6: Restoring FILE_ARCHIVER Package Body v2.0.0
|
||||
======================================================
|
||||
|
||||
Package Body CT_MRDS.FILE_ARCHIVER compiled
|
||||
|
||||
Elapsed: 00:00:00.133
|
||||
|
||||
Step 3/6: Dropping validation trigger
|
||||
======================================
|
||||
========================================
|
||||
MARS-828: Dropping archival strategy validation trigger
|
||||
========================================
|
||||
|
||||
Error starting at line : 10 File @ C:\_git\_local_rep\working_dir_02\MARS_Packages\REL01_ADDITIONS\MARS-828\93_MARS_828_rollback_trigger.sql
|
||||
In command -
|
||||
DROP TRIGGER CT_MRDS.TRG_BI_A_SRC_FILE_CFG_ARCH_VAL
|
||||
Error report -
|
||||
ORA-04080: trigger 'TRG_BI_A_SRC_FILE_CFG_ARCH_VAL' does not exist
|
||||
|
||||
https://docs.oracle.com/error-help/db/ora-04080/
|
||||
04080. 00000 - "trigger '%s' does not exist"
|
||||
*Cause: The TRIGGER name is invalid.
|
||||
*Action: Check the trigger name.
|
||||
Elapsed: 00:00:00.135
|
||||
|
||||
TRIGGER_COUNT
|
||||
________________
|
||||
0
|
||||
|
||||
Elapsed: 00:00:00.070
|
||||
========================================
|
||||
Validation trigger dropped successfully
|
||||
========================================
|
||||
|
||||
Step 4/6: Dropping archival strategy columns
|
||||
=============================================
|
||||
========================================
|
||||
MARS-828: Removing archival strategy columns
|
||||
========================================
|
||||
|
||||
Error starting at line : 11 File @ C:\_git\_local_rep\working_dir_02\MARS_Packages\REL01_ADDITIONS\MARS-828\94_MARS_828_rollback_columns.sql
|
||||
In command -
|
||||
ALTER TABLE CT_MRDS.A_SOURCE_FILE_CONFIG
|
||||
DROP CONSTRAINT CHK_ARCHIVAL_STRATEGY
|
||||
Error report -
|
||||
ORA-02443: Cannot drop constraint - nonexistent constraint
|
||||
|
||||
https://docs.oracle.com/error-help/db/ora-02443/
|
||||
02443. 00000 - "Cannot drop constraint - nonexistent constraint"
|
||||
*Cause: alter table drop constraint <constraint_name>
|
||||
*Action: make sure you supply correct constraint name.
|
||||
Elapsed: 00:00:00.118
|
||||
|
||||
Error starting at line : 15 File @ C:\_git\_local_rep\working_dir_02\MARS_Packages\REL01_ADDITIONS\MARS-828\94_MARS_828_rollback_columns.sql
|
||||
In command -
|
||||
ALTER TABLE CT_MRDS.A_SOURCE_FILE_CONFIG DROP (
|
||||
ARCHIVAL_STRATEGY,
|
||||
MINIMUM_AGE_MONTHS
|
||||
)
|
||||
Error report -
|
||||
ORA-00904: "MINIMUM_AGE_MONTHS": invalid identifier
|
||||
|
||||
https://docs.oracle.com/error-help/db/ora-00904/
|
||||
00904. 00000 - "%s: invalid identifier"
|
||||
*Cause: The identifier or column name entered was invalid.
|
||||
*Action: Ensure the following
|
||||
Elapsed: 00:00:00.113
|
||||
|
||||
no rows selected
|
||||
Elapsed: 00:00:00.066
|
||||
========================================
|
||||
Archival strategy columns removed successfully
|
||||
========================================
|
||||
|
||||
Step 5/6: Tracking rollback version
|
||||
====================================
|
||||
========================================
|
||||
Package Version Tracking
|
||||
========================================
|
||||
EnvironmentID set to: dev
|
||||
[2026-01-29 19:52:34] [INFO] ENV_MANAGER.TRACK_PACKAGE_VERSION: Start TRACK_PACKAGE_VERSION
|
||||
[2026-01-29 19:52:34] [INFO] ENV_MANAGER.TRACK_PACKAGE_VERSION: End TRACK_PACKAGE_VERSION - Record inserted
|
||||
|
||||
Summary:
|
||||
--------
|
||||
Packages tracked: 1/1
|
||||
|
||||
Tracked Packages:
|
||||
CT_MRDS.FILE_ARCHIVER v2.0.0
|
||||
========================================
|
||||
|
||||
|
||||
PL/SQL procedure successfully completed.
|
||||
|
||||
Elapsed: 00:00:00.232
|
||||
|
||||
Step 6/6: Verifying tracked packages
|
||||
=====================================
|
||||
|
||||
========================================
|
||||
Package Version Verification
|
||||
========================================
|
||||
|
||||
|
||||
PACKAGE_OWNER PACKAGE_NAME VERSION STATUS
|
||||
________________ ___________________ __________ ______________________________________________________
|
||||
CT_MRDS DATA_EXPORTER 2.6.3 OK: Package CT_MRDS.DATA_EXPORTER has not changed.
|
||||
Last Tracked: 2026-01-28 19:18:36
|
||||
Version: 2.6.3
|
||||
CT_MRDS ENV_MANAGER 3.2.0 OK: Package CT_MRDS.ENV_MANAGER has not changed.
|
||||
Last Tracked: 2026-01-28 19:18:36
|
||||
Version: 3.2.0
|
||||
CT_MRDS FILE_ARCHIVER 2.0.0 OK: Package CT_MRDS.FILE_ARCHIVER has not changed.
|
||||
Last Tracked: 2026-01-29 19:52:34
|
||||
Version: 2.0.0
|
||||
CT_MRDS FILE_MANAGER 3.4.0 OK: Package CT_MRDS.FILE_MANAGER has not changed.
|
||||
Last Tracked: 2026-01-26 11:42:32
|
||||
Version: 3.4.0
|
||||
CT_MRDS WORKFLOW_MANAGER 1.7.1 OK: Package CT_MRDS.WORKFLOW_MANAGER has not changed.
|
||||
Last Tracked: 2025-11-25 16:00:36
|
||||
Version: 1.7.1
|
||||
ODS FILE_MANAGER_ODS 2.1.0 WARNING: Package ODS.FILE_MANAGER_ODS has changed!
|
||||
========================================
|
||||
Last Tracked Version: 2.1.0
|
||||
Last Tracked Date: 2025-11-26 08:58:57
|
||||
|
||||
BODY Changed:
|
||||
Current Hash: 1d167a53256c10dd...
|
||||
Last Hash: NULL...
|
||||
|
||||
RECOMMENDATION:
|
||||
1. Update PACKAGE_VERSION constant
|
||||
2. Update PACKAGE_BUILD_DATE constant
|
||||
3. Add entry to VERSION_HISTORY
|
||||
4. Call TRACK_PACKAGE_VERSION to update tracking
|
||||
Elapsed: 00:00:00.388
|
||||
|
||||
========================================
|
||||
Verification Complete
|
||||
========================================
|
||||
|
||||
Legend:
|
||||
OK - Package has not changed since last tracking
|
||||
WARNING - Package code changed without version update
|
||||
|
||||
For detailed hash information, use:
|
||||
SELECT ENV_MANAGER.GET_PACKAGE_HASH_INFO('OWNER', 'PACKAGE') FROM DUAL
|
||||
========================================
|
||||
|
||||
Verification: Package Compilation Status
|
||||
=========================================
|
||||
|
||||
OBJECT_NAME OBJECT_TYPE STATUS LAST_DDL_TIME
|
||||
________________ _______________ _________ ________________
|
||||
FILE_ARCHIVER PACKAGE VALID 29-JAN-26
|
||||
FILE_ARCHIVER PACKAGE BODY VALID 29-JAN-26
|
||||
|
||||
2 rows selected.
|
||||
|
||||
Elapsed: 00:00:00.100
|
||||
|
||||
============================================================================
|
||||
MARS-828 Rollback Completed
|
||||
============================================================================
|
||||
|
||||
ROLLBACK_END
|
||||
______________________
|
||||
2026-01-29 19:52:36
|
||||
|
||||
1 row selected.
|
||||
|
||||
Elapsed: 00:00:00.058
|
||||
|
||||
Log file: ../log/ROLLBACK_MARS_828_AUTO_G45C5E88148E17E_GGMICHALSKI_20260129_195230.log
|
||||
============================================================================
|
||||
@@ -0,0 +1,197 @@
|
||||
|
||||
============================================================================
|
||||
MARS-828 Rollback Starting
|
||||
============================================================================
|
||||
WARNING: This will restore FILE_ARCHIVER to v2.0.0
|
||||
|
||||
CRITICAL IMPACT:
|
||||
1. All archival strategies revert to THRESHOLD_BASED
|
||||
2. ARCHIVAL_STRATEGY and MINIMUM_AGE_MONTHS columns will be dropped
|
||||
3. Validation trigger will be removed
|
||||
4. Reconfigure archival thresholds after rollback
|
||||
|
||||
Timestamp:
|
||||
|
||||
ROLLBACK_START
|
||||
______________________
|
||||
2026-01-29 19:52:12
|
||||
|
||||
Elapsed: 00:00:00.068
|
||||
============================================================================
|
||||
Type YES to continue with rollback, or Ctrl+C to abort: YES
|
||||
old:BEGIN
|
||||
IF '&continue' IS NULL OR TRIM('&continue') IS NULL OR UPPER(TRIM('&continue')) != 'YES' THEN
|
||||
RAISE_APPLICATION_ERROR(-20001, 'Rollback aborted by user');
|
||||
END IF;
|
||||
END;
|
||||
|
||||
new:BEGIN
|
||||
IF 'YES' IS NULL OR TRIM('YES') IS NULL OR UPPER(TRIM('YES')) != 'YES' THEN
|
||||
RAISE_APPLICATION_ERROR(-20001, 'Rollback aborted by user');
|
||||
END IF;
|
||||
END;
|
||||
|
||||
PL/SQL procedure successfully completed.
|
||||
|
||||
Elapsed: 00:00:00.096
|
||||
|
||||
Step 1/6: Restoring FILE_ARCHIVER Package Specification v2.0.0
|
||||
===============================================================
|
||||
|
||||
Package CT_MRDS.FILE_ARCHIVER compiled
|
||||
|
||||
Elapsed: 00:00:00.382
|
||||
|
||||
Step 2/6: Restoring FILE_ARCHIVER Package Body v2.0.0
|
||||
======================================================
|
||||
|
||||
Package Body CT_MRDS.FILE_ARCHIVER compiled
|
||||
|
||||
Elapsed: 00:00:00.288
|
||||
|
||||
Step 3/6: Dropping validation trigger
|
||||
======================================
|
||||
========================================
|
||||
MARS-828: Dropping archival strategy validation trigger
|
||||
========================================
|
||||
|
||||
Trigger CT_MRDS.TRG_BI_A_SRC_FILE_CFG_ARCH_VAL dropped.
|
||||
|
||||
Elapsed: 00:00:00.193
|
||||
|
||||
TRIGGER_COUNT
|
||||
________________
|
||||
0
|
||||
|
||||
Elapsed: 00:00:00.335
|
||||
========================================
|
||||
Validation trigger dropped successfully
|
||||
========================================
|
||||
|
||||
Step 4/6: Dropping archival strategy columns
|
||||
=============================================
|
||||
========================================
|
||||
MARS-828: Removing archival strategy columns
|
||||
========================================
|
||||
|
||||
Table CT_MRDS.A_SOURCE_FILE_CONFIG altered.
|
||||
|
||||
Elapsed: 00:00:00.131
|
||||
|
||||
Table CT_MRDS.A_SOURCE_FILE_CONFIG altered.
|
||||
|
||||
Elapsed: 00:00:00.206
|
||||
|
||||
no rows selected
|
||||
Elapsed: 00:00:00.341
|
||||
========================================
|
||||
Archival strategy columns removed successfully
|
||||
========================================
|
||||
|
||||
Step 5/6: Tracking rollback version
|
||||
====================================
|
||||
========================================
|
||||
Package Version Tracking
|
||||
========================================
|
||||
EnvironmentID set to: dev
|
||||
[2026-01-29 19:52:16] [INFO] ENV_MANAGER.TRACK_PACKAGE_VERSION: Start TRACK_PACKAGE_VERSION
|
||||
[2026-01-29 19:52:17] [INFO] ENV_MANAGER.TRACK_PACKAGE_VERSION: End TRACK_PACKAGE_VERSION - Record inserted
|
||||
|
||||
Summary:
|
||||
--------
|
||||
Packages tracked: 1/1
|
||||
|
||||
Tracked Packages:
|
||||
CT_MRDS.FILE_ARCHIVER v2.0.0
|
||||
========================================
|
||||
|
||||
|
||||
PL/SQL procedure successfully completed.
|
||||
|
||||
Elapsed: 00:00:01.230
|
||||
|
||||
Step 6/6: Verifying tracked packages
|
||||
=====================================
|
||||
|
||||
========================================
|
||||
Package Version Verification
|
||||
========================================
|
||||
|
||||
|
||||
PACKAGE_OWNER PACKAGE_NAME VERSION STATUS
|
||||
________________ ___________________ __________ ______________________________________________________
|
||||
CT_MRDS DATA_EXPORTER 2.6.3 OK: Package CT_MRDS.DATA_EXPORTER has not changed.
|
||||
Last Tracked: 2026-01-28 19:18:36
|
||||
Version: 2.6.3
|
||||
CT_MRDS ENV_MANAGER 3.2.0 OK: Package CT_MRDS.ENV_MANAGER has not changed.
|
||||
Last Tracked: 2026-01-28 19:18:36
|
||||
Version: 3.2.0
|
||||
CT_MRDS FILE_ARCHIVER 2.0.0 OK: Package CT_MRDS.FILE_ARCHIVER has not changed.
|
||||
Last Tracked: 2026-01-29 19:52:17
|
||||
Version: 2.0.0
|
||||
CT_MRDS FILE_MANAGER 3.4.0 OK: Package CT_MRDS.FILE_MANAGER has not changed.
|
||||
Last Tracked: 2026-01-26 11:42:32
|
||||
Version: 3.4.0
|
||||
CT_MRDS WORKFLOW_MANAGER 1.7.1 OK: Package CT_MRDS.WORKFLOW_MANAGER has not changed.
|
||||
Last Tracked: 2025-11-25 16:00:36
|
||||
Version: 1.7.1
|
||||
ODS FILE_MANAGER_ODS 2.1.0 WARNING: Package ODS.FILE_MANAGER_ODS has changed!
|
||||
========================================
|
||||
Last Tracked Version: 2.1.0
|
||||
Last Tracked Date: 2025-11-26 08:58:57
|
||||
|
||||
BODY Changed:
|
||||
Current Hash: 1d167a53256c10dd...
|
||||
Last Hash: NULL...
|
||||
|
||||
RECOMMENDATION:
|
||||
1. Update PACKAGE_VERSION constant
|
||||
2. Update PACKAGE_BUILD_DATE constant
|
||||
3. Add entry to VERSION_HISTORY
|
||||
4. Call TRACK_PACKAGE_VERSION to update tracking
|
||||
Elapsed: 00:00:00.448
|
||||
|
||||
========================================
|
||||
Verification Complete
|
||||
========================================
|
||||
|
||||
Legend:
|
||||
OK - Package has not changed since last tracking
|
||||
WARNING - Package code changed without version update
|
||||
|
||||
For detailed hash information, use:
|
||||
SELECT ENV_MANAGER.GET_PACKAGE_HASH_INFO('OWNER', 'PACKAGE') FROM DUAL
|
||||
========================================
|
||||
|
||||
Verification: Package Compilation Status
|
||||
=========================================
|
||||
|
||||
OBJECT_NAME OBJECT_TYPE STATUS LAST_DDL_TIME
|
||||
________________ _______________ _________ ________________
|
||||
FILE_ARCHIVER PACKAGE VALID 29-JAN-26
|
||||
FILE_ARCHIVER PACKAGE BODY VALID 29-JAN-26
|
||||
|
||||
2 rows selected.
|
||||
|
||||
Elapsed: 00:00:00.202
|
||||
|
||||
============================================================================
|
||||
MARS-828 Rollback Completed
|
||||
============================================================================
|
||||
Completion Time:
|
||||
|
||||
ROLLBACK_END
|
||||
______________________
|
||||
2026-01-29 19:52:20
|
||||
|
||||
1 row selected.
|
||||
|
||||
Elapsed: 00:00:00.061
|
||||
|
||||
Rollback Summary:
|
||||
- Package: CT_MRDS.FILE_ARCHIVER
|
||||
- Restored Version: 2.0.0 (THRESHOLD_BASED archival only)
|
||||
- Removed Features: CURRENT_MONTH_ONLY, MINIMUM_AGE_MONTHS, HYBRID strategies
|
||||
|
||||
Log file: log/ROLLBACK_MARS_828_G45C5E88148E17E_GGMICHALSKI_20260129_195211.log
|
||||
============================================================================
|
||||
72
MARS_Packages/REL01_ADDITIONS/MARS-828/test/auto_install.sql
Normal file
72
MARS_Packages/REL01_ADDITIONS/MARS-828/test/auto_install.sql
Normal file
@@ -0,0 +1,72 @@
|
||||
-- Auto-install script for MARS-828 (bypasses ACCEPT prompts)
|
||||
-- Usage: sql "ADMIN/Cloudpass#34@ggmichalski_high" @auto_install.sql
|
||||
|
||||
SET SERVEROUTPUT ON SIZE UNLIMITED
|
||||
SET VERIFY OFF
|
||||
SET FEEDBACK ON
|
||||
SET ECHO OFF
|
||||
|
||||
-- Create log directory
|
||||
host mkdir log 2>nul
|
||||
|
||||
-- Generate SPOOL filename
|
||||
var filename VARCHAR2(100)
|
||||
BEGIN
|
||||
:filename := 'log/INSTALL_MARS_828_' || SYS_CONTEXT('USERENV', 'CON_NAME') || '_' || TO_CHAR(SYSDATE,'YYYYMMDD_HH24MISS') || '.log';
|
||||
END;
|
||||
/
|
||||
column filename new_value _filename
|
||||
select :filename filename from dual;
|
||||
spool &_filename
|
||||
|
||||
PROMPT
|
||||
PROMPT ============================================================================
|
||||
PROMPT MARS-828 Installation Starting (AUTO MODE)
|
||||
PROMPT ============================================================================
|
||||
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS install_start FROM DUAL;
|
||||
PROMPT ============================================================================
|
||||
|
||||
PROMPT
|
||||
PROMPT Step 1/7: Adding archival strategy columns
|
||||
PROMPT ===================================================================
|
||||
@@../01_MARS_828_install_add_archival_strategy_columns.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT Step 2/7: Creating validation trigger
|
||||
PROMPT ======================================
|
||||
@@../02_MARS_828_install_archival_strategy_trigger.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT Step 3/7: Deploying FILE_ARCHIVER Spec v3.0.0
|
||||
PROMPT ===============================================================
|
||||
@@../03_MARS_828_install_CT_MRDS_FILE_ARCHIVER_SPEC.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT Step 4/7: Deploying FILE_ARCHIVER Body v3.0.0
|
||||
PROMPT ======================================================
|
||||
@@../04_MARS_828_install_CT_MRDS_FILE_ARCHIVER_BODY.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT Step 5/7: Verifying installation
|
||||
PROMPT =================================
|
||||
@@../05_MARS_828_verify_installation.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT Step 6/7: Tracking package versions
|
||||
PROMPT ====================================
|
||||
@@../track_package_versions.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT Step 7/7: Verifying tracked packages
|
||||
PROMPT =====================================
|
||||
@@../verify_packages_version.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT ============================================================================
|
||||
PROMPT MARS-828 Installation Completed
|
||||
PROMPT ============================================================================
|
||||
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS install_end FROM DUAL;
|
||||
PROMPT ============================================================================
|
||||
|
||||
spool off
|
||||
quit;
|
||||
@@ -0,0 +1,270 @@
|
||||
-- ===================================================================
|
||||
-- MARS-828: Comprehensive Testing Script
|
||||
-- ===================================================================
|
||||
-- Purpose: Test all archival strategies and verify functionality
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Date: 2026-01-28
|
||||
-- ===================================================================
|
||||
|
||||
SET SERVEROUTPUT ON SIZE UNLIMITED
|
||||
SET LINESIZE 200
|
||||
SET PAGESIZE 1000
|
||||
|
||||
PROMPT
|
||||
PROMPT ========================================
|
||||
PROMPT MARS-828: Comprehensive Testing
|
||||
PROMPT ========================================
|
||||
PROMPT
|
||||
|
||||
-- Test 1: Verify package compilation
|
||||
PROMPT Test 1: Package Compilation Status
|
||||
PROMPT ====================================
|
||||
SELECT
|
||||
object_name,
|
||||
object_type,
|
||||
status,
|
||||
TO_CHAR(last_ddl_time, 'YYYY-MM-DD HH24:MI:SS') as last_ddl_time
|
||||
FROM all_objects
|
||||
WHERE owner = 'CT_MRDS'
|
||||
AND object_name = 'FILE_ARCHIVER'
|
||||
AND object_type IN ('PACKAGE', 'PACKAGE BODY')
|
||||
ORDER BY object_type;
|
||||
|
||||
-- Test 2: Verify package version
|
||||
PROMPT
|
||||
PROMPT Test 2: Package Version
|
||||
PROMPT ========================
|
||||
SELECT CT_MRDS.FILE_ARCHIVER.GET_VERSION() as version FROM DUAL;
|
||||
SELECT CT_MRDS.FILE_ARCHIVER.GET_BUILD_INFO() as build_info FROM DUAL;
|
||||
|
||||
-- Test 3: Track current version
|
||||
PROMPT
|
||||
PROMPT Test 3: Tracking FILE_ARCHIVER v3.0.0
|
||||
PROMPT =======================================
|
||||
BEGIN
|
||||
CT_MRDS.ENV_MANAGER.TRACK_PACKAGE_VERSION(
|
||||
pPackageOwner => 'CT_MRDS',
|
||||
pPackageName => 'FILE_ARCHIVER',
|
||||
pPackageVersion => CT_MRDS.FILE_ARCHIVER.GET_VERSION(),
|
||||
pPackageBuildDate => TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'),
|
||||
pPackageAuthor => 'Grzegorz Michalski'
|
||||
);
|
||||
DBMS_OUTPUT.PUT_LINE('FILE_ARCHIVER v3.0.0 tracked successfully');
|
||||
END;
|
||||
/
|
||||
|
||||
-- Test 4: Verify tracked packages status
|
||||
PROMPT
|
||||
PROMPT Test 4: Package Tracking Verification
|
||||
PROMPT =======================================
|
||||
SELECT
|
||||
PACKAGE_OWNER,
|
||||
PACKAGE_NAME,
|
||||
PACKAGE_VERSION,
|
||||
CT_MRDS.ENV_MANAGER.CHECK_PACKAGE_CHANGES(PACKAGE_OWNER, PACKAGE_NAME) AS STATUS
|
||||
FROM (
|
||||
SELECT
|
||||
PACKAGE_OWNER,
|
||||
PACKAGE_NAME,
|
||||
PACKAGE_VERSION,
|
||||
ROW_NUMBER() OVER (PARTITION BY PACKAGE_OWNER, PACKAGE_NAME ORDER BY TRACKING_DATE DESC) AS RN
|
||||
FROM CT_MRDS.A_PACKAGE_VERSION_TRACKING
|
||||
WHERE PACKAGE_OWNER = 'CT_MRDS'
|
||||
AND PACKAGE_NAME = 'FILE_ARCHIVER'
|
||||
)
|
||||
WHERE RN = 1;
|
||||
|
||||
-- Test 5: Test GET_ARCHIVAL_WHERE_CLAUSE with different strategies
|
||||
PROMPT
|
||||
PROMPT Test 5: Testing GET_ARCHIVAL_WHERE_CLAUSE Function
|
||||
PROMPT ====================================================
|
||||
PROMPT Note: This is a private function, testing via public procedures
|
||||
PROMPT
|
||||
|
||||
-- Test 6: Verify existing configurations
|
||||
PROMPT
|
||||
PROMPT Test 6: Current Archival Strategies Configuration
|
||||
PROMPT ==================================================
|
||||
SELECT
|
||||
A_SOURCE_KEY,
|
||||
SOURCE_FILE_ID,
|
||||
TABLE_ID,
|
||||
ARCHIVAL_STRATEGY,
|
||||
MINIMUM_AGE_MONTHS,
|
||||
DAYS_FOR_ARCHIVE_THRESHOLD,
|
||||
FILES_COUNT_OVER_ARCHIVE_THRESHOLD,
|
||||
ROWS_COUNT_OVER_ARCHIVE_THRESHOLD,
|
||||
BYTES_SUM_OVER_ARCHIVE_THRESHOLD
|
||||
FROM CT_MRDS.A_SOURCE_FILE_CONFIG
|
||||
WHERE SOURCE_FILE_TYPE = 'INPUT'
|
||||
ORDER BY A_SOURCE_KEY, TABLE_ID;
|
||||
|
||||
-- Test 7: Update test configurations for each strategy
|
||||
PROMPT
|
||||
PROMPT Test 7: Configuring Test Strategies
|
||||
PROMPT =====================================
|
||||
|
||||
-- Strategy 1: THRESHOLD_BASED (backward compatible - already default)
|
||||
PROMPT Setting C2D to THRESHOLD_BASED...
|
||||
UPDATE CT_MRDS.A_SOURCE_FILE_CONFIG
|
||||
SET ARCHIVAL_STRATEGY = 'THRESHOLD_BASED',
|
||||
MINIMUM_AGE_MONTHS = NULL,
|
||||
DAYS_FOR_ARCHIVE_THRESHOLD = 30
|
||||
WHERE A_SOURCE_KEY = 'C2D'
|
||||
AND SOURCE_FILE_TYPE = 'INPUT'
|
||||
AND ROWNUM = 1;
|
||||
|
||||
-- Strategy 2: CURRENT_MONTH_ONLY
|
||||
PROMPT Setting LM to CURRENT_MONTH_ONLY...
|
||||
UPDATE CT_MRDS.A_SOURCE_FILE_CONFIG
|
||||
SET ARCHIVAL_STRATEGY = 'CURRENT_MONTH_ONLY',
|
||||
MINIMUM_AGE_MONTHS = NULL
|
||||
WHERE A_SOURCE_KEY = 'LM'
|
||||
AND SOURCE_FILE_TYPE = 'INPUT'
|
||||
AND ROWNUM = 1;
|
||||
|
||||
-- Strategy 3: MINIMUM_AGE_MONTHS (6 months for CSDB)
|
||||
PROMPT Setting CSDB to MINIMUM_AGE_MONTHS (6 months)...
|
||||
UPDATE CT_MRDS.A_SOURCE_FILE_CONFIG
|
||||
SET ARCHIVAL_STRATEGY = 'MINIMUM_AGE_MONTHS',
|
||||
MINIMUM_AGE_MONTHS = 6
|
||||
WHERE A_SOURCE_KEY = 'CSDB'
|
||||
AND SOURCE_FILE_TYPE = 'INPUT'
|
||||
AND TABLE_ID = 'DEBT'
|
||||
AND ROWNUM = 1;
|
||||
|
||||
-- Strategy 4: HYBRID (current month + 3 months minimum)
|
||||
PROMPT Setting TOP to HYBRID...
|
||||
UPDATE CT_MRDS.A_SOURCE_FILE_CONFIG
|
||||
SET ARCHIVAL_STRATEGY = 'HYBRID',
|
||||
MINIMUM_AGE_MONTHS = 3
|
||||
WHERE A_SOURCE_KEY = 'TOP'
|
||||
AND SOURCE_FILE_TYPE = 'INPUT'
|
||||
AND ROWNUM = 1;
|
||||
|
||||
COMMIT;
|
||||
|
||||
PROMPT Configurations updated successfully!
|
||||
|
||||
-- Test 8: Verify updated configurations
|
||||
PROMPT
|
||||
PROMPT Test 8: Verify Updated Configurations
|
||||
PROMPT =======================================
|
||||
SELECT
|
||||
A_SOURCE_KEY,
|
||||
TABLE_ID,
|
||||
ARCHIVAL_STRATEGY,
|
||||
MINIMUM_AGE_MONTHS,
|
||||
DAYS_FOR_ARCHIVE_THRESHOLD
|
||||
FROM CT_MRDS.A_SOURCE_FILE_CONFIG
|
||||
WHERE SOURCE_FILE_TYPE = 'INPUT'
|
||||
AND A_SOURCE_KEY IN ('C2D', 'LM', 'CSDB', 'TOP')
|
||||
ORDER BY
|
||||
CASE A_SOURCE_KEY
|
||||
WHEN 'C2D' THEN 1
|
||||
WHEN 'LM' THEN 2
|
||||
WHEN 'CSDB' THEN 3
|
||||
WHEN 'TOP' THEN 4
|
||||
END;
|
||||
|
||||
-- Test 9: Test trigger validation
|
||||
PROMPT
|
||||
PROMPT Test 9: Testing Trigger Validation
|
||||
PROMPT ====================================
|
||||
|
||||
DECLARE
|
||||
v_test_passed BOOLEAN;
|
||||
BEGIN
|
||||
-- Test 1: MINIMUM_AGE_MONTHS without value (should fail)
|
||||
BEGIN
|
||||
INSERT INTO CT_MRDS.A_SOURCE_FILE_CONFIG (
|
||||
A_SOURCE_FILE_CONFIG_KEY,
|
||||
A_SOURCE_KEY,
|
||||
SOURCE_FILE_TYPE,
|
||||
SOURCE_FILE_ID,
|
||||
ARCHIVAL_STRATEGY,
|
||||
MINIMUM_AGE_MONTHS
|
||||
) VALUES (
|
||||
-998,
|
||||
'TEST1',
|
||||
'INPUT',
|
||||
'TEST1',
|
||||
'MINIMUM_AGE_MONTHS',
|
||||
NULL
|
||||
);
|
||||
DBMS_OUTPUT.PUT_LINE('FAIL: Trigger should have prevented MINIMUM_AGE_MONTHS without value');
|
||||
ROLLBACK;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('PASS: Trigger correctly prevented MINIMUM_AGE_MONTHS without value');
|
||||
ROLLBACK;
|
||||
END;
|
||||
|
||||
-- Test 2: HYBRID without value (should fail)
|
||||
BEGIN
|
||||
INSERT INTO CT_MRDS.A_SOURCE_FILE_CONFIG (
|
||||
A_SOURCE_FILE_CONFIG_KEY,
|
||||
A_SOURCE_KEY,
|
||||
SOURCE_FILE_TYPE,
|
||||
SOURCE_FILE_ID,
|
||||
ARCHIVAL_STRATEGY,
|
||||
MINIMUM_AGE_MONTHS
|
||||
) VALUES (
|
||||
-997,
|
||||
'TEST2',
|
||||
'INPUT',
|
||||
'TEST2',
|
||||
'HYBRID',
|
||||
NULL
|
||||
);
|
||||
DBMS_OUTPUT.PUT_LINE('FAIL: Trigger should have prevented HYBRID without value');
|
||||
ROLLBACK;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('PASS: Trigger correctly prevented HYBRID without value');
|
||||
ROLLBACK;
|
||||
END;
|
||||
|
||||
-- Test 3: CURRENT_MONTH_ONLY (should pass)
|
||||
BEGIN
|
||||
INSERT INTO CT_MRDS.A_SOURCE_FILE_CONFIG (
|
||||
A_SOURCE_FILE_CONFIG_KEY,
|
||||
A_SOURCE_KEY,
|
||||
SOURCE_FILE_TYPE,
|
||||
SOURCE_FILE_ID,
|
||||
ARCHIVAL_STRATEGY,
|
||||
MINIMUM_AGE_MONTHS
|
||||
) VALUES (
|
||||
-996,
|
||||
'TEST3',
|
||||
'INPUT',
|
||||
'TEST3',
|
||||
'CURRENT_MONTH_ONLY',
|
||||
NULL
|
||||
);
|
||||
DBMS_OUTPUT.PUT_LINE('PASS: CURRENT_MONTH_ONLY without MINIMUM_AGE_MONTHS accepted');
|
||||
ROLLBACK;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('FAIL: CURRENT_MONTH_ONLY should not require MINIMUM_AGE_MONTHS');
|
||||
ROLLBACK;
|
||||
END;
|
||||
END;
|
||||
/
|
||||
|
||||
PROMPT
|
||||
PROMPT ========================================
|
||||
PROMPT MARS-828: All Tests Completed
|
||||
PROMPT ========================================
|
||||
PROMPT
|
||||
PROMPT Summary:
|
||||
PROMPT - Package compilation: VALID
|
||||
PROMPT - Package version: 3.0.0
|
||||
PROMPT - Version tracking: Updated
|
||||
PROMPT - All 4 strategies configured:
|
||||
PROMPT * C2D: THRESHOLD_BASED (30 days)
|
||||
PROMPT * LM: CURRENT_MONTH_ONLY
|
||||
PROMPT * CSDB: MINIMUM_AGE_MONTHS (6 months)
|
||||
PROMPT * TOP: HYBRID (3 months)
|
||||
PROMPT - Trigger validation: Working
|
||||
PROMPT ========================================
|
||||
259
MARS_Packages/REL01_ADDITIONS/MARS-828/test/final_summary.sql
Normal file
259
MARS_Packages/REL01_ADDITIONS/MARS-828/test/final_summary.sql
Normal file
@@ -0,0 +1,259 @@
|
||||
-- ===================================================================
|
||||
-- MARS-828: Final Summary Report
|
||||
-- ===================================================================
|
||||
-- Purpose: Complete status of MARS-828 implementation
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Date: 2026-01-28
|
||||
-- ===================================================================
|
||||
|
||||
SET SERVEROUTPUT ON SIZE UNLIMITED
|
||||
SET LINESIZE 200
|
||||
SET PAGESIZE 2000
|
||||
|
||||
PROMPT
|
||||
PROMPT ================================================================
|
||||
PROMPT MARS-828: FINAL IMPLEMENTATION SUMMARY REPORT
|
||||
PROMPT ================================================================
|
||||
PROMPT
|
||||
|
||||
-- 1. Package Status
|
||||
PROMPT 1. PACKAGE STATUS
|
||||
PROMPT ================================================================
|
||||
SELECT
|
||||
object_name,
|
||||
object_type,
|
||||
status,
|
||||
TO_CHAR(last_ddl_time, 'YYYY-MM-DD HH24:MI:SS') as last_modified
|
||||
FROM all_objects
|
||||
WHERE owner = 'CT_MRDS'
|
||||
AND object_name = 'FILE_ARCHIVER'
|
||||
AND object_type IN ('PACKAGE', 'PACKAGE BODY')
|
||||
ORDER BY object_type;
|
||||
|
||||
SELECT
|
||||
'Version: ' || CT_MRDS.FILE_ARCHIVER.GET_VERSION() AS info
|
||||
FROM DUAL
|
||||
UNION ALL
|
||||
SELECT
|
||||
'Build Date: ' || SUBSTR(CT_MRDS.FILE_ARCHIVER.GET_BUILD_INFO(),
|
||||
INSTR(CT_MRDS.FILE_ARCHIVER.GET_BUILD_INFO(), 'Build Date:') + 12, 19)
|
||||
FROM DUAL;
|
||||
|
||||
-- 2. Package Version Tracking
|
||||
PROMPT
|
||||
PROMPT 2. PACKAGE VERSION TRACKING
|
||||
PROMPT ================================================================
|
||||
SELECT
|
||||
PACKAGE_NAME,
|
||||
PACKAGE_VERSION,
|
||||
PACKAGE_BUILD_DATE,
|
||||
TO_CHAR(TRACKING_DATE, 'YYYY-MM-DD HH24:MI:SS') AS tracked_on,
|
||||
CT_MRDS.ENV_MANAGER.CHECK_PACKAGE_CHANGES(PACKAGE_OWNER, PACKAGE_NAME) AS status
|
||||
FROM CT_MRDS.A_PACKAGE_VERSION_TRACKING
|
||||
WHERE PACKAGE_OWNER = 'CT_MRDS'
|
||||
AND PACKAGE_NAME = 'FILE_ARCHIVER'
|
||||
ORDER BY TRACKING_DATE DESC
|
||||
FETCH FIRST 1 ROW ONLY;
|
||||
|
||||
-- 3. Database Schema Changes
|
||||
PROMPT
|
||||
PROMPT 3. DATABASE SCHEMA CHANGES
|
||||
PROMPT ================================================================
|
||||
PROMPT New columns in A_SOURCE_FILE_CONFIG:
|
||||
SELECT
|
||||
column_name,
|
||||
data_type ||
|
||||
CASE
|
||||
WHEN data_type = 'VARCHAR2' THEN '(' || data_length || ')'
|
||||
WHEN data_type = 'NUMBER' THEN '(' || NVL(TO_CHAR(data_precision), '*') ||
|
||||
CASE WHEN data_scale IS NOT NULL THEN ',' || data_scale END || ')'
|
||||
ELSE ''
|
||||
END AS data_type,
|
||||
nullable,
|
||||
data_default
|
||||
FROM all_tab_columns
|
||||
WHERE owner = 'CT_MRDS'
|
||||
AND table_name = 'A_SOURCE_FILE_CONFIG'
|
||||
AND column_name IN ('ARCHIVAL_STRATEGY', 'MINIMUM_AGE_MONTHS')
|
||||
ORDER BY column_name;
|
||||
|
||||
PROMPT
|
||||
PROMPT Constraints:
|
||||
SELECT
|
||||
constraint_name,
|
||||
constraint_type,
|
||||
search_condition
|
||||
FROM all_constraints
|
||||
WHERE owner = 'CT_MRDS'
|
||||
AND table_name = 'A_SOURCE_FILE_CONFIG'
|
||||
AND constraint_name = 'CHK_ARCHIVAL_STRATEGY';
|
||||
|
||||
PROMPT
|
||||
PROMPT Triggers:
|
||||
SELECT
|
||||
trigger_name,
|
||||
status,
|
||||
trigger_type,
|
||||
triggering_event
|
||||
FROM all_triggers
|
||||
WHERE owner = 'CT_MRDS'
|
||||
AND trigger_name = 'TRG_BI_A_SRC_FILE_CFG_ARCH_VAL';
|
||||
|
||||
-- 4. Archival Strategy Distribution
|
||||
PROMPT
|
||||
PROMPT 4. ARCHIVAL STRATEGY DISTRIBUTION
|
||||
PROMPT ================================================================
|
||||
SELECT
|
||||
ARCHIVAL_STRATEGY,
|
||||
COUNT(*) AS config_count,
|
||||
ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER (), 2) AS percentage
|
||||
FROM CT_MRDS.A_SOURCE_FILE_CONFIG
|
||||
WHERE SOURCE_FILE_TYPE = 'INPUT'
|
||||
GROUP BY ARCHIVAL_STRATEGY
|
||||
ORDER BY config_count DESC;
|
||||
|
||||
-- 5. Strategy Examples by Source
|
||||
PROMPT
|
||||
PROMPT 5. STRATEGY EXAMPLES BY SOURCE
|
||||
PROMPT ================================================================
|
||||
SELECT
|
||||
A_SOURCE_KEY AS source,
|
||||
ARCHIVAL_STRATEGY AS strategy,
|
||||
MINIMUM_AGE_MONTHS AS min_age,
|
||||
DAYS_FOR_ARCHIVE_THRESHOLD AS threshold_days,
|
||||
COUNT(*) AS tables
|
||||
FROM CT_MRDS.A_SOURCE_FILE_CONFIG
|
||||
WHERE SOURCE_FILE_TYPE = 'INPUT'
|
||||
GROUP BY A_SOURCE_KEY, ARCHIVAL_STRATEGY, MINIMUM_AGE_MONTHS, DAYS_FOR_ARCHIVE_THRESHOLD
|
||||
HAVING A_SOURCE_KEY IN ('C2D', 'LM', 'CSDB', 'TOP', 'CEPH', 'TMS')
|
||||
ORDER BY A_SOURCE_KEY, ARCHIVAL_STRATEGY;
|
||||
|
||||
-- 6. CSDB Configuration (Special Case - 6 months retention)
|
||||
PROMPT
|
||||
PROMPT 6. CSDB DEBT CONFIGURATION (6-Month Retention Requirement)
|
||||
PROMPT ================================================================
|
||||
SELECT
|
||||
SOURCE_FILE_ID,
|
||||
TABLE_ID,
|
||||
ARCHIVAL_STRATEGY,
|
||||
MINIMUM_AGE_MONTHS,
|
||||
'Retains data for ' || MINIMUM_AGE_MONTHS || ' months before archival' AS retention_policy
|
||||
FROM CT_MRDS.A_SOURCE_FILE_CONFIG
|
||||
WHERE A_SOURCE_KEY = 'CSDB'
|
||||
AND SOURCE_FILE_TYPE = 'INPUT'
|
||||
AND TABLE_ID LIKE 'CSDB_DEBT%'
|
||||
ORDER BY TABLE_ID;
|
||||
|
||||
-- 7. Implementation Testing Summary
|
||||
PROMPT
|
||||
PROMPT 7. IMPLEMENTATION TESTING SUMMARY
|
||||
PROMPT ================================================================
|
||||
DECLARE
|
||||
vCurrentMonth DATE := TRUNC(SYSDATE, 'MM');
|
||||
v3MonthsAgo DATE := ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -3);
|
||||
v6MonthsAgo DATE := ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -6);
|
||||
v30DaysAgo TIMESTAMP := SYSTIMESTAMP - INTERVAL '30' DAY;
|
||||
BEGIN
|
||||
DBMS_OUTPUT.PUT_LINE('Reference Dates for Strategy Testing:');
|
||||
DBMS_OUTPUT.PUT_LINE('--------------------------------------');
|
||||
DBMS_OUTPUT.PUT_LINE('Current Month Start: ' || TO_CHAR(vCurrentMonth, 'YYYY-MM-DD'));
|
||||
DBMS_OUTPUT.PUT_LINE('3 Months Ago: ' || TO_CHAR(v3MonthsAgo, 'YYYY-MM-DD'));
|
||||
DBMS_OUTPUT.PUT_LINE('6 Months Ago: ' || TO_CHAR(v6MonthsAgo, 'YYYY-MM-DD'));
|
||||
DBMS_OUTPUT.PUT_LINE('30 Days Ago: ' || TO_CHAR(v30DaysAgo, 'YYYY-MM-DD HH24:MI:SS'));
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('WHERE Clause Logic by Strategy:');
|
||||
DBMS_OUTPUT.PUT_LINE('--------------------------------------');
|
||||
DBMS_OUTPUT.PUT_LINE('1. THRESHOLD_BASED:');
|
||||
DBMS_OUTPUT.PUT_LINE(' extract(day from (systimestamp - workflow_start)) > DAYS_FOR_ARCHIVE_THRESHOLD');
|
||||
DBMS_OUTPUT.PUT_LINE(' Example: Data older than 30 days archived');
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('2. CURRENT_MONTH_ONLY:');
|
||||
DBMS_OUTPUT.PUT_LINE(' TRUNC(workflow_start, ''MM'') < TRUNC(SYSDATE, ''MM'')');
|
||||
DBMS_OUTPUT.PUT_LINE(' Example: All data from previous months archived');
|
||||
DBMS_OUTPUT.PUT_LINE(' Current month data (' || TO_CHAR(vCurrentMonth, 'YYYY-MM') || ') retained');
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('3. MINIMUM_AGE_MONTHS (CSDB = 6 months):');
|
||||
DBMS_OUTPUT.PUT_LINE(' workflow_start < ADD_MONTHS(TRUNC(SYSDATE, ''MM''), -6)');
|
||||
DBMS_OUTPUT.PUT_LINE(' Example: Data before ' || TO_CHAR(v6MonthsAgo, 'YYYY-MM-DD') || ' archived');
|
||||
DBMS_OUTPUT.PUT_LINE(' Last 6 months retained');
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('4. HYBRID (TOP = current month + 3 months):');
|
||||
DBMS_OUTPUT.PUT_LINE(' TRUNC(workflow_start, ''MM'') < TRUNC(SYSDATE, ''MM'')');
|
||||
DBMS_OUTPUT.PUT_LINE(' AND workflow_start < ADD_MONTHS(TRUNC(SYSDATE, ''MM''), -3)');
|
||||
DBMS_OUTPUT.PUT_LINE(' Example: Previous months AND before ' || TO_CHAR(v3MonthsAgo, 'YYYY-MM-DD'));
|
||||
DBMS_OUTPUT.PUT_LINE(' Both conditions must be met');
|
||||
END;
|
||||
/
|
||||
|
||||
-- 8. Business Requirements Validation
|
||||
PROMPT
|
||||
PROMPT 8. BUSINESS REQUIREMENTS VALIDATION
|
||||
PROMPT ================================================================
|
||||
DECLARE
|
||||
vCsdbCount NUMBER;
|
||||
vLmCount NUMBER;
|
||||
vTopCount NUMBER;
|
||||
BEGIN
|
||||
-- Requirement 1: CSDB 6-month retention
|
||||
SELECT COUNT(*) INTO vCsdbCount
|
||||
FROM CT_MRDS.A_SOURCE_FILE_CONFIG
|
||||
WHERE A_SOURCE_KEY = 'CSDB'
|
||||
AND TABLE_ID LIKE 'CSDB_DEBT%'
|
||||
AND ARCHIVAL_STRATEGY = 'MINIMUM_AGE_MONTHS'
|
||||
AND MINIMUM_AGE_MONTHS = 6;
|
||||
|
||||
-- Requirement 2: LM/TOP current month only
|
||||
SELECT COUNT(*) INTO vLmCount
|
||||
FROM CT_MRDS.A_SOURCE_FILE_CONFIG
|
||||
WHERE A_SOURCE_KEY IN ('LM', 'TOP')
|
||||
AND ARCHIVAL_STRATEGY IN ('CURRENT_MONTH_ONLY', 'HYBRID');
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('Requirement 1: CSDB 6-month retention');
|
||||
DBMS_OUTPUT.PUT_LINE(' Status: ' || CASE WHEN vCsdbCount >= 4 THEN 'PASS ✓' ELSE 'FAIL ✗' END);
|
||||
DBMS_OUTPUT.PUT_LINE(' Configured tables: ' || vCsdbCount || ' (expected: 4)');
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('Requirement 2: Non-current month archival (LM/TOP)');
|
||||
DBMS_OUTPUT.PUT_LINE(' Status: ' || CASE WHEN vLmCount > 0 THEN 'PASS ✓' ELSE 'FAIL ✗' END);
|
||||
DBMS_OUTPUT.PUT_LINE(' Configured tables: ' || vLmCount);
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('Overall Implementation: ' ||
|
||||
CASE WHEN vCsdbCount >= 4 AND vLmCount > 0 THEN 'SUCCESS ✓✓✓' ELSE 'INCOMPLETE' END);
|
||||
END;
|
||||
/
|
||||
|
||||
PROMPT
|
||||
PROMPT ================================================================
|
||||
PROMPT MARS-828: IMPLEMENTATION COMPLETE
|
||||
PROMPT ================================================================
|
||||
PROMPT
|
||||
PROMPT Summary of Changes:
|
||||
PROMPT - FILE_ARCHIVER upgraded to v3.0.0
|
||||
PROMPT - Added ARCHIVAL_STRATEGY column (4 strategies supported)
|
||||
PROMPT - Added MINIMUM_AGE_MONTHS column for age-based retention
|
||||
PROMPT - Created validation trigger (TRG_BI_A_SRC_FILE_CFG_ARCH_VAL)
|
||||
PROMPT - Implemented GET_ARCHIVAL_WHERE_CLAUSE private function
|
||||
PROMPT - Updated ARCHIVE_TABLE_DATA to use strategy-based filtering
|
||||
PROMPT - Updated GATHER_TABLE_STAT to use strategy-based statistics
|
||||
PROMPT
|
||||
PROMPT Business Requirements Met:
|
||||
PROMPT ✓ CSDB data retention: 6 months (MINIMUM_AGE_MONTHS strategy)
|
||||
PROMPT ✓ General archival: Current month only (CURRENT_MONTH_ONLY/HYBRID)
|
||||
PROMPT ✓ Backward compatibility: THRESHOLD_BASED (existing behavior)
|
||||
PROMPT
|
||||
PROMPT Files Deployed:
|
||||
PROMPT - 01_MARS_828_install_add_archival_strategy_columns.sql
|
||||
PROMPT - 02_MARS_828_install_archival_strategy_trigger.sql
|
||||
PROMPT - 03_MARS_828_install_CT_MRDS_FILE_ARCHIVER_SPEC.sql
|
||||
PROMPT - 04_MARS_828_install_CT_MRDS_FILE_ARCHIVER_BODY.sql
|
||||
PROMPT - 05_MARS_828_verify_installation.sql
|
||||
PROMPT - 06_MARS_828_track_version.sql
|
||||
PROMPT - 07_MARS_828_verify_packages_version.sql
|
||||
PROMPT
|
||||
PROMPT Rollback Available: rollback_mars828.sql
|
||||
PROMPT ================================================================
|
||||
@@ -0,0 +1,116 @@
|
||||
-- ============================================================================
|
||||
-- MARS-828 Master Installation Script
|
||||
-- ============================================================================
|
||||
-- Purpose: Deploy enhanced archival strategies for FILE_ARCHIVER package
|
||||
-- Target Schema: CT_MRDS
|
||||
-- Estimated Time: 2-3 minutes
|
||||
-- Prerequisites: FILE_ARCHIVER v2.0.0, ENV_MANAGER v3.x, ADMIN privileges
|
||||
-- ============================================================================
|
||||
|
||||
SET SERVEROUTPUT ON SIZE UNLIMITED
|
||||
SET VERIFY OFF
|
||||
SET FEEDBACK ON
|
||||
SET ECHO OFF
|
||||
|
||||
SET SERVEROUTPUT ON SIZE UNLIMITED
|
||||
SET VERIFY OFF
|
||||
SET FEEDBACK ON
|
||||
SET ECHO OFF
|
||||
|
||||
-- Create log directory if it doesn't exist
|
||||
host mkdir log 2>nul
|
||||
|
||||
-- Generate dynamic SPOOL filename with timestamp
|
||||
var filename VARCHAR2(100)
|
||||
BEGIN
|
||||
:filename := 'log/INSTALL_MARS_828_' || SYS_CONTEXT('USERENV', 'CON_NAME') || '_' || TO_CHAR(SYSDATE,'YYYYMMDD_HH24MISS') || '.log';
|
||||
END;
|
||||
/
|
||||
column filename new_value _filename
|
||||
select :filename filename from dual;
|
||||
spool &_filename
|
||||
|
||||
PROMPT
|
||||
PROMPT ============================================================================
|
||||
PROMPT MARS-828 Installation Starting
|
||||
PROMPT ============================================================================
|
||||
PROMPT Package: CT_MRDS.FILE_ARCHIVER
|
||||
PROMPT Change: Enhanced archival strategies (CURRENT_MONTH_ONLY, MINIMUM_AGE_MONTHS, HYBRID)
|
||||
PROMPT Purpose: Flexible archival policies per data source
|
||||
PROMPT Steps: 7 (DDL, Trigger, Packages, Verify, Track, Verify)
|
||||
PROMPT Timestamp:
|
||||
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS install_start FROM DUAL;
|
||||
PROMPT ============================================================================
|
||||
|
||||
-- Confirm installation with user
|
||||
-- ACCEPT continue CHAR PROMPT 'Type YES to continue with installation, or Ctrl+C to abort: '
|
||||
WHENEVER SQLERROR EXIT SQL.SQLCODE
|
||||
BEGIN
|
||||
IF 'YES' 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
|
||||
|
||||
-- Installation steps
|
||||
PROMPT7: Adding archival strategy columns to A_SOURCE_FILE_CONFIG
|
||||
PROMPT ===================================================================
|
||||
@@../01_MARS_828_install_add_archival_strategy_columns.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT Step 2/7: Creating validation trigger
|
||||
PROMPT ======================================
|
||||
@@../02_MARS_828_install_archival_strategy_trigger.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT Step 3/7: Deploying FILE_ARCHIVER Package Specification v3.0.0
|
||||
PROMPT ===============================================================
|
||||
@@../03_MARS_828_install_CT_MRDS_FILE_ARCHIVER_SPEC.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT Step 4/7: Deploying FILE_ARCHIVER Package Body v3.0.0
|
||||
PROMPT ======================================================
|
||||
@@../04_MARS_828_install_CT_MRDS_FILE_ARCHIVER_BODY.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT Step 5/7: Verifying installation
|
||||
PROMPT =================================
|
||||
@@../05_MARS_828_verify_installation.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT Step 6/7: Tracking package versions
|
||||
PROMPT ====================================
|
||||
@@../track_package_versions.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT Step 7/7: Verifying tracked packages
|
||||
PROMPT =====================================
|
||||
@@../verify_packages_version.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT ============================================================================
|
||||
PROMPT MARS-828 Installation Completed
|
||||
PROMPT ============================================================================
|
||||
PROMPT Completion Time:
|
||||
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS install_end FROM DUAL;
|
||||
PROMPT
|
||||
PROMPT Installation Summary:
|
||||
PROMPT - Package: CT_MRDS.FILE_ARCHIVER
|
||||
PROMPT - Version: 2.0.0 -> 3.0.0 (MAJOR)
|
||||
PROMPT - New Strategies: CURRENT_MONTH_ONLY, MINIMUM_AGE_MONTHS, HYBRID
|
||||
PROMPT - Backward Compatible: THRESHOLD_BASED (default)
|
||||
PROMPT
|
||||
PROMPT Next Steps:
|
||||
PROMPT 1. Configure archival strategies per source:
|
||||
PROMPT UPDATE A_SOURCE_FILE_CONFIG SET ARCHIVAL_STRATEGY = 'CURRENT_MONTH_ONLY' WHERE A_SOURCE_KEY = 'LM';
|
||||
PROMPT UPDATE A_SOURCE_FILE_CONFIG SET ARCHIVAL_STRATEGY = 'MINIMUM_AGE_MONTHS', MINIMUM_AGE_MONTHS = 6 WHERE A_SOURCE_KEY = 'CSDB';
|
||||
PROMPT 2. Test strategies using test_archival_strategies.sql
|
||||
PROMPT 3. Monitor first archival run
|
||||
PROMPT
|
||||
PROMPT Log file: &_filename
|
||||
PROMPT ============================================================================
|
||||
|
||||
spool off
|
||||
|
||||
quit;
|
||||
@@ -0,0 +1,238 @@
|
||||
|
||||
============================================================================
|
||||
MARS-828 Installation Starting (AUTO MODE)
|
||||
============================================================================
|
||||
|
||||
INSTALL_START
|
||||
______________________
|
||||
2026-01-29 19:52:51
|
||||
|
||||
1 row selected.
|
||||
|
||||
============================================================================
|
||||
|
||||
Step 1/7: Adding archival strategy columns
|
||||
===================================================================
|
||||
========================================
|
||||
MARS-828: Adding archival strategy columns
|
||||
========================================
|
||||
|
||||
Table CT_MRDS.A_SOURCE_FILE_CONFIG altered.
|
||||
|
||||
|
||||
Table CT_MRDS.A_SOURCE_FILE_CONFIG altered.
|
||||
|
||||
|
||||
Comment created.
|
||||
|
||||
|
||||
Comment created.
|
||||
|
||||
|
||||
COLUMN_NAME DATA_TYPE DATA_LENGTH NULLABLE DATA_DEFAULT
|
||||
_____________________ ____________ ______________ ___________ _____________________
|
||||
ARCHIVAL_STRATEGY VARCHAR2 30 N 'THRESHOLD_BASED'
|
||||
MINIMUM_AGE_MONTHS NUMBER 22 Y NULL
|
||||
|
||||
|
||||
2 rows selected.
|
||||
|
||||
========================================
|
||||
Archival strategy columns added successfully
|
||||
========================================
|
||||
|
||||
Step 2/7: Creating validation trigger
|
||||
======================================
|
||||
========================================
|
||||
MARS-828: Creating archival strategy validation trigger
|
||||
========================================
|
||||
|
||||
Trigger CT_MRDS.TRG_BI_A_SRC_FILE_CFG_ARCH_VAL compiled
|
||||
|
||||
|
||||
TRIGGER_NAME STATUS TRIGGER_TYPE TRIGGERING_EVENT
|
||||
_________________________________ __________ __________________ ___________________
|
||||
TRG_BI_A_SRC_FILE_CFG_ARCH_VAL ENABLED BEFORE EACH ROW INSERT OR UPDATE
|
||||
|
||||
1 row selected.
|
||||
|
||||
========================================
|
||||
Archival strategy validation trigger created successfully
|
||||
========================================
|
||||
|
||||
Step 3/7: Deploying FILE_ARCHIVER Spec v3.0.0
|
||||
===============================================================
|
||||
|
||||
Package CT_MRDS.FILE_ARCHIVER compiled
|
||||
|
||||
========================================
|
||||
FILE_ARCHIVER Specification v3.0.0 ready for installation
|
||||
========================================
|
||||
|
||||
Step 4/7: Deploying FILE_ARCHIVER Body v3.0.0
|
||||
======================================================
|
||||
|
||||
Package Body CT_MRDS.FILE_ARCHIVER compiled
|
||||
|
||||
|
||||
Step 5/7: Verifying installation
|
||||
=================================
|
||||
========================================
|
||||
MARS-828: Verification Script
|
||||
========================================
|
||||
|
||||
1. Verifying A_SOURCE_FILE_CONFIG columns...
|
||||
|
||||
COLUMN_NAME DATA_TYPE NULLABLE DATA_DEFAULT
|
||||
_____________________ ____________ ___________ _____________________
|
||||
ARCHIVAL_STRATEGY VARCHAR2 N 'THRESHOLD_BASED'
|
||||
MINIMUM_AGE_MONTHS NUMBER Y NULL
|
||||
|
||||
|
||||
2 rows selected.
|
||||
|
||||
|
||||
2. Verifying check constraint...
|
||||
|
||||
CONSTRAINT_NAME CONSTRAINT_TYPE SEARCH_CONDITION
|
||||
________________________ __________________ _________________________________________________________________________________________________________
|
||||
CHK_ARCHIVAL_STRATEGY C
|
||||
ARCHIVAL_STRATEGY IN ('THRESHOLD_BASED', 'CURRENT_MONTH_ONLY', 'MINIMUM_AGE_MONTHS', 'HYBRID')
|
||||
|
||||
|
||||
1 row selected.
|
||||
|
||||
|
||||
3. Verifying validation trigger...
|
||||
|
||||
TRIGGER_NAME STATUS TRIGGER_TYPE
|
||||
_________________________________ __________ __________________
|
||||
TRG_BI_A_SRC_FILE_CFG_ARCH_VAL ENABLED BEFORE EACH ROW
|
||||
|
||||
1 row selected.
|
||||
|
||||
|
||||
4. Checking FILE_ARCHIVER package status...
|
||||
|
||||
OBJECT_NAME OBJECT_TYPE STATUS LAST_DDL_TIME
|
||||
________________ _______________ _________ ______________________
|
||||
FILE_ARCHIVER PACKAGE VALID 2026-01-29 19:52:54
|
||||
FILE_ARCHIVER PACKAGE BODY VALID 2026-01-29 19:52:55
|
||||
|
||||
2 rows selected.
|
||||
|
||||
|
||||
5. Checking for compilation errors...
|
||||
|
||||
|
||||
0 rows selected.
|
||||
|
||||
|
||||
6. Verifying FILE_ARCHIVER version...
|
||||
|
||||
PACKAGE_VERSION
|
||||
__________________
|
||||
3.0.0
|
||||
|
||||
1 row selected.
|
||||
|
||||
|
||||
7. Testing trigger validation (should fail)...
|
||||
SUCCESS: Trigger validation working correctly
|
||||
Expected error: ORA-20999: MINIMUM_AGE_MONTHS is required for MINIMUM_AGE_MONTHS strategy
|
||||
ORA-06512: at "CT_MRDS.TRG_BI_A_SRC_FILE_CFG_ARCH_VAL", line 26
|
||||
ORA-06512: at "CT_MRDS.TRG_BI_A_SRC_FILE_CFG_ARCH_VAL", line 8
|
||||
ORA-04088: error during execution of trigger 'CT_MRDS.TRG_BI_A_SRC_FILE_CFG_ARCH_VAL'
|
||||
|
||||
|
||||
PL/SQL procedure successfully completed.
|
||||
|
||||
|
||||
========================================
|
||||
MARS-828: Verification Complete
|
||||
========================================
|
||||
|
||||
Step 6/7: Tracking package versions
|
||||
====================================
|
||||
========================================
|
||||
Package Version Tracking
|
||||
========================================
|
||||
EnvironmentID set to: dev
|
||||
[2026-01-29 19:53:00] [INFO] ENV_MANAGER.TRACK_PACKAGE_VERSION: Start TRACK_PACKAGE_VERSION
|
||||
[2026-01-29 19:53:01] [INFO] ENV_MANAGER.TRACK_PACKAGE_VERSION: End TRACK_PACKAGE_VERSION - Record inserted
|
||||
|
||||
Summary:
|
||||
--------
|
||||
Packages tracked: 1/1
|
||||
|
||||
Tracked Packages:
|
||||
CT_MRDS.FILE_ARCHIVER v3.0.0
|
||||
========================================
|
||||
|
||||
|
||||
PL/SQL procedure successfully completed.
|
||||
|
||||
|
||||
Step 7/7: Verifying tracked packages
|
||||
=====================================
|
||||
|
||||
========================================
|
||||
Package Version Verification
|
||||
========================================
|
||||
|
||||
|
||||
PACKAGE_OWNER PACKAGE_NAME VERSION STATUS
|
||||
________________ ___________________ __________ ______________________________________________________
|
||||
CT_MRDS DATA_EXPORTER 2.6.3 OK: Package CT_MRDS.DATA_EXPORTER has not changed.
|
||||
Last Tracked: 2026-01-28 19:18:36
|
||||
Version: 2.6.3
|
||||
CT_MRDS ENV_MANAGER 3.2.0 OK: Package CT_MRDS.ENV_MANAGER has not changed.
|
||||
Last Tracked: 2026-01-28 19:18:36
|
||||
Version: 3.2.0
|
||||
CT_MRDS FILE_ARCHIVER 3.0.0 OK: Package CT_MRDS.FILE_ARCHIVER has not changed.
|
||||
Last Tracked: 2026-01-29 19:53:01
|
||||
Version: 3.0.0
|
||||
CT_MRDS FILE_MANAGER 3.4.0 OK: Package CT_MRDS.FILE_MANAGER has not changed.
|
||||
Last Tracked: 2026-01-26 11:42:32
|
||||
Version: 3.4.0
|
||||
CT_MRDS WORKFLOW_MANAGER 1.7.1 OK: Package CT_MRDS.WORKFLOW_MANAGER has not changed.
|
||||
Last Tracked: 2025-11-25 16:00:36
|
||||
Version: 1.7.1
|
||||
ODS FILE_MANAGER_ODS 2.1.0 WARNING: Package ODS.FILE_MANAGER_ODS has changed!
|
||||
========================================
|
||||
Last Tracked Version: 2.1.0
|
||||
Last Tracked Date: 2025-11-26 08:58:57
|
||||
|
||||
BODY Changed:
|
||||
Current Hash: 1d167a53256c10dd...
|
||||
Last Hash: NULL...
|
||||
|
||||
RECOMMENDATION:
|
||||
1. Update PACKAGE_VERSION constant
|
||||
2. Update PACKAGE_BUILD_DATE constant
|
||||
3. Add entry to VERSION_HISTORY
|
||||
4. Call TRACK_PACKAGE_VERSION to update tracking
|
||||
|
||||
========================================
|
||||
Verification Complete
|
||||
========================================
|
||||
|
||||
Legend:
|
||||
OK - Package has not changed since last tracking
|
||||
WARNING - Package code changed without version update
|
||||
|
||||
For detailed hash information, use:
|
||||
SELECT ENV_MANAGER.GET_PACKAGE_HASH_INFO('OWNER', 'PACKAGE') FROM DUAL
|
||||
========================================
|
||||
|
||||
============================================================================
|
||||
MARS-828 Installation Completed
|
||||
============================================================================
|
||||
|
||||
INSTALL_END
|
||||
______________________
|
||||
2026-01-29 19:53:02
|
||||
|
||||
1 row selected.
|
||||
|
||||
============================================================================
|
||||
44
MARS_Packages/REL01_ADDITIONS/MARS-828/test/quick_test.sql
Normal file
44
MARS_Packages/REL01_ADDITIONS/MARS-828/test/quick_test.sql
Normal file
@@ -0,0 +1,44 @@
|
||||
-- ===================================================================
|
||||
-- MARS-828 Comprehensive Test Suite
|
||||
-- ===================================================================
|
||||
-- Purpose: Test all installation steps and archival strategies
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Date: 2026-01-28
|
||||
-- ===================================================================
|
||||
|
||||
SET SERVEROUTPUT ON SIZE UNLIMITED
|
||||
SET FEEDBACK ON
|
||||
SET ECHO ON
|
||||
|
||||
PROMPT ===================================================================
|
||||
PROMPT MARS-828 COMPREHENSIVE TEST - START
|
||||
PROMPT ===================================================================
|
||||
|
||||
-- STEP 1: Add Columns
|
||||
PROMPT
|
||||
PROMPT STEP 1: Adding Archival Strategy Columns
|
||||
PROMPT ===================================================================
|
||||
ALTER TABLE CT_MRDS.A_SOURCE_FILE_CONFIG ADD (
|
||||
ARCHIVAL_STRATEGY VARCHAR2(30) DEFAULT 'THRESHOLD_BASED' NOT NULL,
|
||||
MINIMUM_AGE_MONTHS NUMBER(3) DEFAULT NULL
|
||||
);
|
||||
|
||||
ALTER TABLE CT_MRDS.A_SOURCE_FILE_CONFIG ADD CONSTRAINT
|
||||
CHK_ARCHIVAL_STRATEGY CHECK (ARCHIVAL_STRATEGY IN ('THRESHOLD_BASED', 'CURRENT_MONTH_ONLY', 'MINIMUM_AGE_MONTHS', 'HYBRID'));
|
||||
|
||||
SELECT column_name, data_type, nullable FROM all_tab_columns
|
||||
WHERE owner = 'CT_MRDS' AND table_name = 'A_SOURCE_FILE_CONFIG'
|
||||
AND column_name IN ('ARCHIVAL_STRATEGY', 'MINIMUM_AGE_MONTHS');
|
||||
|
||||
PROMPT STEP 1 - COMPLETE
|
||||
|
||||
-- STEP 2: Verify FILE_ARCHIVER version
|
||||
PROMPT
|
||||
PROMPT STEP 2: Checking Current FILE_ARCHIVER Version
|
||||
PROMPT ===================================================================
|
||||
SELECT CT_MRDS.FILE_ARCHIVER.GET_VERSION() AS current_version FROM DUAL;
|
||||
|
||||
PROMPT ===================================================================
|
||||
PROMPT TEST SUITE PARTIAL EXECUTION COMPLETE
|
||||
PROMPT Next: Execute package updates manually
|
||||
PROMPT ===================================================================
|
||||
@@ -0,0 +1,87 @@
|
||||
-- ===================================================================
|
||||
-- MARS-828: Auto Rollback (bypasses confirmation)
|
||||
-- ===================================================================
|
||||
-- Purpose: Rollback MARS-828 without user prompts
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Date: 2026-01-29
|
||||
-- ===================================================================
|
||||
|
||||
-- Dynamic spool file generation
|
||||
host mkdir ..\log 2>nul
|
||||
|
||||
var filename VARCHAR2(100)
|
||||
BEGIN
|
||||
:filename := '../log/ROLLBACK_MARS_828_AUTO_' || 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 LINESIZE 200
|
||||
SET PAGESIZE 1000
|
||||
SET PAUSE OFF
|
||||
|
||||
PROMPT
|
||||
PROMPT ============================================================================
|
||||
PROMPT MARS-828 Rollback Starting (AUTO MODE - No Confirmation)
|
||||
PROMPT ============================================================================
|
||||
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS rollback_start FROM DUAL;
|
||||
PROMPT ============================================================================
|
||||
|
||||
-- Rollback steps (in reverse order)
|
||||
PROMPT
|
||||
PROMPT Step 1/6: Restoring FILE_ARCHIVER Package Specification v2.0.0
|
||||
PROMPT ===============================================================
|
||||
@@../91_MARS_828_rollback_FILE_ARCHIVER_SPEC.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT Step 2/6: Restoring FILE_ARCHIVER Package Body v2.0.0
|
||||
PROMPT ======================================================
|
||||
@@../92_MARS_828_rollback_FILE_ARCHIVER_BODY.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT Step 3/6: Dropping validation trigger
|
||||
PROMPT ======================================
|
||||
@@../93_MARS_828_rollback_trigger.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT Step 4/6: Dropping archival strategy columns
|
||||
PROMPT =============================================
|
||||
@@../94_MARS_828_rollback_columns.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT Step 5/6: Tracking rollback version
|
||||
PROMPT ====================================
|
||||
@@../track_package_versions.sql
|
||||
|
||||
PROMPT
|
||||
PROMPT Step 6/6: Verifying tracked packages
|
||||
PROMPT =====================================
|
||||
@@../verify_packages_version.sql
|
||||
|
||||
-- Verify rollback
|
||||
PROMPT
|
||||
PROMPT Verification: Package Compilation Status
|
||||
PROMPT =========================================
|
||||
SELECT object_name, object_type, status, last_ddl_time
|
||||
FROM all_objects
|
||||
WHERE owner = 'CT_MRDS'
|
||||
AND object_name = 'FILE_ARCHIVER'
|
||||
AND object_type IN ('PACKAGE', 'PACKAGE BODY')
|
||||
ORDER BY object_type;
|
||||
|
||||
PROMPT
|
||||
PROMPT ============================================================================
|
||||
PROMPT MARS-828 Rollback Completed
|
||||
PROMPT ============================================================================
|
||||
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS rollback_end FROM DUAL;
|
||||
PROMPT
|
||||
PROMPT Log file: &_filename
|
||||
PROMPT ============================================================================
|
||||
|
||||
spool off
|
||||
quit;
|
||||
@@ -0,0 +1,40 @@
|
||||
# MARS-828 Test Execution Script
|
||||
# Purpose: Run rollback and installation tests
|
||||
# Author: Grzegorz Michalski
|
||||
# Date: 2026-01-29
|
||||
|
||||
Write-Host "`n========================================" -ForegroundColor Cyan
|
||||
Write-Host "MARS-828 Testing Suite" -ForegroundColor Cyan
|
||||
Write-Host "========================================`n" -ForegroundColor Cyan
|
||||
|
||||
$connectionString = "ADMIN/Cloudpass#34@ggmichalski_high"
|
||||
$marsFolder = Split-Path -Parent $PSScriptRoot
|
||||
|
||||
Write-Host "Test 1: Rollback to v2.0.0" -ForegroundColor Yellow
|
||||
Write-Host "========================================" -ForegroundColor Yellow
|
||||
$rollbackCmd = "cd '$marsFolder'; sql '$connectionString' '@rollback_mars828.sql'"
|
||||
Write-Host "Command: $rollbackCmd`n" -ForegroundColor Gray
|
||||
Invoke-Expression $rollbackCmd
|
||||
|
||||
Write-Host "`nWaiting 5 seconds before installation...`n" -ForegroundColor Gray
|
||||
Start-Sleep -Seconds 5
|
||||
|
||||
Write-Host "Test 2: Installation v3.0.0 (Auto Mode)" -ForegroundColor Yellow
|
||||
Write-Host "========================================" -ForegroundColor Yellow
|
||||
$installCmd = "cd '$PSScriptRoot'; sql '$connectionString' '@auto_install.sql'"
|
||||
Write-Host "Command: $installCmd`n" -ForegroundColor Gray
|
||||
Invoke-Expression $installCmd
|
||||
|
||||
Write-Host "`nWaiting 5 seconds before verification...`n" -ForegroundColor Gray
|
||||
Start-Sleep -Seconds 5
|
||||
|
||||
Write-Host "Test 3: Final Summary" -ForegroundColor Yellow
|
||||
Write-Host "========================================" -ForegroundColor Yellow
|
||||
$summaryCmd = "cd '$PSScriptRoot'; sql 'CT_MRDS/$connectionString' '@final_summary.sql'"
|
||||
Write-Host "Command: $summaryCmd`n" -ForegroundColor Gray
|
||||
Invoke-Expression $summaryCmd
|
||||
|
||||
Write-Host "`n========================================" -ForegroundColor Green
|
||||
Write-Host "MARS-828 Testing Complete" -ForegroundColor Green
|
||||
Write-Host "========================================`n" -ForegroundColor Green
|
||||
Write-Host "Check log files in: $marsFolder\log\" -ForegroundColor Cyan
|
||||
20
MARS_Packages/REL01_ADDITIONS/MARS-828/test/run_tests.ps1
Normal file
20
MARS_Packages/REL01_ADDITIONS/MARS-828/test/run_tests.ps1
Normal file
@@ -0,0 +1,20 @@
|
||||
# MARS-828 Installation and Testing Script
|
||||
# Run from: MARS_Packages\REL01_ADDITIONS\MARS-828\
|
||||
|
||||
Write-Host "`n========================================" -ForegroundColor Cyan
|
||||
Write-Host "MARS-828: Installation & Testing Script" -ForegroundColor Cyan
|
||||
Write-Host "========================================`n" -ForegroundColor Cyan
|
||||
|
||||
$ErrorActionPreference = "Continue"
|
||||
$scriptDir = "c:\_git\_local_rep\working_dir_02\MARS_Packages\REL01_ADDITIONS\MARS-828"
|
||||
|
||||
# Test 1: Install MARS-828
|
||||
Write-Host "Test 1: Installing MARS-828..." -ForegroundColor Yellow
|
||||
$installCmd = @"
|
||||
cd $scriptDir
|
||||
echo "exit" | sql "ADMIN/Cloudpass#34@ggmichalski_high" "@auto_install.sql"
|
||||
"@
|
||||
Invoke-Expression $installCmd | Out-File -FilePath "$scriptDir\test_results.txt" -Encoding UTF8
|
||||
|
||||
Write-Host "`nInstallation log saved to: test_results.txt" -ForegroundColor Green
|
||||
Write-Host "`nCheck log file for results..." -ForegroundColor Yellow
|
||||
@@ -0,0 +1,200 @@
|
||||
-- ===================================================================
|
||||
-- MARS-828: Fix CSDB configuration and test all archival strategies
|
||||
-- ===================================================================
|
||||
-- Purpose: Correct CSDB strategy and comprehensive testing
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Date: 2026-01-28
|
||||
-- ===================================================================
|
||||
|
||||
SET SERVEROUTPUT ON SIZE UNLIMITED
|
||||
SET LINESIZE 200
|
||||
SET PAGESIZE 1000
|
||||
|
||||
PROMPT
|
||||
PROMPT ========================================
|
||||
PROMPT MARS-828: Fix Configuration & Test Strategies
|
||||
PROMPT ========================================
|
||||
PROMPT
|
||||
|
||||
-- Step 1: Fix CSDB configurations (all CSDB_DEBT* tables)
|
||||
PROMPT Step 1: Updating CSDB configurations...
|
||||
PROMPT ========================================
|
||||
UPDATE CT_MRDS.A_SOURCE_FILE_CONFIG
|
||||
SET ARCHIVAL_STRATEGY = 'MINIMUM_AGE_MONTHS',
|
||||
MINIMUM_AGE_MONTHS = 6
|
||||
WHERE A_SOURCE_KEY = 'CSDB'
|
||||
AND SOURCE_FILE_TYPE = 'INPUT'
|
||||
AND TABLE_ID LIKE 'CSDB_DEBT%';
|
||||
|
||||
COMMIT;
|
||||
|
||||
-- Step 2: Verify updated CSDB configurations
|
||||
PROMPT
|
||||
PROMPT Step 2: Verify CSDB Configurations
|
||||
PROMPT ====================================
|
||||
SELECT
|
||||
SOURCE_FILE_ID,
|
||||
TABLE_ID,
|
||||
ARCHIVAL_STRATEGY,
|
||||
MINIMUM_AGE_MONTHS
|
||||
FROM CT_MRDS.A_SOURCE_FILE_CONFIG
|
||||
WHERE A_SOURCE_KEY = 'CSDB'
|
||||
AND SOURCE_FILE_TYPE = 'INPUT'
|
||||
AND TABLE_ID LIKE 'CSDB_DEBT%'
|
||||
ORDER BY TABLE_ID;
|
||||
|
||||
-- Step 3: View final test configurations
|
||||
PROMPT
|
||||
PROMPT Step 3: Final Test Configurations
|
||||
PROMPT ==================================
|
||||
SELECT
|
||||
A_SOURCE_KEY,
|
||||
SUBSTR(TABLE_ID, 1, 35) AS TABLE_ID,
|
||||
ARCHIVAL_STRATEGY,
|
||||
MINIMUM_AGE_MONTHS,
|
||||
DAYS_FOR_ARCHIVE_THRESHOLD
|
||||
FROM CT_MRDS.A_SOURCE_FILE_CONFIG
|
||||
WHERE SOURCE_FILE_TYPE = 'INPUT'
|
||||
AND (
|
||||
(A_SOURCE_KEY = 'C2D' AND SOURCE_FILE_ID = 'UC_ACC')
|
||||
OR (A_SOURCE_KEY = 'LM' AND SOURCE_FILE_ID = 'AdhocAdjustment' AND TABLE_ID = 'LM_ADHOC_ADJUSTMENTS_ITEM')
|
||||
OR (A_SOURCE_KEY = 'CSDB' AND TABLE_ID LIKE 'CSDB_DEBT%')
|
||||
OR (A_SOURCE_KEY = 'TOP' AND TABLE_ID = 'TOP_FULLBID_ARRAY_COMPILED')
|
||||
)
|
||||
ORDER BY
|
||||
CASE A_SOURCE_KEY
|
||||
WHEN 'C2D' THEN 1
|
||||
WHEN 'LM' THEN 2
|
||||
WHEN 'CSDB' THEN 3
|
||||
WHEN 'TOP' THEN 4
|
||||
END,
|
||||
TABLE_ID;
|
||||
|
||||
-- Step 4: Test GET_ARCHIVAL_WHERE_CLAUSE via DBMS_OUTPUT
|
||||
PROMPT
|
||||
PROMPT Step 4: Testing WHERE Clause Generation
|
||||
PROMPT ========================================
|
||||
DECLARE
|
||||
vConfig CT_MRDS.A_SOURCE_FILE_CONFIG%ROWTYPE;
|
||||
vWhereClause VARCHAR2(4000);
|
||||
BEGIN
|
||||
-- Test 1: THRESHOLD_BASED
|
||||
SELECT * INTO vConfig
|
||||
FROM CT_MRDS.A_SOURCE_FILE_CONFIG
|
||||
WHERE A_SOURCE_KEY = 'C2D'
|
||||
AND SOURCE_FILE_ID = 'UC_ACC'
|
||||
AND ROWNUM = 1;
|
||||
DBMS_OUTPUT.PUT_LINE('========================================');
|
||||
DBMS_OUTPUT.PUT_LINE('Test 1: THRESHOLD_BASED (C2D/UC_ACC)');
|
||||
DBMS_OUTPUT.PUT_LINE('Expected: extract(day from (systimestamp - workflow_start)) > 30');
|
||||
DBMS_OUTPUT.PUT_LINE('NOTE: Cannot test private function directly');
|
||||
DBMS_OUTPUT.PUT_LINE('Strategy: ' || vConfig.ARCHIVAL_STRATEGY);
|
||||
DBMS_OUTPUT.PUT_LINE('Threshold: ' || vConfig.DAYS_FOR_ARCHIVE_THRESHOLD);
|
||||
|
||||
-- Test 2: CURRENT_MONTH_ONLY
|
||||
SELECT * INTO vConfig
|
||||
FROM CT_MRDS.A_SOURCE_FILE_CONFIG
|
||||
WHERE A_SOURCE_KEY = 'LM'
|
||||
AND SOURCE_FILE_ID = 'AdhocAdjustment'
|
||||
AND TABLE_ID = 'LM_ADHOC_ADJUSTMENTS_ITEM'
|
||||
AND ROWNUM = 1;
|
||||
DBMS_OUTPUT.PUT_LINE('========================================');
|
||||
DBMS_OUTPUT.PUT_LINE('Test 2: CURRENT_MONTH_ONLY (LM/AdhocAdjustment)');
|
||||
DBMS_OUTPUT.PUT_LINE('Expected: TRUNC(workflow_start, ''MM'') < TRUNC(SYSDATE, ''MM'')');
|
||||
DBMS_OUTPUT.PUT_LINE('Strategy: ' || vConfig.ARCHIVAL_STRATEGY);
|
||||
DBMS_OUTPUT.PUT_LINE('Min Age: ' || NVL(TO_CHAR(vConfig.MINIMUM_AGE_MONTHS), 'NULL'));
|
||||
|
||||
-- Test 3: MINIMUM_AGE_MONTHS
|
||||
SELECT * INTO vConfig
|
||||
FROM CT_MRDS.A_SOURCE_FILE_CONFIG
|
||||
WHERE A_SOURCE_KEY = 'CSDB'
|
||||
AND TABLE_ID = 'CSDB_DEBT'
|
||||
AND ROWNUM = 1;
|
||||
DBMS_OUTPUT.PUT_LINE('========================================');
|
||||
DBMS_OUTPUT.PUT_LINE('Test 3: MINIMUM_AGE_MONTHS (CSDB/CSDB_DEBT)');
|
||||
DBMS_OUTPUT.PUT_LINE('Expected: workflow_start < ADD_MONTHS(TRUNC(SYSDATE, ''MM''), -6)');
|
||||
DBMS_OUTPUT.PUT_LINE('Strategy: ' || vConfig.ARCHIVAL_STRATEGY);
|
||||
DBMS_OUTPUT.PUT_LINE('Min Age: ' || vConfig.MINIMUM_AGE_MONTHS || ' months');
|
||||
|
||||
-- Test 4: HYBRID
|
||||
SELECT * INTO vConfig
|
||||
FROM CT_MRDS.A_SOURCE_FILE_CONFIG
|
||||
WHERE A_SOURCE_KEY = 'TOP'
|
||||
AND TABLE_ID = 'TOP_FULLBID_ARRAY_COMPILED'
|
||||
AND ROWNUM = 1;
|
||||
DBMS_OUTPUT.PUT_LINE('========================================');
|
||||
DBMS_OUTPUT.PUT_LINE('Test 4: HYBRID (TOP/TOP_FULLBID_ARRAY_COMPILED)');
|
||||
DBMS_OUTPUT.PUT_LINE('Expected: TRUNC(workflow_start, ''MM'') < TRUNC(SYSDATE, ''MM'')');
|
||||
DBMS_OUTPUT.PUT_LINE(' AND workflow_start < ADD_MONTHS(TRUNC(SYSDATE, ''MM''), -3)');
|
||||
DBMS_OUTPUT.PUT_LINE('Strategy: ' || vConfig.ARCHIVAL_STRATEGY);
|
||||
DBMS_OUTPUT.PUT_LINE('Min Age: ' || vConfig.MINIMUM_AGE_MONTHS || ' months');
|
||||
DBMS_OUTPUT.PUT_LINE('========================================');
|
||||
END;
|
||||
/
|
||||
|
||||
-- Step 5: Test archival statistics simulation
|
||||
PROMPT
|
||||
PROMPT Step 5: Archive Statistics Simulation
|
||||
PROMPT ======================================
|
||||
PROMPT NOTE: This simulates what GATHER_TABLE_STAT would calculate
|
||||
PROMPT
|
||||
|
||||
-- Create test scenario date ranges
|
||||
DECLARE
|
||||
vCurrentDate DATE := TRUNC(SYSDATE);
|
||||
vCurrentMonth DATE := TRUNC(SYSDATE, 'MM');
|
||||
v3MonthsAgo DATE := ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -3);
|
||||
v6MonthsAgo DATE := ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -6);
|
||||
v30DaysAgo DATE := SYSDATE - 30;
|
||||
BEGIN
|
||||
DBMS_OUTPUT.PUT_LINE('Current Date: ' || TO_CHAR(vCurrentDate, 'YYYY-MM-DD'));
|
||||
DBMS_OUTPUT.PUT_LINE('Current Month Start: ' || TO_CHAR(vCurrentMonth, 'YYYY-MM-DD'));
|
||||
DBMS_OUTPUT.PUT_LINE('3 Months Ago: ' || TO_CHAR(v3MonthsAgo, 'YYYY-MM-DD'));
|
||||
DBMS_OUTPUT.PUT_LINE('6 Months Ago: ' || TO_CHAR(v6MonthsAgo, 'YYYY-MM-DD'));
|
||||
DBMS_OUTPUT.PUT_LINE('30 Days Ago: ' || TO_CHAR(v30DaysAgo, 'YYYY-MM-DD HH24:MI:SS'));
|
||||
DBMS_OUTPUT.PUT_LINE('');
|
||||
|
||||
-- Example: Data from 2024-08-15 (CSDB DEBT)
|
||||
-- Would be archived with MINIMUM_AGE_MONTHS=6?
|
||||
IF DATE '2024-08-15' < v6MonthsAgo THEN
|
||||
DBMS_OUTPUT.PUT_LINE('CSDB Example: 2024-08-15 WOULD be archived (older than 6 months)');
|
||||
ELSE
|
||||
DBMS_OUTPUT.PUT_LINE('CSDB Example: 2024-08-15 would NOT be archived (within 6 months)');
|
||||
END IF;
|
||||
|
||||
-- Example: Data from 2025-12-20 (LM)
|
||||
-- Would be archived with CURRENT_MONTH_ONLY?
|
||||
IF TRUNC(DATE '2025-12-20', 'MM') < vCurrentMonth THEN
|
||||
DBMS_OUTPUT.PUT_LINE('LM Example: 2025-12-20 WOULD be archived (previous month)');
|
||||
ELSE
|
||||
DBMS_OUTPUT.PUT_LINE('LM Example: 2025-12-20 would NOT be archived (current month)');
|
||||
END IF;
|
||||
|
||||
-- Example: Data from 2025-10-10 (TOP HYBRID)
|
||||
-- Would be archived with HYBRID (current month + 3 months)?
|
||||
IF TRUNC(DATE '2025-10-10', 'MM') < vCurrentMonth
|
||||
AND DATE '2025-10-10' < v3MonthsAgo THEN
|
||||
DBMS_OUTPUT.PUT_LINE('TOP Example: 2025-10-10 WOULD be archived (previous month AND older than 3 months)');
|
||||
ELSE
|
||||
DBMS_OUTPUT.PUT_LINE('TOP Example: 2025-10-10 would NOT be archived (within 3 months or current month)');
|
||||
END IF;
|
||||
END;
|
||||
/
|
||||
|
||||
PROMPT
|
||||
PROMPT ========================================
|
||||
PROMPT MARS-828: Configuration & Testing Complete
|
||||
PROMPT ========================================
|
||||
PROMPT
|
||||
PROMPT Summary:
|
||||
PROMPT - All 4 strategies configured correctly
|
||||
PROMPT - CSDB: 4 tables updated to MINIMUM_AGE_MONTHS (6 months)
|
||||
PROMPT - LM: 1 table configured as CURRENT_MONTH_ONLY
|
||||
PROMPT - TOP: 1 table configured as HYBRID (3 months)
|
||||
PROMPT - C2D: 1 table kept as THRESHOLD_BASED (30 days)
|
||||
PROMPT
|
||||
PROMPT Next Steps:
|
||||
PROMPT - Test ARCHIVE_TABLE_DATA with real data
|
||||
PROMPT - Test GATHER_TABLE_STAT calculations
|
||||
PROMPT - Verify archival operations in production scenario
|
||||
PROMPT ========================================
|
||||
@@ -0,0 +1,253 @@
|
||||
-- MARS-828: Test archival strategies
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Date: 2026-01-27
|
||||
-- Description: Comprehensive test scenarios for all archival strategies
|
||||
|
||||
SET SERVEROUTPUT ON SIZE UNLIMITED
|
||||
|
||||
PROMPT ========================================
|
||||
PROMPT MARS-828: Testing Archival Strategies
|
||||
PROMPT ========================================
|
||||
|
||||
-- Test 1: THRESHOLD_BASED (backward compatibility)
|
||||
PROMPT
|
||||
PROMPT Test 1: THRESHOLD_BASED strategy
|
||||
DECLARE
|
||||
vTestKey NUMBER := -1000;
|
||||
BEGIN
|
||||
INSERT INTO CT_MRDS.A_SOURCE_FILE_CONFIG (
|
||||
A_SOURCE_FILE_CONFIG_KEY,
|
||||
A_SOURCE_KEY,
|
||||
SOURCE_FILE_TYPE,
|
||||
SOURCE_FILE_ID,
|
||||
SOURCE_FILE_DESC,
|
||||
SOURCE_FILE_NAME_PATTERN,
|
||||
TABLE_ID,
|
||||
TEMPLATE_TABLE_NAME,
|
||||
ARCHIVAL_STRATEGY,
|
||||
DAYS_FOR_ARCHIVE_THRESHOLD
|
||||
) VALUES (
|
||||
vTestKey,
|
||||
'TEST1',
|
||||
'INPUT',
|
||||
'TEST_THRESHOLD',
|
||||
'Test threshold-based',
|
||||
'test*.csv',
|
||||
'TEST_TABLE',
|
||||
'CT_ET_TEMPLATES.TEST',
|
||||
'THRESHOLD_BASED',
|
||||
30
|
||||
);
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('SUCCESS: THRESHOLD_BASED strategy configured');
|
||||
ROLLBACK;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('FAILED: ' || SQLERRM);
|
||||
ROLLBACK;
|
||||
END;
|
||||
/
|
||||
|
||||
-- Test 2: CURRENT_MONTH_ONLY
|
||||
PROMPT
|
||||
PROMPT Test 2: CURRENT_MONTH_ONLY strategy
|
||||
DECLARE
|
||||
vTestKey NUMBER := -1001;
|
||||
BEGIN
|
||||
INSERT INTO CT_MRDS.A_SOURCE_FILE_CONFIG (
|
||||
A_SOURCE_FILE_CONFIG_KEY,
|
||||
A_SOURCE_KEY,
|
||||
SOURCE_FILE_TYPE,
|
||||
SOURCE_FILE_ID,
|
||||
SOURCE_FILE_DESC,
|
||||
SOURCE_FILE_NAME_PATTERN,
|
||||
TABLE_ID,
|
||||
TEMPLATE_TABLE_NAME,
|
||||
ARCHIVAL_STRATEGY
|
||||
) VALUES (
|
||||
vTestKey,
|
||||
'TEST2',
|
||||
'INPUT',
|
||||
'TEST_CURRENT_MONTH',
|
||||
'Test current month only',
|
||||
'test*.csv',
|
||||
'TEST_TABLE',
|
||||
'CT_ET_TEMPLATES.TEST',
|
||||
'CURRENT_MONTH_ONLY'
|
||||
);
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('SUCCESS: CURRENT_MONTH_ONLY strategy configured');
|
||||
ROLLBACK;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('FAILED: ' || SQLERRM);
|
||||
ROLLBACK;
|
||||
END;
|
||||
/
|
||||
|
||||
-- Test 3: MINIMUM_AGE_MONTHS (should succeed)
|
||||
PROMPT
|
||||
PROMPT Test 3: MINIMUM_AGE_MONTHS strategy with valid config
|
||||
DECLARE
|
||||
vTestKey NUMBER := -1002;
|
||||
BEGIN
|
||||
INSERT INTO CT_MRDS.A_SOURCE_FILE_CONFIG (
|
||||
A_SOURCE_FILE_CONFIG_KEY,
|
||||
A_SOURCE_KEY,
|
||||
SOURCE_FILE_TYPE,
|
||||
SOURCE_FILE_ID,
|
||||
SOURCE_FILE_DESC,
|
||||
SOURCE_FILE_NAME_PATTERN,
|
||||
TABLE_ID,
|
||||
TEMPLATE_TABLE_NAME,
|
||||
ARCHIVAL_STRATEGY,
|
||||
MINIMUM_AGE_MONTHS
|
||||
) VALUES (
|
||||
vTestKey,
|
||||
'TEST3',
|
||||
'INPUT',
|
||||
'TEST_MIN_AGE',
|
||||
'Test minimum age months',
|
||||
'test*.csv',
|
||||
'TEST_TABLE',
|
||||
'CT_ET_TEMPLATES.TEST',
|
||||
'MINIMUM_AGE_MONTHS',
|
||||
6
|
||||
);
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('SUCCESS: MINIMUM_AGE_MONTHS strategy configured with 6 months');
|
||||
ROLLBACK;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('FAILED: ' || SQLERRM);
|
||||
ROLLBACK;
|
||||
END;
|
||||
/
|
||||
|
||||
-- Test 4: MINIMUM_AGE_MONTHS without value (should fail)
|
||||
PROMPT
|
||||
PROMPT Test 4: MINIMUM_AGE_MONTHS strategy without value (should fail)
|
||||
DECLARE
|
||||
vTestKey NUMBER := -1003;
|
||||
BEGIN
|
||||
INSERT INTO CT_MRDS.A_SOURCE_FILE_CONFIG (
|
||||
A_SOURCE_FILE_CONFIG_KEY,
|
||||
A_SOURCE_KEY,
|
||||
SOURCE_FILE_TYPE,
|
||||
SOURCE_FILE_ID,
|
||||
SOURCE_FILE_DESC,
|
||||
SOURCE_FILE_NAME_PATTERN,
|
||||
TABLE_ID,
|
||||
TEMPLATE_TABLE_NAME,
|
||||
ARCHIVAL_STRATEGY,
|
||||
MINIMUM_AGE_MONTHS
|
||||
) VALUES (
|
||||
vTestKey,
|
||||
'TEST4',
|
||||
'INPUT',
|
||||
'TEST_MIN_AGE_FAIL',
|
||||
'Test minimum age months failure',
|
||||
'test*.csv',
|
||||
'TEST_TABLE',
|
||||
'CT_ET_TEMPLATES.TEST',
|
||||
'MINIMUM_AGE_MONTHS',
|
||||
NULL -- Should trigger error
|
||||
);
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('FAILED: Trigger did not fire - this should have failed!');
|
||||
ROLLBACK;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
IF SQLCODE = -20999 THEN
|
||||
DBMS_OUTPUT.PUT_LINE('SUCCESS: Trigger correctly prevented invalid config');
|
||||
ELSE
|
||||
DBMS_OUTPUT.PUT_LINE('FAILED: Unexpected error: ' || SQLERRM);
|
||||
END IF;
|
||||
ROLLBACK;
|
||||
END;
|
||||
/
|
||||
|
||||
-- Test 5: HYBRID strategy
|
||||
PROMPT
|
||||
PROMPT Test 5: HYBRID strategy
|
||||
DECLARE
|
||||
vTestKey NUMBER := -1004;
|
||||
BEGIN
|
||||
INSERT INTO CT_MRDS.A_SOURCE_FILE_CONFIG (
|
||||
A_SOURCE_FILE_CONFIG_KEY,
|
||||
A_SOURCE_KEY,
|
||||
SOURCE_FILE_TYPE,
|
||||
SOURCE_FILE_ID,
|
||||
SOURCE_FILE_DESC,
|
||||
SOURCE_FILE_NAME_PATTERN,
|
||||
TABLE_ID,
|
||||
TEMPLATE_TABLE_NAME,
|
||||
ARCHIVAL_STRATEGY,
|
||||
MINIMUM_AGE_MONTHS
|
||||
) VALUES (
|
||||
vTestKey,
|
||||
'TEST5',
|
||||
'INPUT',
|
||||
'TEST_HYBRID',
|
||||
'Test hybrid strategy',
|
||||
'test*.csv',
|
||||
'TEST_TABLE',
|
||||
'CT_ET_TEMPLATES.TEST',
|
||||
'HYBRID',
|
||||
3
|
||||
);
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('SUCCESS: HYBRID strategy configured');
|
||||
ROLLBACK;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('FAILED: ' || SQLERRM);
|
||||
ROLLBACK;
|
||||
END;
|
||||
/
|
||||
|
||||
-- Test 6: Invalid strategy (should fail)
|
||||
PROMPT
|
||||
PROMPT Test 6: Invalid strategy (should fail)
|
||||
DECLARE
|
||||
vTestKey NUMBER := -1005;
|
||||
BEGIN
|
||||
INSERT INTO CT_MRDS.A_SOURCE_FILE_CONFIG (
|
||||
A_SOURCE_FILE_CONFIG_KEY,
|
||||
A_SOURCE_KEY,
|
||||
SOURCE_FILE_TYPE,
|
||||
SOURCE_FILE_ID,
|
||||
SOURCE_FILE_DESC,
|
||||
SOURCE_FILE_NAME_PATTERN,
|
||||
TABLE_ID,
|
||||
TEMPLATE_TABLE_NAME,
|
||||
ARCHIVAL_STRATEGY
|
||||
) VALUES (
|
||||
vTestKey,
|
||||
'TEST6',
|
||||
'INPUT',
|
||||
'TEST_INVALID',
|
||||
'Test invalid strategy',
|
||||
'test*.csv',
|
||||
'TEST_TABLE',
|
||||
'CT_ET_TEMPLATES.TEST',
|
||||
'INVALID_STRATEGY'
|
||||
);
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('FAILED: Check constraint did not fire!');
|
||||
ROLLBACK;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
IF SQLCODE = -2290 THEN
|
||||
DBMS_OUTPUT.PUT_LINE('SUCCESS: Check constraint prevented invalid strategy');
|
||||
ELSE
|
||||
DBMS_OUTPUT.PUT_LINE('FAILED: Unexpected error: ' || SQLERRM);
|
||||
END IF;
|
||||
ROLLBACK;
|
||||
END;
|
||||
/
|
||||
|
||||
PROMPT
|
||||
PROMPT ========================================
|
||||
PROMPT MARS-828: Testing Complete
|
||||
PROMPT ========================================
|
||||
36
MARS_Packages/REL01_ADDITIONS/MARS-828/test/test_install.sql
Normal file
36
MARS_Packages/REL01_ADDITIONS/MARS-828/test/test_install.sql
Normal file
@@ -0,0 +1,36 @@
|
||||
-- MARS-828 Test Installation (Automated)
|
||||
-- This script bypasses ACCEPT prompts for automated testing
|
||||
|
||||
SET SERVEROUTPUT ON SIZE UNLIMITED
|
||||
SET VERIFY OFF
|
||||
SET FEEDBACK ON
|
||||
SET ECHO ON
|
||||
|
||||
PROMPT ===============================================
|
||||
PROMPT MARS-828 Automated Test Installation
|
||||
PROMPT ===============================================
|
||||
|
||||
-- Step 1: Add columns
|
||||
@@01_MARS_828_install_add_archival_strategy_columns.sql
|
||||
|
||||
-- Step 2: Create trigger
|
||||
@@02_MARS_828_install_archival_strategy_trigger.sql
|
||||
|
||||
-- Step 3: Deploy package spec
|
||||
@@03_MARS_828_install_CT_MRDS_FILE_ARCHIVER_SPEC.sql
|
||||
|
||||
-- Step 4: Deploy package body
|
||||
@@04_MARS_828_install_CT_MRDS_FILE_ARCHIVER_BODY.sql
|
||||
|
||||
-- Step 5: Verify
|
||||
@@05_MARS_828_verify_installation.sql
|
||||
|
||||
-- Step 6: Track version
|
||||
@@06_MARS_828_track_version.sql
|
||||
|
||||
-- Step 7: Verify packages
|
||||
@@verify_packages_version.sql
|
||||
|
||||
PROMPT ===============================================
|
||||
PROMPT Test Installation Complete!
|
||||
PROMPT ===============================================
|
||||
@@ -0,0 +1,159 @@
|
||||
=========================================================================
|
||||
MARS-1046: ISO 8601 Date Format Fix for FILE_MANAGER
|
||||
=========================================================================
|
||||
|
||||
This script will:
|
||||
- Update FILE_MANAGER package specification (3.3.0 -> 3.3.1)
|
||||
- Update FILE_MANAGER package body with NORMALIZE_DATE_FORMAT function
|
||||
- Fix parsing of ISO 8601 formats: YYYY-MM-DDTHH24:MI:SS.FF3TZH:TZM
|
||||
- Track package version in A_PACKAGE_VERSION_TRACKING
|
||||
|
||||
Expected Duration: 1-2 minutes
|
||||
=========================================================================
|
||||
Type YES to continue with installation, or Ctrl+C to abort: yes
|
||||
old: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;
|
||||
|
||||
new:BEGIN
|
||||
IF 'yes' IS NULL OR TRIM('yes') IS NULL OR UPPER(TRIM('yes')) != 'YES' THEN
|
||||
RAISE_APPLICATION_ERROR(-20001, 'Installation aborted by user');
|
||||
END IF;
|
||||
END;
|
||||
|
||||
PL/SQL procedure successfully completed.
|
||||
|
||||
Elapsed: 00:00:00.078
|
||||
|
||||
=========================================================================
|
||||
Step 1: Update FILE_MANAGER Package Specification
|
||||
=========================================================================
|
||||
========================================================================
|
||||
MARS-1046: Updating CT_MRDS.FILE_MANAGER Package Specification
|
||||
========================================================================
|
||||
|
||||
Package CT_MRDS.FILE_MANAGER compiled
|
||||
|
||||
Elapsed: 00:00:00.268
|
||||
|
||||
Package CT_MRDS.FILE_MANAGER compiled
|
||||
|
||||
Elapsed: 00:00:00.126
|
||||
|
||||
OBJECT_NAME OBJECT_TYPE STATUS
|
||||
_______________ ______________ _________
|
||||
FILE_MANAGER PACKAGE VALID
|
||||
|
||||
Elapsed: 00:00:00.069
|
||||
SUCCESS: FILE_MANAGER package specification updated to version 3.3.1
|
||||
|
||||
=========================================================================
|
||||
Step 2: Update FILE_MANAGER Package Body
|
||||
=========================================================================
|
||||
========================================================================
|
||||
MARS-1046: Updating CT_MRDS.FILE_MANAGER Package Body
|
||||
========================================================================
|
||||
|
||||
Package Body CT_MRDS.FILE_MANAGER compiled
|
||||
|
||||
Elapsed: 00:00:00.558
|
||||
|
||||
Package Body CT_MRDS.FILE_MANAGER compiled
|
||||
|
||||
Elapsed: 00:00:00.142
|
||||
|
||||
OBJECT_NAME OBJECT_TYPE STATUS
|
||||
_______________ _______________ _________
|
||||
FILE_MANAGER PACKAGE BODY VALID
|
||||
|
||||
Elapsed: 00:00:00.065
|
||||
SUCCESS: FILE_MANAGER package body updated with ISO 8601 date format fix
|
||||
|
||||
=========================================================================
|
||||
Step 3: Track Package Version
|
||||
=========================================================================
|
||||
========================================
|
||||
Package Version Tracking
|
||||
========================================
|
||||
EnvironmentID set to: dev
|
||||
[2026-01-12 16:59:54] [INFO] ENV_MANAGER.TRACK_PACKAGE_VERSION: Start TRACK_PACKAGE_VERSION
|
||||
[2026-01-12 16:59:54] [INFO] ENV_MANAGER.TRACK_PACKAGE_VERSION: End TRACK_PACKAGE_VERSION - Record inserted
|
||||
Packages tracked: 1 of 1
|
||||
|
||||
CT_MRDS.FILE_MANAGER = 3.3.1
|
||||
========================================
|
||||
|
||||
|
||||
PL/SQL procedure successfully completed.
|
||||
|
||||
Elapsed: 00:00:00.319
|
||||
|
||||
=========================================================================
|
||||
Step 4: Verify Package Status
|
||||
=========================================================================
|
||||
|
||||
========================================
|
||||
Package Version Verification
|
||||
========================================
|
||||
|
||||
|
||||
PACKAGE_OWNER PACKAGE_NAME VERSION STATUS
|
||||
________________ ___________________ __________ ______________________________________________________
|
||||
CT_MRDS DATA_EXPORTER 2.4.0 OK: Package CT_MRDS.DATA_EXPORTER has not changed.
|
||||
Last Tracked: 2026-01-11 18:46:35
|
||||
Version: 2.4.0
|
||||
CT_MRDS ENV_MANAGER 3.2.0 OK: Package CT_MRDS.ENV_MANAGER has not changed.
|
||||
Last Tracked: 2026-01-11 18:46:35
|
||||
Version: 3.2.0
|
||||
CT_MRDS FILE_ARCHIVER 2.0.0 OK: Package CT_MRDS.FILE_ARCHIVER has not changed.
|
||||
Last Tracked: 2025-11-25 16:00:36
|
||||
Version: 2.0.0
|
||||
CT_MRDS FILE_MANAGER 3.3.1 OK: Package CT_MRDS.FILE_MANAGER has not changed.
|
||||
Last Tracked: 2026-01-12 16:59:54
|
||||
Version: 3.3.1
|
||||
CT_MRDS WORKFLOW_MANAGER 1.7.1 OK: Package CT_MRDS.WORKFLOW_MANAGER has not changed.
|
||||
Last Tracked: 2025-11-25 16:00:36
|
||||
Version: 1.7.1
|
||||
ODS FILE_MANAGER_ODS 2.1.0 WARNING: Package ODS.FILE_MANAGER_ODS has changed!
|
||||
========================================
|
||||
Last Tracked Version: 2.1.0
|
||||
Last Tracked Date: 2025-11-26 08:58:57
|
||||
|
||||
BODY Changed:
|
||||
Current Hash: 1d167a53256c10dd...
|
||||
Last Hash: NULL...
|
||||
|
||||
RECOMMENDATION:
|
||||
1. Update PACKAGE_VERSION constant
|
||||
2. Update PACKAGE_BUILD_DATE constant
|
||||
3. Add entry to VERSION_HISTORY
|
||||
4. Call TRACK_PACKAGE_VERSION to update tracking
|
||||
Elapsed: 00:00:00.406
|
||||
|
||||
========================================
|
||||
Verification Complete
|
||||
========================================
|
||||
|
||||
Legend:
|
||||
OK - Package has not changed since last tracking
|
||||
WARNING - Package code changed without version update
|
||||
|
||||
For detailed hash information, use:
|
||||
SELECT ENV_MANAGER.GET_PACKAGE_HASH_INFO('OWNER', 'PACKAGE') FROM DUAL
|
||||
========================================
|
||||
|
||||
=========================================================================
|
||||
MARS-1046 Installation - COMPLETED
|
||||
=========================================================================
|
||||
|
||||
FILE_MANAGER updated to version 3.3.1
|
||||
|
||||
Verification:
|
||||
SELECT FILE_MANAGER.GET_VERSION() FROM DUAL
|
||||
SELECT FILE_MANAGER.GET_BUILD_INFO() FROM DUAL
|
||||
|
||||
Check the log file for complete installation details:
|
||||
log/INSTALL_MARS_1046_G45C5E88148E17E_GGMICHALSKI_20260112_165944.log
|
||||
=========================================================================
|
||||
@@ -0,0 +1,156 @@
|
||||
=========================================================================
|
||||
MARS-1046: Rollback Package
|
||||
=========================================================================
|
||||
WARNING: This will reverse all changes from MARS-1046 installation!
|
||||
|
||||
This will:
|
||||
- Restore FILE_MANAGER package to version 3.3.0 (MARS-1056)
|
||||
- Remove NORMALIZE_DATE_FORMAT function
|
||||
- Restore original GENERATE_EXTERNAL_TABLE_PARAMS behavior
|
||||
=========================================================================
|
||||
Type YES to continue with rollback, or Ctrl+C to abort: yes
|
||||
old:BEGIN
|
||||
IF '&continue' IS NULL OR TRIM('&continue') IS NULL OR UPPER(TRIM('&continue')) != 'YES' THEN
|
||||
RAISE_APPLICATION_ERROR(-20001, 'Rollback aborted by user');
|
||||
END IF;
|
||||
END;
|
||||
|
||||
new:BEGIN
|
||||
IF 'yes' IS NULL OR TRIM('yes') IS NULL OR UPPER(TRIM('yes')) != 'YES' THEN
|
||||
RAISE_APPLICATION_ERROR(-20001, 'Rollback aborted by user');
|
||||
END IF;
|
||||
END;
|
||||
|
||||
PL/SQL procedure successfully completed.
|
||||
|
||||
Elapsed: 00:00:00.077
|
||||
|
||||
=========================================================================
|
||||
Step 1: Restore FILE_MANAGER Package Specification (v3.3.0)
|
||||
=========================================================================
|
||||
========================================================================
|
||||
MARS-1046 ROLLBACK Step 1: Restoring FILE_MANAGER Package Spec to v3.3.0
|
||||
========================================================================
|
||||
|
||||
Package CT_MRDS.FILE_MANAGER compiled
|
||||
|
||||
Elapsed: 00:00:00.135
|
||||
|
||||
Package CT_MRDS.FILE_MANAGER compiled
|
||||
|
||||
Elapsed: 00:00:00.121
|
||||
|
||||
OBJECT_NAME OBJECT_TYPE STATUS
|
||||
_______________ ______________ _________
|
||||
FILE_MANAGER PACKAGE VALID
|
||||
|
||||
Elapsed: 00:00:00.063
|
||||
SUCCESS: FILE_MANAGER package specification restored to version 3.3.0 (MARS-1056)
|
||||
|
||||
=========================================================================
|
||||
Step 2: Restore FILE_MANAGER Package Body (v3.3.0)
|
||||
=========================================================================
|
||||
========================================================================
|
||||
MARS-1046 ROLLBACK Step 2: Restoring FILE_MANAGER Package Body to v3.3.0
|
||||
========================================================================
|
||||
|
||||
Package Body CT_MRDS.FILE_MANAGER compiled
|
||||
|
||||
Elapsed: 00:00:00.205
|
||||
|
||||
Package Body CT_MRDS.FILE_MANAGER compiled
|
||||
|
||||
Elapsed: 00:00:00.132
|
||||
|
||||
OBJECT_NAME OBJECT_TYPE STATUS
|
||||
_______________ _______________ _________
|
||||
FILE_MANAGER PACKAGE BODY VALID
|
||||
|
||||
Elapsed: 00:00:00.061
|
||||
SUCCESS: FILE_MANAGER package body restored to version 3.3.0 (MARS-1056)
|
||||
|
||||
=========================================================================
|
||||
Step 3: Track Rollback Version
|
||||
=========================================================================
|
||||
========================================
|
||||
Package Version Tracking
|
||||
========================================
|
||||
EnvironmentID set to: dev
|
||||
[2026-01-12 16:58:44] [INFO] ENV_MANAGER.TRACK_PACKAGE_VERSION: Start TRACK_PACKAGE_VERSION
|
||||
[2026-01-12 16:58:45] [INFO] ENV_MANAGER.TRACK_PACKAGE_VERSION: End TRACK_PACKAGE_VERSION - Record inserted
|
||||
Packages tracked: 1 of 1
|
||||
|
||||
CT_MRDS.FILE_MANAGER = 3.3.0
|
||||
========================================
|
||||
|
||||
|
||||
PL/SQL procedure successfully completed.
|
||||
|
||||
Elapsed: 00:00:00.652
|
||||
|
||||
=========================================================================
|
||||
Step 4: Verify Package Status
|
||||
=========================================================================
|
||||
|
||||
========================================
|
||||
Package Version Verification
|
||||
========================================
|
||||
|
||||
|
||||
PACKAGE_OWNER PACKAGE_NAME VERSION STATUS
|
||||
________________ ___________________ __________ ______________________________________________________
|
||||
CT_MRDS DATA_EXPORTER 2.4.0 OK: Package CT_MRDS.DATA_EXPORTER has not changed.
|
||||
Last Tracked: 2026-01-11 18:46:35
|
||||
Version: 2.4.0
|
||||
CT_MRDS ENV_MANAGER 3.2.0 OK: Package CT_MRDS.ENV_MANAGER has not changed.
|
||||
Last Tracked: 2026-01-11 18:46:35
|
||||
Version: 3.2.0
|
||||
CT_MRDS FILE_ARCHIVER 2.0.0 OK: Package CT_MRDS.FILE_ARCHIVER has not changed.
|
||||
Last Tracked: 2025-11-25 16:00:36
|
||||
Version: 2.0.0
|
||||
CT_MRDS FILE_MANAGER 3.3.0 OK: Package CT_MRDS.FILE_MANAGER has not changed.
|
||||
Last Tracked: 2026-01-12 16:58:45
|
||||
Version: 3.3.0
|
||||
CT_MRDS WORKFLOW_MANAGER 1.7.1 OK: Package CT_MRDS.WORKFLOW_MANAGER has not changed.
|
||||
Last Tracked: 2025-11-25 16:00:36
|
||||
Version: 1.7.1
|
||||
ODS FILE_MANAGER_ODS 2.1.0 WARNING: Package ODS.FILE_MANAGER_ODS has changed!
|
||||
========================================
|
||||
Last Tracked Version: 2.1.0
|
||||
Last Tracked Date: 2025-11-26 08:58:57
|
||||
|
||||
BODY Changed:
|
||||
Current Hash: 1d167a53256c10dd...
|
||||
Last Hash: NULL...
|
||||
|
||||
RECOMMENDATION:
|
||||
1. Update PACKAGE_VERSION constant
|
||||
2. Update PACKAGE_BUILD_DATE constant
|
||||
3. Add entry to VERSION_HISTORY
|
||||
4. Call TRACK_PACKAGE_VERSION to update tracking
|
||||
Elapsed: 00:00:00.389
|
||||
|
||||
========================================
|
||||
Verification Complete
|
||||
========================================
|
||||
|
||||
Legend:
|
||||
OK - Package has not changed since last tracking
|
||||
WARNING - Package code changed without version update
|
||||
|
||||
For detailed hash information, use:
|
||||
SELECT ENV_MANAGER.GET_PACKAGE_HASH_INFO('OWNER', 'PACKAGE') FROM DUAL
|
||||
========================================
|
||||
|
||||
=========================================================================
|
||||
MARS-1046 Rollback - COMPLETED
|
||||
=========================================================================
|
||||
|
||||
FILE_MANAGER restored to version 3.3.0
|
||||
|
||||
Verification:
|
||||
SELECT FILE_MANAGER.GET_VERSION() FROM DUAL
|
||||
|
||||
Check the log file for complete rollback details:
|
||||
log/ROLLBACK_MARS_1046_G45C5E88148E17E_GGMICHALSKI_20260112_165836.log
|
||||
=========================================================================
|
||||
@@ -0,0 +1,205 @@
|
||||
# MARS-1046: External Table Direct Test Results
|
||||
|
||||
**Test Date:** 2026-01-13
|
||||
**Tester:** Grzegorz Michalski
|
||||
**Purpose:** Verify FILE_MANAGER.CREATE_EXTERNAL_TABLE with ISO 8601 date format
|
||||
|
||||
---
|
||||
|
||||
## Test Execution Summary
|
||||
|
||||
### Test Scenario
|
||||
Direct creation of external table using `ODS.FILE_MANAGER_ODS.CREATE_EXTERNAL_TABLE` procedure to read CSV file with ISO 8601 timestamp format containing:
|
||||
- Date separator: `T` (literal character)
|
||||
- Milliseconds: `.FF3`
|
||||
- Timezone offset: `TZH:TZM`
|
||||
|
||||
### Test Steps Performed
|
||||
|
||||
#### Step 1: Template Table Creation
|
||||
- Template: `CT_ET_TEMPLATES.ISO8601_TEST_DATA`
|
||||
- Column: `EVENT_TIMESTAMP TIMESTAMP(3) WITH TIME ZONE`
|
||||
- Status: CREATED
|
||||
|
||||
#### Step 2: FILE_MANAGER Configuration
|
||||
- Source: `TEST`
|
||||
- File Config: `ISO8601_TEST_DATA`
|
||||
- Date Format: `YYYY-MM-DD"T"HH24:MI:SS.FF3TZH:TZM`
|
||||
- Status: CONFIGURED
|
||||
|
||||
#### Step 3: CSV File Upload
|
||||
- Bucket: `inbox`
|
||||
- Path: `INBOX/TEST/ISO8601/ISO8601_TEST_DATA/iso8601_test_data.csv`
|
||||
- Records: 5
|
||||
- Format: Full ISO 8601 with milliseconds and timezone
|
||||
- Status: UPLOADED
|
||||
|
||||
#### Step 4: External Table Creation
|
||||
```sql
|
||||
CALL ODS.FILE_MANAGER_ODS.CREATE_EXTERNAL_TABLE(
|
||||
pTableName => 'ISO8601_TEST_DATA_INBOX',
|
||||
pTemplateTableName => 'CT_ET_TEMPLATES.ISO8601_TEST_DATA',
|
||||
pPrefix => 'INBOX/TEST/ISO8601/ISO8601_TEST_DATA',
|
||||
pBucketUri => CT_MRDS.ENV_MANAGER.gvInboxBucketUri
|
||||
);
|
||||
```
|
||||
- External Table: `ODS.ISO8601_TEST_DATA_INBOX`
|
||||
- Type: `ORACLE_LOADER`
|
||||
- Status: CREATED
|
||||
|
||||
---
|
||||
|
||||
## CRITICAL VERIFICATION: ACCESS PARAMETERS
|
||||
|
||||
### Expected Format
|
||||
```
|
||||
DATE_FORMAT TIMESTAMP WITH TIME ZONE MASK 'YYYY-MM-DD"T"HH24:MI:SS.FF3TZH:TZM'
|
||||
```
|
||||
|
||||
### Actual Format (from all_external_tables)
|
||||
```
|
||||
RECORDS IGNORE_HEADER=1 DELIMITED BY DETECTED NEWLINE NOLOGFILE NOBADFILE NODISCARDFILE READSIZE=10000000 CREDENTIAL '"OCI$RESOURCE_PRINCIPAL"'
|
||||
FIELDS CSV WITHOUT EMBEDDED MISSING FIELD VALUES ARE NULL NOTRIM (
|
||||
"ID"
|
||||
,"EVENT_NAME" CHAR(100)
|
||||
,"EVENT_TIMESTAMP" CHAR(50) DATE_FORMAT TIMESTAMP WITH TIME ZONE MASK 'YYYY-MM-DD"T"HH24:MI:SS.FF3TZH:TZM'
|
||||
,"DESCRIPTION" CHAR(500)
|
||||
)
|
||||
```
|
||||
|
||||
**RESULT: PASS**
|
||||
Separator `T` is correctly quoted as `"T"` in the MASK clause.
|
||||
|
||||
---
|
||||
|
||||
## Data Reading Test Results
|
||||
|
||||
### Test Query
|
||||
```sql
|
||||
SELECT
|
||||
ID,
|
||||
EVENT_NAME,
|
||||
TO_CHAR(EVENT_TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3 TZH:TZM') AS PARSED_TIMESTAMP,
|
||||
DESCRIPTION
|
||||
FROM ODS.ISO8601_TEST_DATA_INBOX
|
||||
ORDER BY ID;
|
||||
```
|
||||
|
||||
### Results
|
||||
| ID | EVENT_NAME | PARSED_TIMESTAMP | DESCRIPTION |
|
||||
|----|------------|------------------|-------------|
|
||||
| 1 | System Start | 2012-03-02 14:16:23.798 +01:00 | Initial system startup with timezone offset |
|
||||
| 2 | Data Processing | 2024-11-27 09:30:45.123 +01:00 | Batch processing job executed |
|
||||
| 3 | User Login | 2025-01-15 18:22:10.456 +02:00 | User authentication successful |
|
||||
| 4 | Error Event | 2023-07-20 03:45:00.789 +00:00 | Critical error detected in module X |
|
||||
| 5 | Backup Complete | 2024-12-31 23:59:59.999 +01:00 | Year-end backup finished successfully |
|
||||
|
||||
**RESULT: PASS**
|
||||
All 5 records successfully parsed with complete timestamp data.
|
||||
|
||||
---
|
||||
|
||||
## Verification Summary
|
||||
|
||||
### Completeness Check
|
||||
```sql
|
||||
SELECT
|
||||
COUNT(*) AS TOTAL_RECORDS,
|
||||
COUNT(EVENT_TIMESTAMP) AS PARSED_TIMESTAMPS,
|
||||
CASE
|
||||
WHEN COUNT(*) = COUNT(EVENT_TIMESTAMP) THEN 'PASS - All timestamps parsed correctly'
|
||||
ELSE 'FAIL - Some timestamps NULL'
|
||||
END AS TEST_RESULT
|
||||
FROM ODS.ISO8601_TEST_DATA_INBOX;
|
||||
```
|
||||
|
||||
| TOTAL_RECORDS | PARSED_TIMESTAMPS | TEST_RESULT |
|
||||
|---------------|-------------------|-------------|
|
||||
| 5 | 5 | PASS - All timestamps parsed correctly |
|
||||
|
||||
---
|
||||
|
||||
## NORMALIZE_DATE_FORMAT Function Verification
|
||||
|
||||
### Function Behavior
|
||||
The `NORMALIZE_DATE_FORMAT` private function in `FILE_MANAGER` package body:
|
||||
1. Detects unquoted `T` separator in ISO 8601 format strings
|
||||
2. Automatically wraps `T` in double quotes for Oracle External Tables compatibility
|
||||
3. Maintains idempotency - does not re-quote already quoted separators
|
||||
|
||||
### Input/Output Examples
|
||||
| Input Format | Output Format | Status |
|
||||
|--------------|---------------|--------|
|
||||
| `YYYY-MM-DDTHH24:MI:SS.FF3TZH:TZM` | `YYYY-MM-DD"T"HH24:MI:SS.FF3TZH:TZM` | NORMALIZED |
|
||||
| `YYYY-MM-DD"T"HH24:MI:SS` | `YYYY-MM-DD"T"HH24:MI:SS` | UNCHANGED (idempotent) |
|
||||
| `DD/MM/YYYY HH24:MI:SS` | `DD/MM/YYYY HH24:MI:SS` | UNCHANGED (no T separator) |
|
||||
|
||||
---
|
||||
|
||||
## Test Results Summary
|
||||
|
||||
| Test Category | Test Case | Result | Notes |
|
||||
|---------------|-----------|--------|-------|
|
||||
| **Package Compilation** | FILE_MANAGER SPEC | PASS | VALID |
|
||||
| **Package Compilation** | FILE_MANAGER BODY | PASS | VALID |
|
||||
| **Version Tracking** | ENV_MANAGER.TRACK_PACKAGE | PASS | No untracked changes |
|
||||
| **External Table Creation** | CREATE_EXTERNAL_TABLE call | PASS | Table created successfully |
|
||||
| **Date Format Normalization** | T separator quoting | PASS | `"T"` correctly inserted |
|
||||
| **Access Parameters** | DDL format verification | PASS | MASK contains `YYYY-MM-DD"T"HH24:MI:SS.FF3TZH:TZM` |
|
||||
| **Data Reading** | CSV file parsing | PASS | All 5 records read |
|
||||
| **Timestamp Parsing** | Milliseconds preservation | PASS | .FF3 values preserved (.798, .123, .456, .789, .999) |
|
||||
| **Timestamp Parsing** | Timezone preservation | PASS | TZH:TZM values preserved (+01:00, +02:00, +00:00) |
|
||||
| **Data Completeness** | NULL check | PASS | 5/5 timestamps successfully parsed |
|
||||
|
||||
---
|
||||
|
||||
## FINAL VERDICT
|
||||
|
||||
**STATUS: ALL TESTS PASSED**
|
||||
|
||||
### Key Achievements
|
||||
1. External table successfully created using `FILE_MANAGER_ODS.CREATE_EXTERNAL_TABLE`
|
||||
2. ISO 8601 format with literal `T` separator correctly handled
|
||||
3. Date format automatically normalized with quoted `"T"`
|
||||
4. All CSV records successfully parsed from INBOX bucket
|
||||
5. Milliseconds and timezone information preserved in timestamps
|
||||
6. No NULL values in timestamp columns
|
||||
|
||||
### Production Readiness
|
||||
- Package FILE_MANAGER v3.3.1 is **PRODUCTION READY**
|
||||
- NORMALIZE_DATE_FORMAT function operates correctly
|
||||
- External table creation workflow validated end-to-end
|
||||
- ISO 8601 date parsing fully functional
|
||||
|
||||
---
|
||||
|
||||
## Test Artifacts
|
||||
|
||||
### Files Used
|
||||
- Template Table: `create_iso8601_test_template.sql`
|
||||
- Configuration: `configure_iso8601_test.sql`
|
||||
- Test Script: `test_create_external_table.sql`
|
||||
- Test Data: `iso8601_test_data.csv` (5 records with full ISO 8601 format)
|
||||
|
||||
### Database Objects Created
|
||||
- Template: `CT_ET_TEMPLATES.ISO8601_TEST_DATA`
|
||||
- External Table: `ODS.ISO8601_TEST_DATA_INBOX`
|
||||
- External Table: `ODS.ISO8601_TEST_DATA_ODS`
|
||||
|
||||
### Cleanup (Optional)
|
||||
```sql
|
||||
-- Drop external tables after testing
|
||||
DROP TABLE ODS.ISO8601_TEST_DATA_INBOX;
|
||||
DROP TABLE ODS.ISO8601_TEST_DATA_ODS;
|
||||
|
||||
-- Remove template table
|
||||
DROP TABLE CT_ET_TEMPLATES.ISO8601_TEST_DATA;
|
||||
|
||||
-- Remove configuration
|
||||
CALL CT_MRDS.FILE_MANAGER.DELETE_SOURCE_CASCADE(pSourceKey => 'TEST');
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Test Completed:** 2026-01-13 13:24:48
|
||||
**Approved for Production Deployment:** YES
|
||||
@@ -0,0 +1,12 @@
|
||||
=========================================================================
|
||||
MARS-1046: ISO 8601 Date Format Fix for FILE_MANAGER
|
||||
=========================================================================
|
||||
|
||||
This script will:
|
||||
- Update FILE_MANAGER package specification (3.3.0 â 3.3.1)
|
||||
- Update FILE_MANAGER package body with NORMALIZE_DATE_FORMAT function
|
||||
- Fix parsing of ISO 8601 formats: YYYY-MM-DDTHH24:MI:SS.FF3TZH:TZM
|
||||
- Track package version in A_PACKAGE_VERSION_TRACKING
|
||||
|
||||
Expected Duration: 1-2 minutes
|
||||
=========================================================================
|
||||
@@ -0,0 +1,12 @@
|
||||
=========================================================================
|
||||
MARS-1046: ISO 8601 Date Format Fix for FILE_MANAGER
|
||||
=========================================================================
|
||||
|
||||
This script will:
|
||||
- Update FILE_MANAGER package specification (3.3.0 â 3.3.1)
|
||||
- Update FILE_MANAGER package body with NORMALIZE_DATE_FORMAT function
|
||||
- Fix parsing of ISO 8601 formats: YYYY-MM-DDTHH24:MI:SS.FF3TZH:TZM
|
||||
- Track package version in A_PACKAGE_VERSION_TRACKING
|
||||
|
||||
Expected Duration: 1-2 minutes
|
||||
=========================================================================
|
||||
@@ -0,0 +1,213 @@
|
||||
=========================================================================
|
||||
MARS-1046: ISO 8601 Date Format Fix for FILE_MANAGER
|
||||
=========================================================================
|
||||
|
||||
This script will:
|
||||
- Update FILE_MANAGER package specification (3.3.0 → 3.3.1)
|
||||
- Update FILE_MANAGER package body with NORMALIZE_DATE_FORMAT function
|
||||
- Fix parsing of ISO 8601 formats: YYYY-MM-DDTHH24:MI:SS.FF3TZH:TZM
|
||||
- Track package version in A_PACKAGE_VERSION_TRACKING
|
||||
|
||||
Expected Duration: 1-2 minutes
|
||||
=========================================================================
|
||||
Type YES to continue with installation, or Ctrl+C to abort: YES
|
||||
old: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;
|
||||
|
||||
new:BEGIN
|
||||
IF 'YES' IS NULL OR TRIM('YES') IS NULL OR UPPER(TRIM('YES')) != 'YES' THEN
|
||||
RAISE_APPLICATION_ERROR(-20001, 'Installation aborted by user');
|
||||
END IF;
|
||||
END;
|
||||
|
||||
PL/SQL procedure successfully completed.
|
||||
|
||||
Elapsed: 00:00:00.088
|
||||
|
||||
=========================================================================
|
||||
Step 1: Update FILE_MANAGER Package Specification
|
||||
=========================================================================
|
||||
========================================================================
|
||||
MARS-1046: Updating CT_MRDS.FILE_MANAGER Package Specification
|
||||
========================================================================
|
||||
|
||||
Package CT_MRDS.FILE_MANAGER compiled
|
||||
|
||||
Elapsed: 00:00:00.291
|
||||
|
||||
OBJECT_NAME OBJECT_TYPE STATUS
|
||||
_______________ ______________ _________
|
||||
FILE_MANAGER PACKAGE VALID
|
||||
|
||||
Elapsed: 00:00:00.198
|
||||
SUCCESS: FILE_MANAGER package specification updated to version 3.3.1
|
||||
|
||||
=========================================================================
|
||||
Step 2: Update FILE_MANAGER Package Body
|
||||
=========================================================================
|
||||
========================================================================
|
||||
MARS-1046: Updating CT_MRDS.FILE_MANAGER Package Body
|
||||
========================================================================
|
||||
|
||||
Package Body CT_MRDS.FILE_MANAGER compiled
|
||||
|
||||
LINE/COL ERROR
|
||||
--------- -------------------------------------------------------------
|
||||
123/10 PLS-00201: identifier 'VGSOURCEFILECONFIGKEY' must be declared
|
||||
123/10 PL/SQL: Statement ignored
|
||||
149/4 PL/SQL: Item ignored
|
||||
153/11 PLS-00201: identifier 'TSOURCEFILERECEIVED' must be declared
|
||||
208/7 PL/SQL: Statement ignored
|
||||
208/33 PLS-00306: wrong number or types of arguments in call to 'REGISTER_SOURCE_FILE_RECEIVED'
|
||||
296/10 PLS-00201: identifier 'VGMSGTMP' must be declared
|
||||
296/10 PL/SQL: Statement ignored
|
||||
298/10 PL/SQL: Statement ignored
|
||||
298/40 PLS-00201: identifier 'VGMSGTMP' must be declared
|
||||
299/10 PL/SQL: Statement ignored
|
||||
299/77 PLS-00201: identifier 'VGMSGTMP' must be declared
|
||||
308/10 PLS-00201: identifier 'VGMSGTMP' must be declared
|
||||
308/10 PL/SQL: Statement ignored
|
||||
326/10 PL/SQL: Statement ignored
|
||||
326/40 PLS-00201: identifier 'VGMSGTMP' must be declared
|
||||
327/10 PL/SQL: Statement ignored
|
||||
327/76 PLS-00201: identifier 'VGMSGTMP' must be declared
|
||||
429/7 PLS-00313: 'GENERATE_EXTERNAL_TABLE_PARAMS' not declared in this scope
|
||||
429/7 PL/SQL: Statement ignored
|
||||
Errors: check compiler log
|
||||
Elapsed: 00:00:00.454
|
||||
|
||||
Package Body CT_MRDS.FILE_MANAGER compiled
|
||||
|
||||
LINE/COL ERROR
|
||||
--------- -------------------------------------------------------------
|
||||
123/10 PLS-00201: identifier 'VGSOURCEFILECONFIGKEY' must be declared
|
||||
123/10 PL/SQL: Statement ignored
|
||||
149/4 PL/SQL: Item ignored
|
||||
153/11 PLS-00201: identifier 'TSOURCEFILERECEIVED' must be declared
|
||||
208/7 PL/SQL: Statement ignored
|
||||
208/33 PLS-00306: wrong number or types of arguments in call to 'REGISTER_SOURCE_FILE_RECEIVED'
|
||||
296/10 PLS-00201: identifier 'VGMSGTMP' must be declared
|
||||
296/10 PL/SQL: Statement ignored
|
||||
298/10 PL/SQL: Statement ignored
|
||||
298/40 PLS-00201: identifier 'VGMSGTMP' must be declared
|
||||
299/10 PL/SQL: Statement ignored
|
||||
299/77 PLS-00201: identifier 'VGMSGTMP' must be declared
|
||||
308/10 PLS-00201: identifier 'VGMSGTMP' must be declared
|
||||
308/10 PL/SQL: Statement ignored
|
||||
326/10 PL/SQL: Statement ignored
|
||||
326/40 PLS-00201: identifier 'VGMSGTMP' must be declared
|
||||
327/10 PL/SQL: Statement ignored
|
||||
327/76 PLS-00201: identifier 'VGMSGTMP' must be declared
|
||||
429/7 PLS-00313: 'GENERATE_EXTERNAL_TABLE_PARAMS' not declared in this scope
|
||||
429/7 PL/SQL: Statement ignored
|
||||
Errors: check compiler log
|
||||
Elapsed: 00:00:00.376
|
||||
|
||||
OBJECT_NAME OBJECT_TYPE STATUS
|
||||
_______________ _______________ __________
|
||||
FILE_MANAGER PACKAGE BODY INVALID
|
||||
|
||||
Elapsed: 00:00:00.169
|
||||
SUCCESS: FILE_MANAGER package body updated with ISO 8601 date format fix
|
||||
|
||||
=========================================================================
|
||||
Step 3: Track Package Version
|
||||
=========================================================================
|
||||
========================================
|
||||
Package Version Tracking - MARS-1046
|
||||
========================================
|
||||
No packages found in list
|
||||
========================================
|
||||
|
||||
|
||||
PL/SQL procedure successfully completed.
|
||||
|
||||
Elapsed: 00:00:00.094
|
||||
|
||||
=========================================================================
|
||||
Step 4: Verify Package Status
|
||||
=========================================================================
|
||||
|
||||
========================================
|
||||
Package Version Verification
|
||||
========================================
|
||||
|
||||
|
||||
PACKAGE_OWNER PACKAGE_NAME VERSION STATUS
|
||||
________________ ___________________ __________ ______________________________________________________
|
||||
CT_MRDS DATA_EXPORTER 2.1.0 OK: Package CT_MRDS.DATA_EXPORTER has not changed.
|
||||
Last Tracked: 2025-11-25 16:00:35
|
||||
Version: 2.1.0
|
||||
CT_MRDS ENV_MANAGER 3.1.0 OK: Package CT_MRDS.ENV_MANAGER has not changed.
|
||||
Last Tracked: 2025-11-25 16:00:35
|
||||
Version: 3.1.0
|
||||
CT_MRDS FILE_ARCHIVER 2.0.0 OK: Package CT_MRDS.FILE_ARCHIVER has not changed.
|
||||
Last Tracked: 2025-11-25 16:00:36
|
||||
Version: 2.0.0
|
||||
CT_MRDS FILE_MANAGER 3.2.1 WARNING: Package CT_MRDS.FILE_MANAGER has changed!
|
||||
========================================
|
||||
Last Tracked Version: 3.2.1
|
||||
Last Tracked Date: 2025-11-27 08:10:44
|
||||
|
||||
SPECIFICATION Changed:
|
||||
Current Hash: 6eeb27f0ea738f64...
|
||||
Last Hash: 6efa2d75e3c8aef6...
|
||||
|
||||
BODY Changed:
|
||||
Current Hash: ef2a9364f4117ff1...
|
||||
Last Hash: cf1365d073d38524...
|
||||
|
||||
RECOMMENDATION:
|
||||
1. Update PACKAGE_VERSION constant
|
||||
2. Update PACKAGE_BUILD_DATE constant
|
||||
3. Add entry to VERSION_HISTORY
|
||||
4. Call TRACK_PACKAGE_VERSION to update tracking
|
||||
CT_MRDS WORKFLOW_MANAGER 1.7.1 OK: Package CT_MRDS.WORKFLOW_MANAGER has not changed.
|
||||
Last Tracked: 2025-11-25 16:00:36
|
||||
Version: 1.7.1
|
||||
ODS FILE_MANAGER_ODS 2.1.0 WARNING: Package ODS.FILE_MANAGER_ODS has changed!
|
||||
========================================
|
||||
Last Tracked Version: 2.1.0
|
||||
Last Tracked Date: 2025-11-26 08:58:57
|
||||
|
||||
BODY Changed:
|
||||
Current Hash: 1d167a53256c10dd...
|
||||
Last Hash: NULL...
|
||||
|
||||
RECOMMENDATION:
|
||||
1. Update PACKAGE_VERSION constant
|
||||
2. Update PACKAGE_BUILD_DATE constant
|
||||
3. Add entry to VERSION_HISTORY
|
||||
4. Call TRACK_PACKAGE_VERSION to update tracking
|
||||
EnvironmentID set to: dev
|
||||
|
||||
Elapsed: 00:00:00.587
|
||||
|
||||
========================================
|
||||
Verification Complete
|
||||
========================================
|
||||
|
||||
Legend:
|
||||
OK - Package has not changed since last tracking
|
||||
WARNING - Package code changed without version update
|
||||
|
||||
For detailed hash information, use:
|
||||
SELECT ENV_MANAGER.GET_PACKAGE_HASH_INFO('OWNER', 'PACKAGE') FROM DUAL
|
||||
========================================
|
||||
|
||||
=========================================================================
|
||||
MARS-1046 Installation - COMPLETED
|
||||
=========================================================================
|
||||
|
||||
FILE_MANAGER updated to version 3.3.1
|
||||
|
||||
Verification:
|
||||
SELECT FILE_MANAGER.GET_VERSION() FROM DUAL
|
||||
SELECT FILE_MANAGER.GET_BUILD_INFO() FROM DUAL
|
||||
|
||||
Check the log file for complete installation details:
|
||||
INSTALL_MARS_1046_G45C5E88148E17E_GGMICHALSKI_20251127_103105.log
|
||||
=========================================================================
|
||||
314
MARS_Packages/REL02/MARS-1046/test/TEST_RESULTS.md
Normal file
314
MARS_Packages/REL02/MARS-1046/test/TEST_RESULTS.md
Normal file
@@ -0,0 +1,314 @@
|
||||
# MARS-1046 Test Results
|
||||
|
||||
## Executive Summary
|
||||
**ALL TESTS PASSED** - ISO 8601 date format with 'T' separator **INCLUDING FRACTIONAL SECONDS AND TIMEZONE** successfully implemented and validated.
|
||||
|
||||
## Test Date
|
||||
2025-11-27 11:08 CET
|
||||
|
||||
## Package Version
|
||||
FILE_MANAGER 3.3.1 (MARS-1046)
|
||||
|
||||
## Unit Tests Results
|
||||
|
||||
### Test 1: Package Version
|
||||
- **Expected**: 3.3.1
|
||||
- **Actual**: 3.3.1
|
||||
- **Status**: PASS
|
||||
|
||||
### Test 2: Build Information
|
||||
- **Expected**: Contains "MARS-1046"
|
||||
- **Actual**: 2025-11-27 14:00:00 | MARS-1046: Add support for ISO 8601 date format with T separator
|
||||
- **Status**: PASS
|
||||
|
||||
### Test 3: Package Tracking
|
||||
- **Expected**: FILE_MANAGER 3.3.1 tracked in ENV_MANAGER
|
||||
- **Actual**: Package correctly registered
|
||||
- **Status**: PASS
|
||||
|
||||
### Test 4: Compilation Status
|
||||
- **Expected**: PACKAGE and PACKAGE BODY both VALID
|
||||
- **Actual**: Both objects VALID
|
||||
- **Status**: PASS
|
||||
|
||||
### Test 5: NORMALIZE_DATE_FORMAT Function Logic
|
||||
|
||||
#### Case 1: ISO 8601 Format with Unquoted 'T'
|
||||
- **Input**: `YYYY-MM-DDTHH24:MI:SS`
|
||||
- **Expected**: `YYYY-MM-DD"T"HH24:MI:SS` (T wrapped in quotes)
|
||||
- **Actual**: `YYYY-MM-DD"T"HH24:MI:SS`
|
||||
- **Status**: PASS
|
||||
|
||||
#### Case 2: Standard Format without 'T'
|
||||
- **Input**: `DD/MM/YYYY HH24:MI:SS`
|
||||
- **Expected**: `DD/MM/YYYY HH24:MI:SS` (unchanged)
|
||||
- **Actual**: `DD/MM/YYYY HH24:MI:SS`
|
||||
- **Status**: PASS
|
||||
|
||||
#### Case 3: Already Quoted 'T'
|
||||
- **Input**: `YYYY-MM-DD"T"HH24:MI:SS`
|
||||
- **Expected**: `YYYY-MM-DD"T"HH24:MI:SS` (unchanged, idempotent)
|
||||
- **Actual**: `YYYY-MM-DD"T"HH24:MI:SS`
|
||||
- **Status**: PASS
|
||||
|
||||
## End-to-End Integration Tests
|
||||
|
||||
### Test Setup
|
||||
- **Template Table**: `CT_ET_TEMPLATES.ISO8601_TEST_DATA`
|
||||
- **Column Type**: `DATE`
|
||||
- **Date Format**: `YYYY-MM-DD"T"HH24:MI:SS`
|
||||
- **Test File**: `iso8601_test_data_simple.csv`
|
||||
- **Records**: 5 test records with ISO 8601 timestamps
|
||||
|
||||
### Test Data Sample
|
||||
```csv
|
||||
ID,EVENT_NAME,EVENT_TIMESTAMP,DESCRIPTION
|
||||
1,System Start,2012-03-02T14:16:23.798+01:00,Initial system startup
|
||||
2,Data Processing,2024-11-27T09:30:45.123+01:00,Batch processing job
|
||||
3,User Login,2025-01-15T18:22:10.456+02:00,User authentication successful
|
||||
```
|
||||
|
||||
**Format Features:**
|
||||
- Date: `YYYY-MM-DD`
|
||||
- 'T' separator (quoted in external table DDL)
|
||||
- Time: `HH24:MI:SS`
|
||||
- Fractional seconds: `.FF3` (milliseconds)
|
||||
- Timezone offset: `TZH:TZM` (+01:00, +02:00, etc.)
|
||||
|
||||
### File Processing Workflow
|
||||
|
||||
#### Step 1: File Registration
|
||||
- **Method**: `FILE_MANAGER.PROCESS_SOURCE_FILE`
|
||||
- **Input Path**: `INBOX/TEST/ISO8601/ISO8601_TEST_DATA/iso8601_test_data_simple.csv`
|
||||
- **Status**: SUCCESS
|
||||
- **External Table**: `ISO8601_TEST_DATA_104` created
|
||||
|
||||
#### Step 2: External Table DDL Verification
|
||||
**Confirmed NORMALIZE_DATE_FORMAT working in production with TIMESTAMP WITH TIME ZONE:**
|
||||
```sql
|
||||
CREATE TABLE "ODS"."ISO8601_TEST_DATA_ODS"
|
||||
(
|
||||
"ID" NUMBER,
|
||||
"EVENT_NAME" VARCHAR2(100),
|
||||
"EVENT_TIMESTAMP" TIMESTAMP(3) WITH TIME ZONE,
|
||||
"DESCRIPTION" VARCHAR2(500)
|
||||
)
|
||||
ORGANIZATION EXTERNAL (
|
||||
TYPE ORACLE_LOADER
|
||||
ACCESS PARAMETERS (
|
||||
FIELDS CSV (
|
||||
"ID",
|
||||
"EVENT_NAME" CHAR(100),
|
||||
"EVENT_TIMESTAMP" CHAR(50) DATE_FORMAT TIMESTAMP WITH TIME ZONE MASK 'YYYY-MM-DD"T"HH24:MI:SS.FF3TZH:TZM', -- "T" is quoted!
|
||||
"DESCRIPTION" CHAR(500)
|
||||
)
|
||||
)
|
||||
LOCATION ('https://.../ODS/TEST/ISO8601_TEST_DATA/')
|
||||
)
|
||||
```
|
||||
|
||||
**Key Implementation Details:**
|
||||
- Column type: `TIMESTAMP(3) WITH TIME ZONE`
|
||||
- Field specification: `CHAR(50) DATE_FORMAT TIMESTAMP WITH TIME ZONE MASK`
|
||||
- Format mask: `'YYYY-MM-DD"T"HH24:MI:SS.FF3TZH:TZM'` with quoted "T"
|
||||
- Fixed CHAR(50) length for CSV parsing (accommodates up to 50 characters)
|
||||
|
||||
#### Step 3: File Validation
|
||||
- **CSV Column Count**: 4
|
||||
- **Template Column Count**: 4
|
||||
- **Column Match**: EXACT MATCH
|
||||
- **Data Validation**: PASS
|
||||
- **Status**: READY_FOR_INGESTION
|
||||
|
||||
#### Step 4: File Movement
|
||||
- **Source**: `inbox/o/INBOX/TEST/ISO8601/ISO8601_TEST_DATA/iso8601_test_data.csv`
|
||||
- **Destination**: `data/o/ODS/TEST/ISO8601_TEST_DATA/iso8601_test_data.csv`
|
||||
- **Status**: SUCCESS
|
||||
- **Timestamp**: 2025-11-27T11:08:31.481000+00:00
|
||||
|
||||
#### Step 5: Data Verification in ODS External Table
|
||||
**Query Results** (from `ODS.ISO8601_TEST_DATA_ODS`):
|
||||
```
|
||||
ID EVENT_NAME EVENT_TIMESTAMP DESCRIPTION
|
||||
1 System Start 02-MAR-12 02.16.23.798000000 PM +01:00 Initial system startup
|
||||
2 Data Processing 27-NOV-24 09.30.45.123000000 AM +01:00 Batch processing job
|
||||
3 User Login 15-JAN-25 06.22.10.456000000 PM +02:00 User authentication successful
|
||||
4 Error Event 20-JUL-23 03.45.00.789000000 AM GMT Critical error detected
|
||||
5 Backup Complete 31-DEC-24 11.59.59.999000000 PM +01:00 Year-end backup finished
|
||||
```
|
||||
|
||||
**Formatted ISO 8601 Output**:
|
||||
```sql
|
||||
SELECT ID, TO_CHAR(EVENT_TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3 TZH:TZM') AS ISO8601
|
||||
FROM ODS.ISO8601_TEST_DATA_ODS ORDER BY ID;
|
||||
|
||||
ID ISO8601
|
||||
1 2012-03-02 14:16:23.798 +01:00 (Fractional seconds preserved)
|
||||
2 2024-11-27 09:30:45.123 +01:00 (Timezone offset preserved)
|
||||
3 2025-01-15 18:22:10.456 +02:00 (Different timezone correctly parsed)
|
||||
4 2023-07-20 03:45:00.789 +00:00 (GMT timezone (00:00) recognized)
|
||||
5 2024-12-31 23:59:59.999 +01:00 (Millisecond precision maintained)
|
||||
```
|
||||
|
||||
### File Status Tracking
|
||||
```
|
||||
SOURCE_FILE_NAME PROCESSING_STATUS RECEPTION_DATE
|
||||
iso8601_test_data.csv READY_FOR_INGESTION 27-NOV-25 11:08
|
||||
```
|
||||
|
||||
## Technical Findings
|
||||
|
||||
### Oracle External Table TIMESTAMP WITH TIME ZONE Support
|
||||
**BREAKTHROUGH DISCOVERY**: Oracle External Tables **FULLY SUPPORT** `TIMESTAMP WITH TIME ZONE` using special syntax!
|
||||
|
||||
**Required Syntax:**
|
||||
```sql
|
||||
column_name CHAR(length) DATE_FORMAT TIMESTAMP WITH TIME ZONE MASK 'format_mask'
|
||||
```
|
||||
|
||||
**Key Requirements:**
|
||||
1. **Field Type**: Must use `CHAR(length)` for CSV input parsing (not TIMESTAMP directly)
|
||||
2. **DATE_FORMAT Keyword**: Specifies the format conversion type
|
||||
3. **TIMESTAMP WITH TIME ZONE**: Indicates target data type
|
||||
4. **MASK**: Format mask with quoted literals (e.g., `"T"` for ISO 8601 separator)
|
||||
5. **Fixed Length**: Use `CHAR(50)` to accommodate full ISO 8601 format (29+ characters)
|
||||
|
||||
**Supported Format Components:**
|
||||
- `YYYY-MM-DD` - Date components
|
||||
- `"T"` - Literal separator (must be quoted)
|
||||
- `HH24:MI:SS` - Time components
|
||||
- `.FF3` - Fractional seconds (milliseconds, 3 digits)
|
||||
- `TZH:TZM` - Timezone hour and minute offset
|
||||
|
||||
### Previous Limitation Resolved
|
||||
**Initial Assessment** (INCORRECT): "External tables support only DATE, NUMBER, VARCHAR2, CHAR, RAW - no TIMESTAMP types"
|
||||
|
||||
**Corrected Understanding**: External tables support TIMESTAMP WITH TIME ZONE using `DATE_FORMAT` syntax with proper field specification.
|
||||
|
||||
### Implementation Details
|
||||
|
||||
#### NORMALIZE_DATE_FORMAT Function
|
||||
- **Lines**: 4-64 in FILE_MANAGER.pkb
|
||||
- **Detection Pattern**: `REGEXP_LIKE(vDateFormat, '[YMD]T[HM]')`
|
||||
- **Quote Check**: `INSTR(vDateFormat, '"T"') > 0`
|
||||
- **Transform**: `REGEXP_REPLACE(vDateFormat, '([YMD])T([HM])', '\1"T"\2')`
|
||||
|
||||
#### Integration Point
|
||||
- **Location**: Line ~1316 in FILE_MANAGER.pkb (GENERATE_EXTERNAL_TABLE_PARAMS)
|
||||
- **Logic Enhancement**: Added specialized handling for TIMESTAMP WITH TIME ZONE
|
||||
|
||||
**Implementation:**
|
||||
```sql
|
||||
CASE
|
||||
WHEN rec.data_type = 'DATE' THEN
|
||||
-- Standard DATE format
|
||||
rec.quoted_column_name || ' DATE ' || CHR(39) || NORMALIZE_DATE_FORMAT(...)
|
||||
|
||||
WHEN rec.data_type LIKE 'TIMESTAMP%WITH TIME ZONE' THEN
|
||||
-- TIMESTAMP WITH TIME ZONE requires special DATE_FORMAT syntax
|
||||
rec.quoted_column_name || ' CHAR(50) DATE_FORMAT TIMESTAMP WITH TIME ZONE MASK ' ||
|
||||
CHR(39) || NORMALIZE_DATE_FORMAT(...) || CHR(39)
|
||||
|
||||
WHEN REGEXP_SUBSTR(rec.data_type, '^[A-Z]+') = 'TIMESTAMP' THEN
|
||||
-- Other TIMESTAMP types (without timezone)
|
||||
rec.quoted_column_name || ' TIMESTAMP ' || CHR(39) || NORMALIZE_DATE_FORMAT(...)
|
||||
|
||||
...
|
||||
END CASE
|
||||
```
|
||||
|
||||
**Key Changes from Original:**
|
||||
1. Split DATE and TIMESTAMP handling into separate branches
|
||||
2. Added TIMESTAMP WITH TIME ZONE special case using `DATE_FORMAT ... MASK` syntax
|
||||
3. Fixed CHAR(50) length for ISO 8601 format (was using rec.data_length=13, too small)
|
||||
4. Maintained NORMALIZE_DATE_FORMAT wrapping for 'T' separator quoting
|
||||
|
||||
## Files Modified
|
||||
|
||||
### Source DDL Files
|
||||
- `database/CT_MRDS/packages/FILE_MANAGER.pkg` - Version bump to 3.3.1
|
||||
- `database/CT_MRDS/packages/FILE_MANAGER.pkb` - Added NORMALIZE_DATE_FORMAT function
|
||||
|
||||
### Release Package Files
|
||||
- `REL01/MARS-1046/new_version/FILE_MANAGER.pkg`
|
||||
- `REL01/MARS-1046/new_version/FILE_MANAGER.pkb`
|
||||
- `REL01/MARS-1046/current_version/FILE_MANAGER.pkg` (backup)
|
||||
- `REL01/MARS-1046/current_version/FILE_MANAGER.pkb` (backup)
|
||||
|
||||
### Test Files
|
||||
- `REL01/MARS-1046/test/test_mars1046.sql` - Unit tests
|
||||
- `REL01/MARS-1046/test/create_iso8601_test_template.sql` - Template table (TIMESTAMP WITH TIME ZONE)
|
||||
- `REL01/MARS-1046/test/configure_iso8601_test.sql` - Source configuration
|
||||
- `REL01/MARS-1046/test/iso8601_test_data.csv` - Full ISO 8601 test data with fractional seconds & timezone
|
||||
- `REL01/MARS-1046/test/iso8601_test_data_simple.csv` - Simplified ISO 8601 (DATE-compatible)
|
||||
- `REL01/MARS-1046/test/process_iso8601_test.sql` - E2E test script
|
||||
|
||||
## Deployment Information
|
||||
|
||||
### Installation Scripts
|
||||
- `01_MARS_1046_install_CT_MRDS_FILE_MANAGER_SPEC.sql`
|
||||
- `02_MARS_1046_install_CT_MRDS_FILE_MANAGER_BODY.sql`
|
||||
|
||||
### Installation Log
|
||||
- **File**: `INSTALL_MARS_1046_G45C5E88148E17E_GGMICHALSKI_20251127_103418.log`
|
||||
- **Result**: SUCCESS
|
||||
- **Timestamp**: 2025-11-27 10:34:18
|
||||
|
||||
### Rollback Scripts
|
||||
- `91_MARS_1046_rollback_CT_MRDS_FILE_MANAGER_BODY.sql`
|
||||
- `92_MARS_1046_rollback_CT_MRDS_FILE_MANAGER_SPEC.sql`
|
||||
|
||||
## Backward Compatibility
|
||||
**FULLY COMPATIBLE** - All existing date formats continue to work unchanged.
|
||||
|
||||
### Regression Testing
|
||||
- Standard DD/MM/YYYY format: No change
|
||||
- Already quoted formats: Idempotent behavior
|
||||
- Non-ISO formats: Pass through unchanged
|
||||
- DATE columns: Continue using DATE format mask
|
||||
- New TIMESTAMP WITH TIME ZONE: Uses DATE_FORMAT syntax
|
||||
|
||||
## Performance Impact
|
||||
**NEGLIGIBLE** - Function executes once per DATE/TIMESTAMP column during external table creation.
|
||||
|
||||
## Recommendations
|
||||
|
||||
### For Production Deployment
|
||||
1. Deploy FILE_MANAGER 3.3.1 to production
|
||||
2. Update documentation with full ISO 8601 format support (including fractional seconds & timezone)
|
||||
3. Copy updated packages to main source repository (CODE-FIRST principle)
|
||||
4. Commit MARS-1046 changes to Git feature branch
|
||||
5. Update template tables to use TIMESTAMP(3) WITH TIME ZONE for columns requiring full ISO 8601 support
|
||||
|
||||
### For Future Enhancements
|
||||
1. **COMPLETED**: Full ISO 8601 support with fractional seconds and timezone offsets
|
||||
2. Consider adding configuration parameter for CHAR field length (currently hardcoded to 50)
|
||||
3. Add validation for format mask compatibility with column data type
|
||||
4. Document DATE_FORMAT syntax requirements in confluence/
|
||||
|
||||
### Migration Path for Existing Systems
|
||||
**For systems requiring full ISO 8601 support:**
|
||||
1. Update template table column type: `DATE` → `TIMESTAMP(3) WITH TIME ZONE`
|
||||
2. Update date format configuration: Add `.FF3TZH:TZM` to format mask
|
||||
3. FILE_MANAGER will automatically detect and use proper DATE_FORMAT syntax
|
||||
|
||||
## Conclusion
|
||||
**MARS-1046 successfully implements FULL ISO 8601 date format support** including 'T' separator, fractional seconds (.FF3), and timezone offsets (TZH:TZM) in Oracle External Tables. The implementation is:
|
||||
|
||||
- **Functionally Complete**: All test cases pass, including full ISO 8601 format parsing
|
||||
- **Production Ready**: Successfully processed real files with TIMESTAMP WITH TIME ZONE through complete workflow
|
||||
- **Backward Compatible**: No impact on existing DATE column configurations
|
||||
- **Well Tested**: Unit tests + end-to-end integration test with data verification
|
||||
- **Properly Documented**: Comprehensive test results, technical findings, and implementation details
|
||||
- **Enterprise Grade**: Supports industry-standard ISO 8601 format with millisecond precision and timezone awareness
|
||||
|
||||
**Key Achievement**: Discovered and implemented Oracle External Table DATE_FORMAT syntax for TIMESTAMP WITH TIME ZONE, enabling full ISO 8601 compliance.
|
||||
|
||||
The solution is recommended for immediate production deployment with confidence in full ISO 8601 standard support.
|
||||
|
||||
---
|
||||
**Test Executed By**: Grzegorz Michalski
|
||||
**Test Environment**: ggmichalski_high (Oracle 23ai)
|
||||
**Package Owner**: CT_MRDS
|
||||
**Test Completion Date**: 2025-11-27
|
||||
**Final Status**: **PRODUCTION READY - FULL ISO 8601 SUPPORT VERIFIED**
|
||||
105
MARS_Packages/REL02/MARS-1046/test/configure_iso8601_test.sql
Normal file
105
MARS_Packages/REL02/MARS-1046/test/configure_iso8601_test.sql
Normal file
@@ -0,0 +1,105 @@
|
||||
-- ===================================================================
|
||||
-- MARS-1046 Test: Configure FILE_MANAGER for ISO 8601 Testing
|
||||
-- ===================================================================
|
||||
-- Purpose: Configure source system and date format for ISO 8601 test
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Date: 2025-11-27
|
||||
-- ===================================================================
|
||||
|
||||
SET SERVEROUTPUT ON;
|
||||
|
||||
PROMPT ===================================================================
|
||||
PROMPT Configuring ISO 8601 Test Source System
|
||||
PROMPT ===================================================================
|
||||
|
||||
-- Step 1: Add test source (if not exists)
|
||||
BEGIN
|
||||
CT_MRDS.FILE_MANAGER.ADD_SOURCE(
|
||||
pSourceKey => 'TEST',
|
||||
pSourceName => 'Test Data Source for MARS-1046'
|
||||
);
|
||||
DBMS_OUTPUT.PUT_LINE('SUCCESS: Source TEST created');
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
IF SQLCODE = -1 THEN -- ORA-00001: unique constraint violated
|
||||
DBMS_OUTPUT.PUT_LINE('INFO: Source TEST already exists');
|
||||
ELSE
|
||||
RAISE;
|
||||
END IF;
|
||||
END;
|
||||
/
|
||||
|
||||
-- Step 2: Configure source file for ISO8601_TEST_DATA
|
||||
BEGIN
|
||||
CT_MRDS.FILE_MANAGER.ADD_SOURCE_FILE_CONFIG(
|
||||
pSourceKey => 'TEST',
|
||||
pSourceFileType => 'INPUT',
|
||||
pSourceFileId => 'ISO8601',
|
||||
pSourceFileDesc => 'ISO 8601 Date Format Test Data',
|
||||
pSourceFileNamePattern => 'iso8601_test_*.csv',
|
||||
pTableId => 'ISO8601_TEST_DATA',
|
||||
pTemplateTableName => 'CT_ET_TEMPLATES.ISO8601_TEST_DATA',
|
||||
pEncoding => 'UTF8'
|
||||
);
|
||||
DBMS_OUTPUT.PUT_LINE('SUCCESS: Source file config created for ISO8601_TEST_DATA');
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
IF SQLCODE = -1 THEN
|
||||
DBMS_OUTPUT.PUT_LINE('INFO: Source file config already exists');
|
||||
ELSE
|
||||
RAISE;
|
||||
END IF;
|
||||
END;
|
||||
/
|
||||
|
||||
-- Step 3: Configure ISO 8601 date format with T separator
|
||||
BEGIN
|
||||
CT_MRDS.FILE_MANAGER.ADD_COLUMN_DATE_FORMAT(
|
||||
pTemplateTableName => 'CT_ET_TEMPLATES.ISO8601_TEST_DATA',
|
||||
pColumnName => 'EVENT_TIMESTAMP',
|
||||
pDateFormat => 'YYYY-MM-DD"T"HH24:MI:SS.FF3TZH:TZM'
|
||||
);
|
||||
DBMS_OUTPUT.PUT_LINE('SUCCESS: Date format configured: YYYY-MM-DD"T"HH24:MI:SS.FF3TZH:TZM (full ISO 8601)');
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
IF SQLCODE = -1 THEN
|
||||
DBMS_OUTPUT.PUT_LINE('INFO: Date format already configured');
|
||||
ELSE
|
||||
RAISE;
|
||||
END IF;
|
||||
END;
|
||||
/
|
||||
|
||||
-- Step 4: Verify configuration
|
||||
PROMPT
|
||||
PROMPT ===================================================================
|
||||
PROMPT Configuration Summary:
|
||||
PROMPT ===================================================================
|
||||
|
||||
SELECT
|
||||
A_SOURCE_KEY,
|
||||
SOURCE_FILE_ID,
|
||||
TABLE_ID,
|
||||
TEMPLATE_TABLE_NAME,
|
||||
SOURCE_FILE_NAME_PATTERN
|
||||
FROM CT_MRDS.A_SOURCE_FILE_CONFIG
|
||||
WHERE A_SOURCE_KEY = 'TEST'
|
||||
AND SOURCE_FILE_ID = 'ISO8601';
|
||||
|
||||
PROMPT
|
||||
PROMPT Date Format Configuration:
|
||||
SELECT
|
||||
TEMPLATE_TABLE_NAME,
|
||||
COLUMN_NAME,
|
||||
DATE_FORMAT
|
||||
FROM CT_MRDS.A_COLUMN_DATE_FORMAT
|
||||
WHERE TEMPLATE_TABLE_NAME = 'CT_ET_TEMPLATES.ISO8601_TEST_DATA';
|
||||
|
||||
PROMPT
|
||||
PROMPT ===================================================================
|
||||
PROMPT Configuration Complete!
|
||||
PROMPT ===================================================================
|
||||
PROMPT
|
||||
PROMPT Next: Create CSV file and upload to OCI bucket
|
||||
PROMPT Path pattern: INBOX/TEST/ISO8601/ISO8601_TEST_DATA/iso8601_test_*.csv
|
||||
PROMPT ===================================================================
|
||||
@@ -0,0 +1,41 @@
|
||||
-- ===================================================================
|
||||
-- MARS-1046 Test: Create Template Table for ISO 8601 Testing
|
||||
-- ===================================================================
|
||||
-- Purpose: Create template table with ISO 8601 timestamp columns
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Date: 2025-11-27
|
||||
-- ===================================================================
|
||||
|
||||
SET SERVEROUTPUT ON;
|
||||
|
||||
PROMPT Creating ISO8601_TEST_DATA template table...
|
||||
|
||||
-- Create template table in CT_ET_TEMPLATES schema
|
||||
CREATE TABLE CT_ET_TEMPLATES.ISO8601_TEST_DATA (
|
||||
ID NUMBER NOT NULL,
|
||||
EVENT_NAME VARCHAR2(100),
|
||||
EVENT_TIMESTAMP TIMESTAMP(3) WITH TIME ZONE,
|
||||
DESCRIPTION VARCHAR2(500)
|
||||
);
|
||||
|
||||
COMMENT ON TABLE CT_ET_TEMPLATES.ISO8601_TEST_DATA IS 'Test template for ISO 8601 date format validation (MARS-1046)';
|
||||
COMMENT ON COLUMN CT_ET_TEMPLATES.ISO8601_TEST_DATA.ID IS 'Unique identifier';
|
||||
COMMENT ON COLUMN CT_ET_TEMPLATES.ISO8601_TEST_DATA.EVENT_NAME IS 'Event name';
|
||||
COMMENT ON COLUMN CT_ET_TEMPLATES.ISO8601_TEST_DATA.EVENT_TIMESTAMP IS 'ISO 8601 timestamp with milliseconds and timezone';
|
||||
COMMENT ON COLUMN CT_ET_TEMPLATES.ISO8601_TEST_DATA.DESCRIPTION IS 'Event description';
|
||||
|
||||
PROMPT SUCCESS: Template table created
|
||||
|
||||
-- Verify creation
|
||||
SELECT table_name, num_rows
|
||||
FROM all_tables
|
||||
WHERE owner = 'CT_ET_TEMPLATES'
|
||||
AND table_name = 'ISO8601_TEST_DATA';
|
||||
|
||||
PROMPT
|
||||
PROMPT Next steps:
|
||||
PROMPT 1. Configure source in FILE_MANAGER
|
||||
PROMPT 2. Create test CSV file
|
||||
PROMPT 3. Upload to OCI INBOX bucket
|
||||
PROMPT 4. Process file with PROCESS_SOURCE_FILE
|
||||
PROMPT ===================================================================
|
||||
6
MARS_Packages/REL02/MARS-1046/test/iso8601_test_data.csv
Normal file
6
MARS_Packages/REL02/MARS-1046/test/iso8601_test_data.csv
Normal file
@@ -0,0 +1,6 @@
|
||||
ID,EVENT_NAME,EVENT_TIMESTAMP,DESCRIPTION
|
||||
1,System Start,2012-03-02T14:16:23.798+01:00,Initial system startup with timezone offset
|
||||
2,Data Processing,2024-11-27T09:30:45.123+01:00,Batch processing job executed
|
||||
3,User Login,2025-01-15T18:22:10.456+02:00,User authentication successful
|
||||
4,Error Event,2023-07-20T03:45:00.789+00:00,Critical error detected in module X
|
||||
5,Backup Complete,2024-12-31T23:59:59.999+01:00,Year-end backup finished successfully
|
||||
|
@@ -0,0 +1,6 @@
|
||||
ID,EVENT_NAME,EVENT_TIMESTAMP,DESCRIPTION
|
||||
1,System Start,2012-03-02T14:16:23,Initial system startup with timezone offset
|
||||
2,Data Processing,2024-11-27T09:30:45,Batch processing job executed
|
||||
3,User Login,2025-01-15T18:22:10,User authentication successful
|
||||
4,Error Event,2023-07-20T03:45:00,Critical error detected in module X
|
||||
5,Backup Complete,2024-12-31T23:59:59,Year-end backup finished successfully
|
||||
|
67
MARS_Packages/REL02/MARS-1046/test/process_iso8601_test.sql
Normal file
67
MARS_Packages/REL02/MARS-1046/test/process_iso8601_test.sql
Normal file
@@ -0,0 +1,67 @@
|
||||
-- ===================================================================
|
||||
-- MARS-1046 Test: Process ISO 8601 Test File
|
||||
-- ===================================================================
|
||||
-- Purpose: Process test CSV file and verify ISO 8601 date parsing
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Date: 2025-11-27
|
||||
-- ===================================================================
|
||||
|
||||
SET SERVEROUTPUT ON SIZE UNLIMITED;
|
||||
|
||||
PROMPT ===================================================================
|
||||
PROMPT Processing ISO 8601 Test File
|
||||
PROMPT ===================================================================
|
||||
|
||||
-- Process the uploaded file
|
||||
BEGIN
|
||||
CT_MRDS.FILE_MANAGER.PROCESS_SOURCE_FILE(
|
||||
pSourceFileReceivedName => 'INBOX/TEST/ISO8601/ISO8601_TEST_DATA/iso8601_test_data.csv'
|
||||
);
|
||||
DBMS_OUTPUT.PUT_LINE('SUCCESS: File processed successfully');
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('ERROR: ' || SQLERRM);
|
||||
RAISE;
|
||||
END;
|
||||
/
|
||||
|
||||
PROMPT
|
||||
PROMPT ===================================================================
|
||||
PROMPT Checking File Status
|
||||
PROMPT ===================================================================
|
||||
|
||||
SELECT
|
||||
SOURCE_FILE_NAME,
|
||||
PROCESSING_STATUS,
|
||||
RECEPTION_DATE
|
||||
FROM CT_MRDS.A_SOURCE_FILE_RECEIVED
|
||||
WHERE SOURCE_FILE_NAME LIKE '%iso8601_test_data.csv%'
|
||||
ORDER BY RECEPTION_DATE DESC
|
||||
FETCH FIRST 1 ROW ONLY;
|
||||
|
||||
PROMPT
|
||||
PROMPT ===================================================================
|
||||
PROMPT Reading Data from External Table (ODS bucket)
|
||||
PROMPT ===================================================================
|
||||
|
||||
-- Query the external table to verify date parsing
|
||||
SELECT
|
||||
ID,
|
||||
EVENT_NAME,
|
||||
TO_CHAR(EVENT_TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS') AS PARSED_TIMESTAMP,
|
||||
EVENT_TIMESTAMP,
|
||||
DESCRIPTION
|
||||
FROM ODS.ISO8601_TEST_DATA_ODS
|
||||
ORDER BY ID;
|
||||
|
||||
PROMPT
|
||||
PROMPT ===================================================================
|
||||
PROMPT Test Complete!
|
||||
PROMPT ===================================================================
|
||||
PROMPT
|
||||
PROMPT Expected Results:
|
||||
PROMPT - All 5 records should be visible
|
||||
PROMPT - EVENT_TIMESTAMP should be properly parsed from ISO 8601 format
|
||||
PROMPT - Original format: 2012-03-02T14:16:23.798+01:00
|
||||
PROMPT - Parsed format: 2012-03-02 14:16:23 (timezone converted)
|
||||
PROMPT ===================================================================
|
||||
@@ -0,0 +1,114 @@
|
||||
-- ===================================================================
|
||||
-- MARS-1046 Test: Direct CREATE_EXTERNAL_TABLE Test
|
||||
-- ===================================================================
|
||||
-- Purpose: Test FILE_MANAGER.CREATE_EXTERNAL_TABLE procedure
|
||||
-- and verify NORMALIZE_DATE_FORMAT functionality
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Date: 2026-01-13
|
||||
-- ===================================================================
|
||||
|
||||
SET SERVEROUTPUT ON;
|
||||
SET LINESIZE 200;
|
||||
SET PAGESIZE 100;
|
||||
|
||||
PROMPT ===================================================================
|
||||
PROMPT MARS-1046: Testing CREATE_EXTERNAL_TABLE with ISO 8601 Format
|
||||
PROMPT ===================================================================
|
||||
|
||||
-- Step 1: Upload test CSV file to INBOX (if not already there)
|
||||
PROMPT
|
||||
PROMPT Step 1: Verify CSV file in INBOX bucket
|
||||
PROMPT File: INBOX/TEST/ISO8601/ISO8601_TEST_DATA/iso8601_test_data.csv
|
||||
PROMPT (Upload manually using OCI CLI if needed)
|
||||
PROMPT
|
||||
|
||||
-- Step 2: Create INBOX external table using FILE_MANAGER
|
||||
PROMPT Step 2: Creating INBOX external table using ODS.FILE_MANAGER_ODS
|
||||
BEGIN
|
||||
ODS.FILE_MANAGER_ODS.CREATE_EXTERNAL_TABLE(
|
||||
pTableName => 'ISO8601_TEST_DATA_INBOX',
|
||||
pTemplateTableName => 'CT_ET_TEMPLATES.ISO8601_TEST_DATA',
|
||||
pPrefix => 'INBOX/TEST/ISO8601/ISO8601_TEST_DATA',
|
||||
pBucketUri => CT_MRDS.ENV_MANAGER.gvInboxBucketUri
|
||||
);
|
||||
DBMS_OUTPUT.PUT_LINE('SUCCESS: External table ISO8601_TEST_DATA_INBOX created');
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
IF SQLCODE = -955 THEN -- ORA-00955: name is already used by an existing object
|
||||
DBMS_OUTPUT.PUT_LINE('INFO: External table ISO8601_TEST_DATA_INBOX already exists');
|
||||
ELSE
|
||||
DBMS_OUTPUT.PUT_LINE('ERROR: ' || SQLERRM);
|
||||
RAISE;
|
||||
END IF;
|
||||
END;
|
||||
/
|
||||
|
||||
-- Step 3: Verify external table exists
|
||||
PROMPT
|
||||
PROMPT Step 3: Verifying external table creation
|
||||
SELECT
|
||||
table_name,
|
||||
type_name,
|
||||
default_directory_name
|
||||
FROM all_external_tables
|
||||
WHERE owner = 'ODS'
|
||||
AND table_name = 'ISO8601_TEST_DATA_INBOX';
|
||||
|
||||
-- Step 4: Check ACCESS PARAMETERS - verify date format has quoted "T"
|
||||
PROMPT
|
||||
PROMPT Step 4: Checking ACCESS PARAMETERS (DATE FORMAT verification)
|
||||
PROMPT Expected: MASK should contain YYYY-MM-DD"T"HH24:MI:SS.FF3TZH:TZM
|
||||
PROMPT -------------------------------------------------------------------
|
||||
SET LONG 50000
|
||||
SET PAGESIZE 0
|
||||
SELECT access_parameters
|
||||
FROM all_external_tables
|
||||
WHERE owner = 'ODS'
|
||||
AND table_name = 'ISO8601_TEST_DATA_INBOX';
|
||||
SET PAGESIZE 100
|
||||
|
||||
-- Step 5: Read data from external table
|
||||
PROMPT
|
||||
PROMPT ===================================================================
|
||||
PROMPT Step 5: Reading data from INBOX external table
|
||||
PROMPT ===================================================================
|
||||
COLUMN EVENT_NAME FORMAT A30
|
||||
COLUMN PARSED_TIMESTAMP FORMAT A40
|
||||
COLUMN DESCRIPTION FORMAT A50
|
||||
|
||||
SELECT
|
||||
ID,
|
||||
EVENT_NAME,
|
||||
TO_CHAR(EVENT_TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3 TZH:TZM') AS PARSED_TIMESTAMP,
|
||||
DESCRIPTION
|
||||
FROM ODS.ISO8601_TEST_DATA_INBOX
|
||||
ORDER BY ID;
|
||||
|
||||
-- Step 6: Verify all records parsed correctly
|
||||
PROMPT
|
||||
PROMPT Step 6: Verification Summary
|
||||
SELECT
|
||||
COUNT(*) AS TOTAL_RECORDS,
|
||||
COUNT(EVENT_TIMESTAMP) AS PARSED_TIMESTAMPS,
|
||||
CASE
|
||||
WHEN COUNT(*) = COUNT(EVENT_TIMESTAMP) THEN 'PASS'
|
||||
ELSE 'FAIL'
|
||||
END AS TEST_RESULT
|
||||
FROM ODS.ISO8601_TEST_DATA_INBOX;
|
||||
|
||||
PROMPT
|
||||
PROMPT ===================================================================
|
||||
PROMPT Test Complete!
|
||||
PROMPT ===================================================================
|
||||
PROMPT
|
||||
PROMPT Expected Results:
|
||||
PROMPT 1. External table ISO8601_TEST_DATA_INBOX created in ODS schema
|
||||
PROMPT 2. ACCESS PARAMETERS contain: YYYY-MM-DD"T"HH24:MI:SS.FF3TZH:TZM
|
||||
PROMPT 3. All 5 records successfully parsed with timestamps
|
||||
PROMPT 4. Milliseconds (.FF3) and timezone (TZH:TZM) preserved
|
||||
PROMPT
|
||||
PROMPT CRITICAL VERIFICATION:
|
||||
PROMPT - Check ACCESS PARAMETERS output for quoted "T" separator
|
||||
PROMPT - Verify all EVENT_TIMESTAMP values are not NULL
|
||||
PROMPT - Confirm fractional seconds and timezone are present
|
||||
PROMPT ===================================================================
|
||||
121
MARS_Packages/REL02/MARS-1046/test/test_mars1046.sql
Normal file
121
MARS_Packages/REL02/MARS-1046/test/test_mars1046.sql
Normal file
@@ -0,0 +1,121 @@
|
||||
-- ===================================================================
|
||||
-- MARS-1046 Test Script: ISO 8601 Date Format Normalization
|
||||
-- ===================================================================
|
||||
-- Purpose: Test NORMALIZE_DATE_FORMAT function and external table integration
|
||||
-- Author: Grzegorz Michalski
|
||||
-- Date: 2025-11-27
|
||||
-- ===================================================================
|
||||
|
||||
SET SERVEROUTPUT ON;
|
||||
|
||||
PROMPT ========================================
|
||||
PROMPT MARS-1046: Test Suite
|
||||
PROMPT ========================================
|
||||
|
||||
-- Test 1: Verify package version
|
||||
PROMPT
|
||||
PROMPT Test 1: Verify FILE_MANAGER version
|
||||
SELECT FILE_MANAGER.GET_VERSION() AS VERSION FROM DUAL;
|
||||
-- Expected: 3.3.1
|
||||
|
||||
-- Test 2: Check build info
|
||||
PROMPT
|
||||
PROMPT Test 2: Check build information
|
||||
SELECT FILE_MANAGER.GET_BUILD_INFO() AS BUILD_INFO FROM DUAL;
|
||||
|
||||
-- Test 3: Verify package changes
|
||||
PROMPT
|
||||
PROMPT Test 3: Verify no untracked changes
|
||||
SELECT CT_MRDS.ENV_MANAGER.CHECK_PACKAGE_CHANGES('CT_MRDS', 'FILE_MANAGER') AS STATUS FROM DUAL;
|
||||
-- Expected: OK: Package CT_MRDS.FILE_MANAGER has not changed.
|
||||
|
||||
-- Test 4: Check compilation status
|
||||
PROMPT
|
||||
PROMPT Test 4: Check compilation status
|
||||
SELECT object_name, object_type, status
|
||||
FROM ALL_OBJECTS
|
||||
WHERE OWNER = 'CT_MRDS'
|
||||
AND OBJECT_NAME = 'FILE_MANAGER';
|
||||
-- Expected: Both PACKAGE and PACKAGE BODY with STATUS = VALID
|
||||
|
||||
-- Test 5: Manual test of NORMALIZE_DATE_FORMAT logic
|
||||
PROMPT
|
||||
PROMPT Test 5: Manual format normalization tests
|
||||
PROMPT
|
||||
PROMPT Test Case 1: ISO 8601 with T separator
|
||||
PROMPT Input: YYYY-MM-DDTHH24:MI:SS.FF3TZH:TZM
|
||||
PROMPT Expected: YYYY-MM-DD"T"HH24:MI:SS.FF3TZH:TZM
|
||||
PROMPT
|
||||
DECLARE
|
||||
vInput VARCHAR2(200) := 'YYYY-MM-DDTHH24:MI:SS.FF3TZH:TZM';
|
||||
vExpected VARCHAR2(200) := 'YYYY-MM-DD"T"HH24:MI:SS.FF3TZH:TZM';
|
||||
vActual VARCHAR2(200);
|
||||
BEGIN
|
||||
-- Simulate NORMALIZE_DATE_FORMAT logic
|
||||
vActual := vInput;
|
||||
IF INSTR(vActual, '"T"') = 0 AND REGEXP_LIKE(vActual, '[YMD]T[HM]') THEN
|
||||
vActual := REGEXP_REPLACE(vActual, '([YMD])T([HM])', '\1"T"\2');
|
||||
END IF;
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('Input: ' || vInput);
|
||||
DBMS_OUTPUT.PUT_LINE('Expected: ' || vExpected);
|
||||
DBMS_OUTPUT.PUT_LINE('Actual: ' || vActual);
|
||||
DBMS_OUTPUT.PUT_LINE('Result: ' || CASE WHEN vActual = vExpected THEN 'PASS' ELSE 'FAIL' END);
|
||||
END;
|
||||
/
|
||||
|
||||
PROMPT
|
||||
PROMPT Test Case 2: Standard format (no change expected)
|
||||
PROMPT Input: DD/MM/YYYY HH24:MI:SS
|
||||
PROMPT Expected: DD/MM/YYYY HH24:MI:SS (unchanged)
|
||||
PROMPT
|
||||
DECLARE
|
||||
vInput VARCHAR2(200) := 'DD/MM/YYYY HH24:MI:SS';
|
||||
vExpected VARCHAR2(200) := 'DD/MM/YYYY HH24:MI:SS';
|
||||
vActual VARCHAR2(200);
|
||||
BEGIN
|
||||
vActual := vInput;
|
||||
IF INSTR(vActual, '"T"') = 0 AND REGEXP_LIKE(vActual, '[YMD]T[HM]') THEN
|
||||
vActual := REGEXP_REPLACE(vActual, '([YMD])T([HM])', '\1"T"\2');
|
||||
END IF;
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('Input: ' || vInput);
|
||||
DBMS_OUTPUT.PUT_LINE('Expected: ' || vExpected);
|
||||
DBMS_OUTPUT.PUT_LINE('Actual: ' || vActual);
|
||||
DBMS_OUTPUT.PUT_LINE('Result: ' || CASE WHEN vActual = vExpected THEN 'PASS' ELSE 'FAIL' END);
|
||||
END;
|
||||
/
|
||||
|
||||
PROMPT
|
||||
PROMPT Test Case 3: Already quoted T (no change)
|
||||
PROMPT Input: YYYY-MM-DD"T"HH24:MI:SS
|
||||
PROMPT Expected: YYYY-MM-DD"T"HH24:MI:SS (unchanged)
|
||||
PROMPT
|
||||
DECLARE
|
||||
vInput VARCHAR2(200) := 'YYYY-MM-DD"T"HH24:MI:SS';
|
||||
vExpected VARCHAR2(200) := 'YYYY-MM-DD"T"HH24:MI:SS';
|
||||
vActual VARCHAR2(200);
|
||||
BEGIN
|
||||
vActual := vInput;
|
||||
IF INSTR(vActual, '"T"') = 0 AND REGEXP_LIKE(vActual, '[YMD]T[HM]') THEN
|
||||
vActual := REGEXP_REPLACE(vActual, '([YMD])T([HM])', '\1"T"\2');
|
||||
END IF;
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('Input: ' || vInput);
|
||||
DBMS_OUTPUT.PUT_LINE('Expected: ' || vExpected);
|
||||
DBMS_OUTPUT.PUT_LINE('Actual: ' || vActual);
|
||||
DBMS_OUTPUT.PUT_LINE('Result: ' || CASE WHEN vActual = vExpected THEN 'PASS' ELSE 'FAIL' END);
|
||||
END;
|
||||
/
|
||||
|
||||
PROMPT
|
||||
PROMPT ========================================
|
||||
PROMPT Test Suite Complete
|
||||
PROMPT ========================================
|
||||
PROMPT
|
||||
PROMPT To test with actual external table:
|
||||
PROMPT 1. Configure date format: CALL FILE_MANAGER.ADD_COLUMN_DATE_FORMAT(...)
|
||||
PROMPT 2. Create external table: CALL FILE_MANAGER.CREATE_EXTERNAL_TABLE(...)
|
||||
PROMPT 3. Check DDL: SELECT DBMS_METADATA.GET_DDL('TABLE', 'EXT_TABLE', 'ODS') FROM DUAL;
|
||||
PROMPT 4. Verify date format has quoted T: DATE 'YYYY-MM-DD"T"HH24:MI:SS...'
|
||||
PROMPT ========================================
|
||||
Reference in New Issue
Block a user