Mearge recent development
This commit is contained in:
@@ -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