Init
This commit is contained in:
@@ -0,0 +1,5 @@
|
||||
--
|
||||
-- Role to which object permissions to ODS user are granted
|
||||
--
|
||||
CREATE ROLE MRDS_LOADER_ROLE;
|
||||
GRANT MRDS_LOADER_ROLE TO ODS;
|
||||
@@ -0,0 +1,21 @@
|
||||
CREATE USER ODS IDENTIFIED BY "slIgjdr938403$#$";
|
||||
GRANT CONNECT, CREATE TABLE TO ODS;
|
||||
GRANT READ, WRITE ON DIRECTORY DATA_PUMP_DIR TO ODS;
|
||||
GRANT EXECUTE ON DBMS_CLOUD TO ODS;
|
||||
EXEC DBMS_CLOUD_ADMIN.ENABLE_RESOURCE_PRINCIPAL(username => 'ODS');
|
||||
GRANT EXECUTE ON CT_MRDS.FILE_MANAGER TO ODS;
|
||||
|
||||
-- Granular table-level privileges for specific CT_MRDS tables
|
||||
GRANT SELECT, DELETE, INSERT, UPDATE ON "CT_MRDS"."A_SOURCE_FILE_TYPES" TO ODS;
|
||||
GRANT SELECT, DELETE, INSERT, UPDATE ON "CT_MRDS"."A_SOURCE_FILES_RECEIVED" TO ODS;
|
||||
GRANT SELECT, DELETE, INSERT, UPDATE ON "CT_MRDS"."A_PROCESS_LOG" TO ODS;
|
||||
GRANT SELECT ON "CT_MRDS"."A_SOURCE_FILES_RECEIVED_KEY_SEQ" TO ODS;
|
||||
|
||||
-- Broad ANY privileges required for FILE_MANAGER_ODS package operations (MARS-770)
|
||||
-- These are needed for external table creation and cross-schema operations
|
||||
GRANT SELECT ANY TABLE TO ODS;
|
||||
GRANT DELETE ANY TABLE TO ODS;
|
||||
GRANT INSERT ANY TABLE TO ODS;
|
||||
GRANT UPDATE ANY TABLE TO ODS;
|
||||
GRANT EXECUTE ANY PROCEDURE TO ODS;
|
||||
GRANT SELECT_CATALOG_ROLE TO ODS;
|
||||
@@ -0,0 +1,118 @@
|
||||
create or replace PACKAGE BODY ODS.FILE_MANAGER_ODS
|
||||
AS
|
||||
|
||||
/**
|
||||
* CREATE_EXTERNAL_TABLE - Wrapper for CT_MRDS.FILE_MANAGER.CREATE_EXTERNAL_TABLE
|
||||
*/
|
||||
PROCEDURE CREATE_EXTERNAL_TABLE (
|
||||
pTableName IN VARCHAR2,
|
||||
pTemplateTableName IN VARCHAR2,
|
||||
pPrefix IN VARCHAR2,
|
||||
pBucketUri IN VARCHAR2 DEFAULT CT_MRDS.ENV_MANAGER.gvInboxBucketUri,
|
||||
pFileName IN VARCHAR2 DEFAULT NULL,
|
||||
pDelimiter IN VARCHAR2 DEFAULT ',',
|
||||
pEncoding IN VARCHAR2 DEFAULT NULL
|
||||
)
|
||||
IS
|
||||
vParameters CT_MRDS.A_PROCESS_LOG.PROCEDURE_PARAMETERS%TYPE;
|
||||
BEGIN
|
||||
-- Log the start of the procedure
|
||||
vParameters := CT_MRDS.ENV_MANAGER.FORMAT_PARAMETERS(
|
||||
SYS.ODCIVARCHAR2LIST(
|
||||
'pTableName => ''' || pTableName || '''',
|
||||
'pTemplateTableName => ''' || pTemplateTableName || '''',
|
||||
'pPrefix => ''' || pPrefix || '''',
|
||||
'pBucketUri => ''' || pBucketUri || '''',
|
||||
'pFileName => ''' || NVL(pFileName, 'NULL') || '''',
|
||||
'pDelimiter => ''' || pDelimiter || '''',
|
||||
'pEncoding => ''' || NVL(pEncoding, 'NULL') || ''''
|
||||
)
|
||||
);
|
||||
|
||||
CT_MRDS.ENV_MANAGER.LOG_PROCESS_EVENT('Start FILE_MANAGER_ODS.CREATE_EXTERNAL_TABLE', 'INFO', vParameters);
|
||||
|
||||
-- Call the original CT_MRDS.FILE_MANAGER.CREATE_EXTERNAL_TABLE procedure
|
||||
-- This ensures all logic remains centralized in the original package
|
||||
-- and ODS wrapper simply delegates execution with DEFINER rights
|
||||
CT_MRDS.FILE_MANAGER.CREATE_EXTERNAL_TABLE(
|
||||
pTableName => pTableName,
|
||||
pTemplateTableName => pTemplateTableName,
|
||||
pPrefix => pPrefix,
|
||||
pBucketUri => pBucketUri,
|
||||
pFileName => pFileName,
|
||||
pDelimiter => pDelimiter,
|
||||
pEncoding => pEncoding
|
||||
);
|
||||
|
||||
CT_MRDS.ENV_MANAGER.LOG_PROCESS_EVENT('End FILE_MANAGER_ODS.CREATE_EXTERNAL_TABLE', 'INFO', vParameters);
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
CT_MRDS.ENV_MANAGER.LOG_PROCESS_EVENT(
|
||||
'Error in ODS.FILE_MANAGER_ODS.CREATE_EXTERNAL_TABLE: ' || SQLERRM,
|
||||
'ERROR',
|
||||
vParameters
|
||||
);
|
||||
RAISE;
|
||||
END CREATE_EXTERNAL_TABLE;
|
||||
|
||||
----------------------------------------------------------------------------------------------------
|
||||
-- PACKAGE VERSION MANAGEMENT FUNCTIONS IMPLEMENTATION
|
||||
----------------------------------------------------------------------------------------------------
|
||||
|
||||
FUNCTION GET_VERSION
|
||||
RETURN VARCHAR2
|
||||
IS
|
||||
BEGIN
|
||||
RETURN PACKAGE_VERSION;
|
||||
END GET_VERSION;
|
||||
|
||||
----------------------------------------------------------------------------------------------------
|
||||
|
||||
FUNCTION GET_BUILD_DATE
|
||||
RETURN VARCHAR2
|
||||
IS
|
||||
BEGIN
|
||||
RETURN PACKAGE_BUILD_DATE;
|
||||
END GET_BUILD_DATE;
|
||||
|
||||
----------------------------------------------------------------------------------------------------
|
||||
|
||||
FUNCTION GET_AUTHOR
|
||||
RETURN VARCHAR2
|
||||
IS
|
||||
BEGIN
|
||||
RETURN PACKAGE_AUTHOR;
|
||||
END GET_AUTHOR;
|
||||
|
||||
----------------------------------------------------------------------------------------------------
|
||||
|
||||
FUNCTION GET_BUILD_INFO
|
||||
RETURN VARCHAR2
|
||||
IS
|
||||
BEGIN
|
||||
RETURN CT_MRDS.ENV_MANAGER.GET_PACKAGE_VERSION_INFO(
|
||||
pPackageName => 'FILE_MANAGER_ODS',
|
||||
pVersion => PACKAGE_VERSION,
|
||||
pBuildDate => PACKAGE_BUILD_DATE,
|
||||
pAuthor => PACKAGE_AUTHOR
|
||||
);
|
||||
END GET_BUILD_INFO;
|
||||
|
||||
----------------------------------------------------------------------------------------------------
|
||||
|
||||
FUNCTION GET_VERSION_HISTORY
|
||||
RETURN VARCHAR2
|
||||
IS
|
||||
BEGIN
|
||||
RETURN CT_MRDS.ENV_MANAGER.FORMAT_VERSION_HISTORY(
|
||||
pPackageName => 'FILE_MANAGER_ODS',
|
||||
pVersionHistory => VERSION_HISTORY
|
||||
);
|
||||
END GET_VERSION_HISTORY;
|
||||
|
||||
----------------------------------------------------------------------------------------------------
|
||||
|
||||
END FILE_MANAGER_ODS;
|
||||
|
||||
/
|
||||
@@ -0,0 +1,116 @@
|
||||
create or replace PACKAGE ODS.FILE_MANAGER_ODS
|
||||
AUTHID DEFINER
|
||||
AS
|
||||
/**
|
||||
* FILE_MANAGER_ODS - Wrapper package for CT_MRDS.FILE_MANAGER
|
||||
*
|
||||
* This package serves as a wrapper for CT_MRDS.FILE_MANAGER procedures.
|
||||
* The key difference is that this package uses AUTHID DEFINER instead of
|
||||
* AUTHID CURRENT_USER, which means all objects will be created in the ODS
|
||||
* schema regardless of which user executes the procedures.
|
||||
*
|
||||
* This solves the execution context issue where users need to connect as
|
||||
* ODS user to use CT_MRDS.FILE_MANAGER procedures.
|
||||
*
|
||||
* MARS-1049: Added pEncoding parameter support for CSV character set specification
|
||||
*/
|
||||
|
||||
-- Package Version Information (Semantic Versioning: MAJOR.MINOR.PATCH)
|
||||
PACKAGE_VERSION CONSTANT VARCHAR2(10) := '2.1.0';
|
||||
PACKAGE_BUILD_DATE CONSTANT VARCHAR2(20) := '2025-11-24 11:50:00';
|
||||
PACKAGE_AUTHOR CONSTANT VARCHAR2(100) := 'Grzegorz Michalski';
|
||||
|
||||
-- Version History (Latest changes first)
|
||||
VERSION_HISTORY CONSTANT VARCHAR2(4000) :=
|
||||
'2.1.0 (2025-11-24): MARS-1049 - Added pEncoding parameter support for CSV character set specification' || CHR(13)||CHR(10) ||
|
||||
'2.0.0 (2025-10-22): Added package versioning system using centralized ENV_MANAGER functions' || CHR(13)||CHR(10) ||
|
||||
'1.5.0 (2025-10-12): Enhanced external table creation with official path patterns support' || CHR(13)||CHR(10) ||
|
||||
'1.0.0 (2025-09-20): Initial release with AUTHID DEFINER wrapper for external table creation';
|
||||
|
||||
/**
|
||||
* @name CREATE_EXTERNAL_TABLE
|
||||
* @desc Creates external tables that can read data from Oracle Cloud Storage.
|
||||
* This is a wrapper for CT_MRDS.FILE_MANAGER.CREATE_EXTERNAL_TABLE
|
||||
* but uses DEFINER rights to ensure objects are created in ODS schema.
|
||||
*
|
||||
* MARS-1049: Added support for CSV character set encoding specification
|
||||
* @param pTableName - Name of the external table to create
|
||||
* @param pTemplateTableName - Template table defining the structure
|
||||
* @param pPrefix - Storage path prefix in Oracle Cloud Storage
|
||||
* @param pBucketUri - URI of the target bucket (default: ENV_MANAGER.gvInboxBucketUri)
|
||||
* @param pFileName - Specific file name (optional)
|
||||
* @param pDelimiter - Field delimiter (default: ',')
|
||||
* @param pEncoding - Character set encoding for CSV files (e.g., 'UTF-8', 'WE8MSWIN1252', 'EE8ISO8859P2')
|
||||
* If NULL, no CHARACTERSET clause is added to external table definition
|
||||
* @example EXEC ODS.FILE_MANAGER_ODS.CREATE_EXTERNAL_TABLE(
|
||||
* 'C2D_A_UC_DISSEM_METADATA_LOADS_INBOX',
|
||||
* 'CT_ET_TEMPLATES.C2D_A_UC_DISSEM_METADATA_LOADS',
|
||||
* 'INBOX/C2D/UC_DISSEM/A_UC_DISSEM_METADATA_LOADS',
|
||||
* CT_MRDS.ENV_MANAGER.gvInboxBucketUri,
|
||||
* NULL, ',', 'UTF-8'
|
||||
* );
|
||||
*/
|
||||
PROCEDURE CREATE_EXTERNAL_TABLE (
|
||||
pTableName IN VARCHAR2,
|
||||
pTemplateTableName IN VARCHAR2,
|
||||
pPrefix IN VARCHAR2,
|
||||
pBucketUri IN VARCHAR2 DEFAULT CT_MRDS.ENV_MANAGER.gvInboxBucketUri,
|
||||
pFileName IN VARCHAR2 DEFAULT NULL,
|
||||
pDelimiter IN VARCHAR2 DEFAULT ',',
|
||||
pEncoding IN VARCHAR2 DEFAULT NULL
|
||||
);
|
||||
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- PACKAGE VERSION MANAGEMENT FUNCTIONS
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* @name GET_VERSION
|
||||
* @desc Returns the current version number of the FILE_MANAGER_ODS package.
|
||||
* Uses semantic versioning format (MAJOR.MINOR.PATCH).
|
||||
* @example SELECT FILE_MANAGER_ODS.GET_VERSION() FROM DUAL;
|
||||
* @ex_rslt 2.1.0
|
||||
**/
|
||||
FUNCTION GET_VERSION RETURN VARCHAR2;
|
||||
|
||||
/**
|
||||
* @name GET_BUILD_DATE
|
||||
* @desc Returns the build date of the FILE_MANAGER_ODS package.
|
||||
* @return VARCHAR2 - Build date in format 'YYYY-MM-DD HH24:MI:SS'
|
||||
* @example SELECT ODS.FILE_MANAGER_ODS.GET_BUILD_DATE() FROM DUAL;
|
||||
*/
|
||||
FUNCTION GET_BUILD_DATE RETURN VARCHAR2;
|
||||
|
||||
/**
|
||||
* @name GET_AUTHOR
|
||||
* @desc Returns the author of the FILE_MANAGER_ODS package.
|
||||
* @return VARCHAR2 - Package author name
|
||||
* @example SELECT ODS.FILE_MANAGER_ODS.GET_AUTHOR() FROM DUAL;
|
||||
*/
|
||||
FUNCTION GET_AUTHOR RETURN VARCHAR2;
|
||||
|
||||
/**
|
||||
* @name GET_BUILD_INFO
|
||||
* @desc Returns comprehensive build information including version, build date, and author.
|
||||
* Uses centralized ENV_MANAGER.GET_PACKAGE_VERSION_INFO function.
|
||||
* @example SELECT FILE_MANAGER_ODS.GET_BUILD_INFO() FROM DUAL;
|
||||
* @ex_rslt Package: FILE_MANAGER_ODS
|
||||
* Version: 2.1.0
|
||||
* Build Date: 2025-11-24 11:50:00
|
||||
* Author: Grzegorz Michalski
|
||||
**/
|
||||
FUNCTION GET_BUILD_INFO RETURN VARCHAR2;
|
||||
|
||||
/**
|
||||
* @name GET_VERSION_HISTORY
|
||||
* @desc Returns complete version history with all releases and changes.
|
||||
* Uses centralized ENV_MANAGER.FORMAT_VERSION_HISTORY function.
|
||||
* @example SELECT FILE_MANAGER_ODS.GET_VERSION_HISTORY() FROM DUAL;
|
||||
* @ex_rslt FILE_MANAGER_ODS Version History:
|
||||
* 2.0.0 (2025-10-22): Added package versioning system...
|
||||
**/
|
||||
FUNCTION GET_VERSION_HISTORY RETURN VARCHAR2;
|
||||
|
||||
END FILE_MANAGER_ODS;
|
||||
|
||||
/
|
||||
@@ -0,0 +1,29 @@
|
||||
drop table ods.STANDING_FACILITIES;
|
||||
BEGIN
|
||||
DBMS_CLOUD.CREATE_EXTERNAL_TABLE(
|
||||
table_name =>'STANDING_FACILITIES',
|
||||
credential_name =>'OCI$RESOURCE_PRINCIPAL',
|
||||
file_uri_list =>'https://objectstorage.eu-frankfurt-1.oraclecloud.com/n/frcnomajoc7v/b/mrds_inbox_tst/o/ODS/LM/STANDINGFACILITIES/*.csv',
|
||||
format => json_object('type' value 'csv', 'skipheaders' value '1'),
|
||||
field_list =>
|
||||
'"A_WORKFLOW_HISTORY_KEY" INTEGER,
|
||||
"REFERENCE_DATE" DATE MASK "YYYY-MM-DD",
|
||||
"VERSION" INTEGER,
|
||||
"MFI_ID" CHAR,
|
||||
"MFI_NAME" CHAR,
|
||||
"COUNTRY" CHAR,
|
||||
"MARGINAL_LENDING_FACILITY" NUMBER,
|
||||
"DEPOSIT_FACILITY" NUMBER',
|
||||
column_list =>
|
||||
'"A_WORKFLOW_HISTORY_KEY" NUMBER,
|
||||
"REFERENCE_DATE" DATE,
|
||||
"VERSION" NUMBER,
|
||||
"MFI_ID" VARCHAR2(200),
|
||||
"MFI_NAME" VARCHAR2(500),
|
||||
"COUNTRY" VARCHAR2(200),
|
||||
"MARGINAL_LENDING_FACILITY" NUMBER,
|
||||
"DEPOSIT_FACILITY" NUMBER'
|
||||
);
|
||||
END;
|
||||
/
|
||||
--select count(*) from STANDING_FACILITIES;
|
||||
@@ -0,0 +1,28 @@
|
||||
BEGIN
|
||||
DBMS_CLOUD.CREATE_EXTERNAL_TABLE(
|
||||
table_name =>'STANDING_FACILITIES',
|
||||
credential_name =>'OCI$RESOURCE_PRINCIPAL',
|
||||
file_uri_list =>'https://objectstorage.eu-frankfurt-1.oraclecloud.com/n/frcnomajoc7v/b/dbt-matthias-bucket/o/lm/ods_load/*.csv',
|
||||
format => json_object('type' value 'csv', 'skipheaders' value '1'),
|
||||
field_list =>
|
||||
'"A_WORKFLOW_HISTORY_KEY" NUMBER,
|
||||
"REFERENCE_DATE" DATE MASK "YYYY-MM-DD",
|
||||
"VERSION" NUMBER,
|
||||
"MFI_ID" VARCHAR2(200),
|
||||
"MFI_NAME" VARCHAR2(500),
|
||||
"MARGINAL_LENDING_FACILITY" NUMBER,
|
||||
"DEPOSIT_FACILITY" NUMBER,
|
||||
"COUNTRY" VARCHAR2(200)',
|
||||
column_list =>
|
||||
'"A_WORKFLOW_HISTORY_KEY" NUMBER
|
||||
"REFERENCE_DATE" DATE,
|
||||
"VERSION" NUMBER,
|
||||
"MFI_ID" VARCHAR2(200),
|
||||
"MFI_NAME" VARCHAR2(500),
|
||||
"COUNTRY" VARCHAR2(200),
|
||||
"MARGINAL_LENDING_FACILITY" NUMBER,
|
||||
"DEPOSIT_FACILITY" NUMBER'
|
||||
);
|
||||
END;
|
||||
/
|
||||
select count(*) from STANDING_FACILITIES;
|
||||
@@ -0,0 +1,27 @@
|
||||
drop table ods.STANDING_FACILITIES;
|
||||
BEGIN
|
||||
DBMS_CLOUD.CREATE_EXTERNAL_TABLE(
|
||||
table_name =>'STANDING_FACILITIES',
|
||||
credential_name =>'OCI$RESOURCE_PRINCIPAL',
|
||||
file_uri_list =>'https://objectstorage.eu-frankfurt-1.oraclecloud.com/n/frcnomajoc7v/b/mrds_inbox_tst/o/ODS/LM/STANDING_FACILITIES/*.csv',
|
||||
format => json_object('type' value 'csv', 'skipheaders' value '1'),
|
||||
field_list =>
|
||||
'"REFERENCE_DATE" CHAR,
|
||||
"VERSION" CHAR,
|
||||
"MFI_ID" CHAR,
|
||||
"MFI_NAME" CHAR,
|
||||
"COUNTRY" CHAR,
|
||||
"MARGINAL_LENDING_FACILITY" CHAR,
|
||||
"DEPOSIT_FACILITY" CHAR',
|
||||
column_list =>
|
||||
'"REFERENCE_DATE" VARCHAR2(200),
|
||||
"VERSION" VARCHAR2(200),
|
||||
"MFI_ID" VARCHAR2(200),
|
||||
"MFI_NAME" VARCHAR2(500),
|
||||
"COUNTRY" VARCHAR2(200),
|
||||
"MARGINAL_LENDING_FACILITY" VARCHAR2(200),
|
||||
"DEPOSIT_FACILITY" VARCHAR2(200)'
|
||||
);
|
||||
END;
|
||||
/
|
||||
--select count(*) from STANDING_FACILITIES;
|
||||
Reference in New Issue
Block a user