|
|
|
|
@@ -28,22 +28,22 @@ AS
|
|
|
|
|
) IS
|
|
|
|
|
BEGIN
|
|
|
|
|
BEGIN
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Attempting to delete potentially corrupted file: ' || pFileUri, 'DEBUG', pParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Attempting to delete potentially corrupted file: ' || pFileUri, 'DEBUG', pParameters, 'DATA_EXPORTER');
|
|
|
|
|
|
|
|
|
|
DBMS_CLOUD.DELETE_OBJECT(
|
|
|
|
|
credential_name => pCredentialName,
|
|
|
|
|
object_uri => pFileUri
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Deleted existing file (cleanup before retry): ' || pFileUri, 'INFO', pParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Deleted existing file (cleanup before retry): ' || pFileUri, 'INFO', pParameters, 'DATA_EXPORTER');
|
|
|
|
|
EXCEPTION
|
|
|
|
|
WHEN OTHERS THEN
|
|
|
|
|
-- Object not found is OK (file doesn't exist)
|
|
|
|
|
IF SQLCODE = -20404 THEN
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('File does not exist (OK): ' || pFileUri, 'DEBUG', pParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('File does not exist (OK): ' || pFileUri, 'DEBUG', pParameters, 'DATA_EXPORTER');
|
|
|
|
|
ELSE
|
|
|
|
|
-- Log but don't fail - export will attempt anyway
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Warning: Could not delete file (will retry export anyway): ' || SQLERRM, 'WARNING', pParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Warning: Could not delete file (will retry export anyway): ' || SQLERRM, 'WARNING', pParameters, 'DATA_EXPORTER');
|
|
|
|
|
END IF;
|
|
|
|
|
END;
|
|
|
|
|
END DELETE_FAILED_EXPORT_FILE;
|
|
|
|
|
@@ -367,10 +367,10 @@ AS
|
|
|
|
|
AND L.LOAD_START < :pMaxDate
|
|
|
|
|
ORDER BY YR, MN';
|
|
|
|
|
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Executing date range query: ' || vSql, 'DEBUG', pParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Executing date range query: ' || vSql, 'DEBUG', pParameters, 'DATA_EXPORTER');
|
|
|
|
|
EXECUTE IMMEDIATE vSql BULK COLLECT INTO vKeyValuesYear, vKeyValuesMonth USING pMinDate, pMaxDate;
|
|
|
|
|
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Found ' || vKeyValuesYear.COUNT || ' year/month combinations to export', 'DEBUG', pParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Found ' || vKeyValuesYear.COUNT || ' year/month combinations to export', 'DEBUG', pParameters, 'DATA_EXPORTER');
|
|
|
|
|
|
|
|
|
|
-- Convert to partition_tab
|
|
|
|
|
vPartitions := partition_tab();
|
|
|
|
|
@@ -437,7 +437,7 @@ AS
|
|
|
|
|
'PARTITION_MONTH=' || sanitizeFilename(pMonth) || '/' ||
|
|
|
|
|
sanitizeFilename(pYear) || sanitizeFilename(pMonth) || '.parquet';
|
|
|
|
|
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Parquet export URI: ' || vUri, 'DEBUG', pParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Parquet export URI: ' || vUri, 'DEBUG', pParameters, 'DATA_EXPORTER');
|
|
|
|
|
|
|
|
|
|
-- Delete potentially corrupted file from previous failed attempt
|
|
|
|
|
-- This prevents Oracle from creating _1 suffixed files on retry
|
|
|
|
|
@@ -456,7 +456,7 @@ AS
|
|
|
|
|
CASE WHEN pFolderName IS NOT NULL THEN pFolderName || '/' ELSE '' END ||
|
|
|
|
|
sanitizeFilename(vFileName);
|
|
|
|
|
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('CSV export URI: ' || vUri, 'DEBUG', pParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('CSV export URI: ' || vUri, 'DEBUG', pParameters, 'DATA_EXPORTER');
|
|
|
|
|
|
|
|
|
|
-- Delete potentially corrupted file from previous failed attempt
|
|
|
|
|
-- This prevents Oracle from creating _1 suffixed files on retry
|
|
|
|
|
@@ -484,8 +484,8 @@ AS
|
|
|
|
|
RAISE_APPLICATION_ERROR(-20001, 'Unsupported format: ' || pFormat || '. Use PARQUET or CSV.');
|
|
|
|
|
END IF;
|
|
|
|
|
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Processing Year/Month: ' || pYear || '/' || pMonth || ' (Format: ' || pFormat || ')', 'DEBUG', pParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Export query: ' || vQuery, 'DEBUG', pParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Processing Year/Month: ' || pYear || '/' || pMonth || ' (Format: ' || pFormat || ')', 'DEBUG', pParameters, 'DATA_EXPORTER');
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Export query: ' || vQuery, 'DEBUG', pParameters, 'DATA_EXPORTER');
|
|
|
|
|
END EXPORT_SINGLE_PARTITION;
|
|
|
|
|
|
|
|
|
|
----------------------------------------------------------------------------------------------------
|
|
|
|
|
@@ -550,7 +550,7 @@ AS
|
|
|
|
|
WHERE CHUNK_ID = pStartId;
|
|
|
|
|
|
|
|
|
|
vParameters := 'Parallel task - Year: ' || vYear || ', Month: ' || vMonth || ', ChunkID: ' || pStartId;
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Starting parallel export for partition ' || vYear || '/' || vMonth, 'DEBUG', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Starting parallel export for partition ' || vYear || '/' || vMonth, 'DEBUG', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
|
|
|
|
|
-- Mark chunk as PROCESSING
|
|
|
|
|
UPDATE CT_MRDS.A_PARALLEL_EXPORT_CHUNKS
|
|
|
|
|
@@ -586,12 +586,12 @@ AS
|
|
|
|
|
WHERE CHUNK_ID = pStartId;
|
|
|
|
|
COMMIT;
|
|
|
|
|
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Completed parallel export for partition ' || vYear || '/' || vMonth, 'DEBUG', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Completed parallel export for partition ' || vYear || '/' || vMonth, 'DEBUG', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
EXCEPTION
|
|
|
|
|
WHEN OTHERS THEN
|
|
|
|
|
-- Capture error details in variable (SQLERRM cannot be used directly in SQL)
|
|
|
|
|
vgMsgTmp := 'Parallel task error for partition ' || vYear || '/' || vMonth || ' (ChunkID: ' || pStartId || '): ' || SQLERRM || cgBL || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE;
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(vgMsgTmp, 'ERROR', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(vgMsgTmp, 'ERROR', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
|
|
|
|
|
-- Mark chunk as FAILED with error message
|
|
|
|
|
-- Use vgMsgTmp variable instead of SQLERRM directly (Oracle limitation in SQL context)
|
|
|
|
|
@@ -643,7 +643,7 @@ AS
|
|
|
|
|
,'pFolderName => '''||nvl(pFolderName, 'NULL')||''''
|
|
|
|
|
,'pCredentialName => '''||nvl(pCredentialName, 'NULL')||''''
|
|
|
|
|
));
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Start','INFO', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Start','INFO', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
|
|
|
|
|
-- Get bucket URI based on bucket area using FILE_MANAGER function
|
|
|
|
|
vBucketUri := FILE_MANAGER.GET_BUCKET_URI(pBucketArea);
|
|
|
|
|
@@ -692,8 +692,8 @@ AS
|
|
|
|
|
-- Process column list to add T. prefix and alias key column as A_WORKFLOW_HISTORY_KEY
|
|
|
|
|
vProcessedColumnList := processColumnList(vAllColumnsList, vTableName, vSchemaName, vKeyColumnName);
|
|
|
|
|
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Dynamic column list built: ' || vAllColumnsList, 'DEBUG', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Processed column list with T. prefix: ' || vProcessedColumnList, 'DEBUG', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Dynamic column list built: ' || vAllColumnsList, 'DEBUG', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Processed column list with T. prefix: ' || vProcessedColumnList, 'DEBUG', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
|
|
|
|
|
vTableName := DBMS_ASSERT.SCHEMA_NAME(vSchemaName) || '.' || DBMS_ASSERT.simple_sql_name(vTableName);
|
|
|
|
|
-- Fetch unique key values from A_LOAD_HISTORY
|
|
|
|
|
@@ -701,9 +701,9 @@ AS
|
|
|
|
|
' FROM ' || vTableName || ' T, CT_ODS.A_LOAD_HISTORY L' ||
|
|
|
|
|
' WHERE T.' || DBMS_ASSERT.simple_sql_name(vKeyColumnName) || ' = L.A_ETL_LOAD_SET_KEY';
|
|
|
|
|
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Executing key values query: ' || vSql, 'DEBUG', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Executing key values query: ' || vSql, 'DEBUG', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
EXECUTE IMMEDIATE vSql BULK COLLECT INTO vKeyValues;
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Found ' || vKeyValues.COUNT || ' unique key values to process', 'DEBUG', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Found ' || vKeyValues.COUNT || ' unique key values to process', 'DEBUG', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
|
|
|
|
|
-- Loop over each unique key value
|
|
|
|
|
FOR i IN 1 .. vKeyValues.COUNT LOOP
|
|
|
|
|
@@ -734,9 +734,9 @@ AS
|
|
|
|
|
CASE WHEN pFolderName IS NOT NULL THEN pFolderName || '/' ELSE '' END ||
|
|
|
|
|
sanitizeFilename(vKeyValue) || '.csv';
|
|
|
|
|
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Processing key value: ' || vKeyValue || ' (' || (i) || '/' || vKeyValues.COUNT || ')', 'DEBUG', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Export query: ' || vQuery, 'DEBUG', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Export URI: ' || vUri, 'DEBUG', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Processing key value: ' || vKeyValue || ' (' || (i) || '/' || vKeyValues.COUNT || ')', 'DEBUG', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Export query: ' || vQuery, 'DEBUG', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Export URI: ' || vUri, 'DEBUG', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
|
|
|
|
|
-- Use DBMS_CLOUD package to export data to the URI
|
|
|
|
|
DBMS_CLOUD.EXPORT_DATA(
|
|
|
|
|
@@ -746,24 +746,24 @@ AS
|
|
|
|
|
format => json_object('type' VALUE 'CSV', 'header' VALUE true)
|
|
|
|
|
);
|
|
|
|
|
END LOOP;
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('End','INFO',vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('End','INFO', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
EXCEPTION
|
|
|
|
|
WHEN ENV_MANAGER.ERR_TABLE_NOT_EXISTS THEN
|
|
|
|
|
vgMsgTmp := ENV_MANAGER.MSG_TABLE_NOT_EXISTS ||': '||vTableName;
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(vgMsgTmp, 'ERROR', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(vgMsgTmp, 'ERROR', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
RAISE_APPLICATION_ERROR(ENV_MANAGER.CODE_TABLE_NOT_EXISTS, vgMsgTmp);
|
|
|
|
|
WHEN ENV_MANAGER.ERR_COLUMN_NOT_EXISTS THEN
|
|
|
|
|
vgMsgTmp := ENV_MANAGER.MSG_COLUMN_NOT_EXISTS || ' (TableName.ColumnName): ' || vTableName||'.'||vKeyColumnName||CASE WHEN vCurrentCol IS NOT NULL THEN '.'||vCurrentCol||' in column list' ELSE '' END;
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(vgMsgTmp, 'ERROR', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(vgMsgTmp, 'ERROR', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
RAISE_APPLICATION_ERROR(ENV_MANAGER.CODE_COLUMN_NOT_EXISTS, vgMsgTmp);
|
|
|
|
|
WHEN ENV_MANAGER.ERR_UNSUPPORTED_DATA_TYPE THEN
|
|
|
|
|
vgMsgTmp := ENV_MANAGER.MSG_UNSUPPORTED_DATA_TYPE || ' vDataType: '||vDataType;
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(vgMsgTmp, 'ERROR', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(vgMsgTmp, 'ERROR', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
RAISE_APPLICATION_ERROR(ENV_MANAGER.CODE_UNSUPPORTED_DATA_TYPE, vgMsgTmp);
|
|
|
|
|
WHEN OTHERS THEN
|
|
|
|
|
-- Log complete error details including full stack trace and backtrace
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_ERROR('Export failed: ' || SQLERRM, vParameters, 'DATA_EXPORTER');
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(ENV_MANAGER.GET_ERROR_STACK(pFormat => 'TABLE', pCode=> SQLCODE), 'ERROR', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(ENV_MANAGER.GET_ERROR_STACK(pFormat => 'TABLE', pCode=> SQLCODE), 'ERROR', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
RAISE_APPLICATION_ERROR(ENV_MANAGER.CODE_UNKNOWN, ENV_MANAGER.GET_ERROR_STACK(pFormat => 'OUTPUT', pCode=> SQLCODE));
|
|
|
|
|
|
|
|
|
|
END EXPORT_TABLE_DATA;
|
|
|
|
|
@@ -806,7 +806,7 @@ AS
|
|
|
|
|
,'pTemplateTableName => '''||nvl(pTemplateTableName, 'NULL')||''''
|
|
|
|
|
,'pCredentialName => '''||nvl(pCredentialName, 'NULL')||''''
|
|
|
|
|
));
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Start','INFO', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Start','INFO', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
|
|
|
|
|
-- Get bucket URI based on bucket area using FILE_MANAGER function
|
|
|
|
|
vBucketUri := FILE_MANAGER.GET_BUCKET_URI(pBucketArea);
|
|
|
|
|
@@ -822,27 +822,27 @@ AS
|
|
|
|
|
-- Build query with TO_CHAR for date columns (per-column format support)
|
|
|
|
|
vProcessedColumnList := buildQueryWithDateFormats(pColumnList, vTableName, vSchemaName, vKeyColumnName, pTemplateTableName, 'PARQUET');
|
|
|
|
|
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Input column list: ' || NVL(pColumnList, 'NULL (building dynamic list from table metadata)'), 'DEBUG', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Processed column list with TO_CHAR for date columns: ' || vProcessedColumnList, 'DEBUG', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Template table: ' || NVL(pTemplateTableName, 'NULL - using global default for all dates'), 'INFO', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Input column list: ' || NVL(pColumnList, 'NULL (building dynamic list from table metadata)'), 'DEBUG', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Processed column list with TO_CHAR for date columns: ' || vProcessedColumnList, 'DEBUG', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Template table: ' || NVL(pTemplateTableName, 'NULL - using global default for all dates'), 'INFO', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
|
|
|
|
|
vTableName := DBMS_ASSERT.SCHEMA_NAME(vSchemaName) || '.' || DBMS_ASSERT.simple_sql_name(vTableName);
|
|
|
|
|
|
|
|
|
|
-- Validate parallel degree parameter
|
|
|
|
|
IF pParallelDegree < 1 OR pParallelDegree > 16 THEN
|
|
|
|
|
vgMsgTmp := ENV_MANAGER.MSG_INVALID_PARALLEL_DEGREE || ': ' || pParallelDegree || '. Valid range: 1-16';
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(vgMsgTmp, 'ERROR', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(vgMsgTmp, 'ERROR', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
RAISE_APPLICATION_ERROR(ENV_MANAGER.CODE_INVALID_PARALLEL_DEGREE, vgMsgTmp);
|
|
|
|
|
END IF;
|
|
|
|
|
|
|
|
|
|
-- Get partitions using shared function
|
|
|
|
|
vPartitions := GET_PARTITIONS(vSchemaName, vTableName, vKeyColumnName, pMinDate, pMaxDate, vParameters);
|
|
|
|
|
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Found ' || vPartitions.COUNT || ' partitions to export with parallel degree ' || pParallelDegree, 'INFO', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Found ' || vPartitions.COUNT || ' partitions to export with parallel degree ' || pParallelDegree, 'INFO', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
|
|
|
|
|
-- Sequential processing (parallel degree = 1)
|
|
|
|
|
IF pParallelDegree = 1 THEN
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Using sequential processing (pParallelDegree = 1)', 'DEBUG', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Using sequential processing (pParallelDegree = 1)', 'DEBUG', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
|
|
|
|
|
FOR i IN 1 .. vPartitions.COUNT LOOP
|
|
|
|
|
EXPORT_SINGLE_PARTITION(
|
|
|
|
|
@@ -868,13 +868,13 @@ AS
|
|
|
|
|
ELSE
|
|
|
|
|
-- Skip parallel processing if no partitions found
|
|
|
|
|
IF vPartitions.COUNT = 0 THEN
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('No partitions to export - skipping parallel processing', 'INFO', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('No partitions to export - skipping parallel processing', 'INFO', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
ELSE
|
|
|
|
|
DECLARE
|
|
|
|
|
vTaskName VARCHAR2(128) := 'DATA_EXPORT_TASK_' || TO_CHAR(SYSTIMESTAMP, 'YYYYMMDDHH24MISSFF');
|
|
|
|
|
vChunkId NUMBER;
|
|
|
|
|
BEGIN
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Using parallel processing with ' || pParallelDegree || ' threads', 'INFO', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Using parallel processing with ' || pParallelDegree || ' threads', 'INFO', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
|
|
|
|
|
-- Clean up old completed chunks (>24 hours) to prevent table bloat
|
|
|
|
|
-- CRITICAL: Do NOT delete chunks from other active sessions (same-day tasks)
|
|
|
|
|
@@ -884,12 +884,12 @@ AS
|
|
|
|
|
AND CREATED_DATE < SYSTIMESTAMP - INTERVAL '1' DAY;
|
|
|
|
|
COMMIT;
|
|
|
|
|
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Cleared old COMPLETED chunks (>24h). Active session chunks preserved.', 'DEBUG', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Cleared old COMPLETED chunks (>24h). Active session chunks preserved.', 'DEBUG', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
-- This prevents re-exporting successfully completed partitions
|
|
|
|
|
DELETE FROM CT_MRDS.A_PARALLEL_EXPORT_CHUNKS WHERE STATUS = 'COMPLETED';
|
|
|
|
|
COMMIT;
|
|
|
|
|
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Cleared COMPLETED chunks. FAILED chunks retained for retry.', 'DEBUG', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Cleared COMPLETED chunks. FAILED chunks retained for retry.', 'DEBUG', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
|
|
|
|
|
-- Populate chunks table (insert new chunks, preserve FAILED chunks for retry)
|
|
|
|
|
FOR i IN 1 .. vPartitions.COUNT LOOP
|
|
|
|
|
@@ -918,7 +918,7 @@ AS
|
|
|
|
|
SELECT COUNT(*) INTO vPendingCount FROM CT_MRDS.A_PARALLEL_EXPORT_CHUNKS WHERE STATUS = 'PENDING';
|
|
|
|
|
SELECT COUNT(*) INTO vFailedCount FROM CT_MRDS.A_PARALLEL_EXPORT_CHUNKS WHERE STATUS = 'FAILED';
|
|
|
|
|
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Chunk statistics: PENDING=' || vPendingCount || ', FAILED (retry)=' || vFailedCount, 'INFO', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Chunk statistics: PENDING=' || vPendingCount || ', FAILED (retry)=' || vFailedCount, 'INFO', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
-- Create parallel task
|
|
|
|
|
@@ -934,7 +934,7 @@ AS
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
-- Execute task in parallel
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Executing parallel task: ' || vTaskName, 'DEBUG', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Executing parallel task: ' || vTaskName, 'DEBUG', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
|
|
|
|
|
DBMS_PARALLEL_EXECUTE.RUN_TASK(
|
|
|
|
|
task_name => vTaskName,
|
|
|
|
|
@@ -953,7 +953,7 @@ AS
|
|
|
|
|
|
|
|
|
|
IF vErrorCount > 0 THEN
|
|
|
|
|
vgMsgTmp := 'Parallel execution completed with ' || vErrorCount || ' errors. Check USER_PARALLEL_EXECUTE_CHUNKS for details.';
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(vgMsgTmp, 'ERROR', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(vgMsgTmp, 'ERROR', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
RAISE_APPLICATION_ERROR(ENV_MANAGER.CODE_PARALLEL_EXECUTION_FAILED, vgMsgTmp);
|
|
|
|
|
END IF;
|
|
|
|
|
END;
|
|
|
|
|
@@ -966,7 +966,7 @@ AS
|
|
|
|
|
DELETE FROM CT_MRDS.A_PARALLEL_EXPORT_CHUNKS WHERE TASK_NAME = vTaskName;
|
|
|
|
|
COMMIT;
|
|
|
|
|
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Parallel execution completed successfully', 'INFO', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Parallel execution completed successfully', 'INFO', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
EXCEPTION
|
|
|
|
|
WHEN OTHERS THEN
|
|
|
|
|
-- Attempt to drop task on error
|
|
|
|
|
@@ -977,21 +977,21 @@ AS
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
vgMsgTmp := ENV_MANAGER.MSG_PARALLEL_EXECUTION_FAILED || ': ' || SQLERRM || cgBL || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE;
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(vgMsgTmp, 'ERROR', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(vgMsgTmp, 'ERROR', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
RAISE_APPLICATION_ERROR(ENV_MANAGER.CODE_PARALLEL_EXECUTION_FAILED, vgMsgTmp);
|
|
|
|
|
END;
|
|
|
|
|
END IF;
|
|
|
|
|
END IF;
|
|
|
|
|
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('End','INFO',vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('End','INFO', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
EXCEPTION
|
|
|
|
|
WHEN ENV_MANAGER.ERR_TABLE_NOT_EXISTS THEN
|
|
|
|
|
vgMsgTmp := ENV_MANAGER.MSG_TABLE_NOT_EXISTS ||': '||vTableName;
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(vgMsgTmp, 'ERROR', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(vgMsgTmp, 'ERROR', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
RAISE_APPLICATION_ERROR(ENV_MANAGER.CODE_TABLE_NOT_EXISTS, vgMsgTmp);
|
|
|
|
|
WHEN ENV_MANAGER.ERR_COLUMN_NOT_EXISTS THEN
|
|
|
|
|
vgMsgTmp := ENV_MANAGER.MSG_COLUMN_NOT_EXISTS || ' (TableName.ColumnName): ' || vTableName||'.'||vKeyColumnName||CASE WHEN vCurrentCol IS NOT NULL THEN '.'||vCurrentCol||' in pColumnList' ELSE '' END;
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(vgMsgTmp, 'ERROR', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(vgMsgTmp, 'ERROR', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
RAISE_APPLICATION_ERROR(ENV_MANAGER.CODE_COLUMN_NOT_EXISTS, vgMsgTmp);
|
|
|
|
|
WHEN ENV_MANAGER.ERR_INVALID_PARALLEL_DEGREE THEN
|
|
|
|
|
RAISE_APPLICATION_ERROR(ENV_MANAGER.CODE_INVALID_PARALLEL_DEGREE, vgMsgTmp);
|
|
|
|
|
@@ -1000,7 +1000,7 @@ AS
|
|
|
|
|
WHEN OTHERS THEN
|
|
|
|
|
-- Log complete error details including full stack trace and backtrace
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_ERROR('Export failed: ' || SQLERRM, vParameters, 'DATA_EXPORTER');
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(ENV_MANAGER.GET_ERROR_STACK(pFormat => 'TABLE', pCode=> SQLCODE), 'ERROR', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(ENV_MANAGER.GET_ERROR_STACK(pFormat => 'TABLE', pCode=> SQLCODE), 'ERROR', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
RAISE_APPLICATION_ERROR(ENV_MANAGER.CODE_UNKNOWN, ENV_MANAGER.GET_ERROR_STACK(pFormat => 'OUTPUT', pCode=> SQLCODE));
|
|
|
|
|
|
|
|
|
|
END EXPORT_TABLE_DATA_BY_DATE;
|
|
|
|
|
@@ -1073,7 +1073,7 @@ AS
|
|
|
|
|
,'pMaxFileSize => '''||nvl(TO_CHAR(pMaxFileSize), 'NULL')||''''
|
|
|
|
|
,'pCredentialName => '''||nvl(pCredentialName, 'NULL')||''''
|
|
|
|
|
));
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Start','INFO', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Start','INFO', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
|
|
|
|
|
-- Get bucket URI based on bucket area using FILE_MANAGER function
|
|
|
|
|
vBucketUri := FILE_MANAGER.GET_BUCKET_URI(pBucketArea);
|
|
|
|
|
@@ -1105,29 +1105,29 @@ AS
|
|
|
|
|
-- Build query with TO_CHAR for date columns (per-column format support)
|
|
|
|
|
vProcessedColumnList := buildQueryWithDateFormats(pColumnList, vTableName, vSchemaName, vKeyColumnName, pTemplateTableName);
|
|
|
|
|
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Input column list: ' || NVL(pColumnList, 'NULL (using dynamic column list)'), 'DEBUG', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Processed column list with TO_CHAR for date columns: ' || vProcessedColumnList, 'DEBUG', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Template table: ' || NVL(pTemplateTableName, 'NULL - using global default for all dates'), 'INFO', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Input column list: ' || NVL(pColumnList, 'NULL (using dynamic column list)'), 'DEBUG', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Processed column list with TO_CHAR for date columns: ' || vProcessedColumnList, 'DEBUG', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Template table: ' || NVL(pTemplateTableName, 'NULL - using global default for all dates'), 'INFO', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
|
|
|
|
|
vTableName := DBMS_ASSERT.SCHEMA_NAME(vSchemaName) || '.' || DBMS_ASSERT.simple_sql_name(vTableName);
|
|
|
|
|
|
|
|
|
|
-- Validate parallel degree parameter
|
|
|
|
|
IF pParallelDegree < 1 OR pParallelDegree > 16 THEN
|
|
|
|
|
vgMsgTmp := ENV_MANAGER.MSG_INVALID_PARALLEL_DEGREE || ': ' || pParallelDegree || '. Valid range: 1-16';
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(vgMsgTmp, 'ERROR', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(vgMsgTmp, 'ERROR', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
RAISE_APPLICATION_ERROR(ENV_MANAGER.CODE_INVALID_PARALLEL_DEGREE, vgMsgTmp);
|
|
|
|
|
END IF;
|
|
|
|
|
|
|
|
|
|
-- Get partitions using shared function
|
|
|
|
|
vPartitions := GET_PARTITIONS(vSchemaName, vTableName, vKeyColumnName, pMinDate, pMaxDate, vParameters);
|
|
|
|
|
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Found ' || vPartitions.COUNT || ' year/month combinations to export', 'INFO', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Date range: ' || TO_CHAR(pMinDate, 'YYYY-MM-DD HH24:MI:SS') || ' to ' || TO_CHAR(pMaxDate, 'YYYY-MM-DD HH24:MI:SS'), 'DEBUG', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Parallel degree: ' || pParallelDegree, 'INFO', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Found ' || vPartitions.COUNT || ' year/month combinations to export', 'INFO', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Date range: ' || TO_CHAR(pMinDate, 'YYYY-MM-DD HH24:MI:SS') || ' to ' || TO_CHAR(pMaxDate, 'YYYY-MM-DD HH24:MI:SS'), 'DEBUG', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Parallel degree: ' || pParallelDegree, 'INFO', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
|
|
|
|
|
-- Sequential processing (parallel degree = 1)
|
|
|
|
|
IF pParallelDegree = 1 THEN
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Using sequential processing (pParallelDegree = 1)', 'DEBUG', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Using sequential processing (pParallelDegree = 1)', 'DEBUG', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
|
|
|
|
|
FOR i IN 1 .. vPartitions.COUNT LOOP
|
|
|
|
|
EXPORT_SINGLE_PARTITION(
|
|
|
|
|
@@ -1153,13 +1153,13 @@ AS
|
|
|
|
|
ELSE
|
|
|
|
|
-- Skip parallel processing if no partitions found
|
|
|
|
|
IF vPartitions.COUNT = 0 THEN
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('No partitions to export - skipping parallel CSV processing', 'INFO', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('No partitions to export - skipping parallel CSV processing', 'INFO', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
ELSE
|
|
|
|
|
DECLARE
|
|
|
|
|
vTaskName VARCHAR2(128) := 'DATA_CSV_EXPORT_TASK_' || TO_CHAR(SYSTIMESTAMP, 'YYYYMMDDHH24MISSFF');
|
|
|
|
|
vChunkId NUMBER;
|
|
|
|
|
BEGIN
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Using parallel processing with ' || pParallelDegree || ' threads', 'INFO', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Using parallel processing with ' || pParallelDegree || ' threads', 'INFO', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
|
|
|
|
|
-- Clean up old completed chunks (>24 hours) to prevent table bloat
|
|
|
|
|
-- CRITICAL: Do NOT delete chunks from other active sessions (same-day tasks)
|
|
|
|
|
@@ -1169,7 +1169,7 @@ AS
|
|
|
|
|
AND CREATED_DATE < SYSTIMESTAMP - INTERVAL '1' DAY;
|
|
|
|
|
COMMIT;
|
|
|
|
|
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Cleared old COMPLETED chunks (>24h). Active session chunks preserved.', 'DEBUG', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Cleared old COMPLETED chunks (>24h). Active session chunks preserved.', 'DEBUG', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
|
|
|
|
|
-- Populate chunks table (insert new chunks, preserve FAILED chunks for retry)
|
|
|
|
|
FOR i IN 1 .. vPartitions.COUNT LOOP
|
|
|
|
|
@@ -1198,7 +1198,7 @@ AS
|
|
|
|
|
SELECT COUNT(*) INTO vPendingCount FROM CT_MRDS.A_PARALLEL_EXPORT_CHUNKS WHERE STATUS = 'PENDING';
|
|
|
|
|
SELECT COUNT(*) INTO vFailedCount FROM CT_MRDS.A_PARALLEL_EXPORT_CHUNKS WHERE STATUS = 'FAILED';
|
|
|
|
|
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Chunk statistics: PENDING=' || vPendingCount || ', FAILED (retry)=' || vFailedCount, 'INFO', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Chunk statistics: PENDING=' || vPendingCount || ', FAILED (retry)=' || vFailedCount, 'INFO', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
-- Create parallel task
|
|
|
|
|
@@ -1214,7 +1214,7 @@ AS
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
-- Execute task in parallel
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Executing parallel CSV export task: ' || vTaskName, 'DEBUG', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Executing parallel CSV export task: ' || vTaskName, 'DEBUG', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
|
|
|
|
|
DBMS_PARALLEL_EXECUTE.RUN_TASK(
|
|
|
|
|
task_name => vTaskName,
|
|
|
|
|
@@ -1233,7 +1233,7 @@ AS
|
|
|
|
|
|
|
|
|
|
IF vErrorCount > 0 THEN
|
|
|
|
|
vgMsgTmp := 'Parallel CSV export completed with ' || vErrorCount || ' errors. Check USER_PARALLEL_EXECUTE_CHUNKS for details.';
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(vgMsgTmp, 'ERROR', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(vgMsgTmp, 'ERROR', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
RAISE_APPLICATION_ERROR(ENV_MANAGER.CODE_PARALLEL_EXECUTION_FAILED, vgMsgTmp);
|
|
|
|
|
END IF;
|
|
|
|
|
END;
|
|
|
|
|
@@ -1246,7 +1246,7 @@ AS
|
|
|
|
|
DELETE FROM CT_MRDS.A_PARALLEL_EXPORT_CHUNKS WHERE TASK_NAME = vTaskName;
|
|
|
|
|
COMMIT;
|
|
|
|
|
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Parallel CSV execution completed successfully', 'INFO', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Parallel CSV execution completed successfully', 'INFO', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
EXCEPTION
|
|
|
|
|
WHEN OTHERS THEN
|
|
|
|
|
-- Attempt to drop task on error
|
|
|
|
|
@@ -1257,23 +1257,23 @@ AS
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
vgMsgTmp := ENV_MANAGER.MSG_PARALLEL_EXECUTION_FAILED || ': ' || SQLERRM || cgBL || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE;
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(vgMsgTmp, 'ERROR', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(vgMsgTmp, 'ERROR', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
RAISE_APPLICATION_ERROR(ENV_MANAGER.CODE_PARALLEL_EXECUTION_FAILED, vgMsgTmp);
|
|
|
|
|
END;
|
|
|
|
|
END IF;
|
|
|
|
|
END IF;
|
|
|
|
|
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Export completed successfully for ' || vPartitions.COUNT || ' files', 'INFO', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('End','INFO',vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('Export completed successfully for ' || vPartitions.COUNT || ' files', 'INFO', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT('End','INFO', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
|
|
|
|
|
EXCEPTION
|
|
|
|
|
WHEN ENV_MANAGER.ERR_TABLE_NOT_EXISTS THEN
|
|
|
|
|
vgMsgTmp := ENV_MANAGER.MSG_TABLE_NOT_EXISTS ||': '||vTableName;
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(vgMsgTmp, 'ERROR', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(vgMsgTmp, 'ERROR', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
RAISE_APPLICATION_ERROR(ENV_MANAGER.CODE_TABLE_NOT_EXISTS, vgMsgTmp);
|
|
|
|
|
WHEN ENV_MANAGER.ERR_COLUMN_NOT_EXISTS THEN
|
|
|
|
|
vgMsgTmp := ENV_MANAGER.MSG_COLUMN_NOT_EXISTS || ' (TableName.ColumnName): ' || vTableName||'.'||vKeyColumnName||CASE WHEN vCurrentCol IS NOT NULL THEN '.'||vCurrentCol||' in pColumnList' ELSE '' END;
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(vgMsgTmp, 'ERROR', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(vgMsgTmp, 'ERROR', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
RAISE_APPLICATION_ERROR(ENV_MANAGER.CODE_COLUMN_NOT_EXISTS, vgMsgTmp);
|
|
|
|
|
WHEN ENV_MANAGER.ERR_INVALID_PARALLEL_DEGREE THEN
|
|
|
|
|
RAISE_APPLICATION_ERROR(ENV_MANAGER.CODE_INVALID_PARALLEL_DEGREE, vgMsgTmp);
|
|
|
|
|
@@ -1282,7 +1282,7 @@ AS
|
|
|
|
|
WHEN OTHERS THEN
|
|
|
|
|
-- Log complete error details including full stack trace and backtrace
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_ERROR('Export failed: ' || SQLERRM, vParameters, 'DATA_EXPORTER');
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(ENV_MANAGER.GET_ERROR_STACK(pFormat => 'TABLE', pCode=> SQLCODE), 'ERROR', vParameters);
|
|
|
|
|
ENV_MANAGER.LOG_PROCESS_EVENT(ENV_MANAGER.GET_ERROR_STACK(pFormat => 'TABLE', pCode=> SQLCODE), 'ERROR', vParameters, 'DATA_EXPORTER');
|
|
|
|
|
RAISE_APPLICATION_ERROR(ENV_MANAGER.CODE_UNKNOWN, ENV_MANAGER.GET_ERROR_STACK(pFormat => 'OUTPUT', pCode=> SQLCODE));
|
|
|
|
|
|
|
|
|
|
END EXPORT_TABLE_DATA_TO_CSV_BY_DATE;
|
|
|
|
|
|