-- =================================================================== -- Simple Package Version Tracking Script -- =================================================================== -- Purpose: Track specified Oracle package versions -- Author: Grzegorz Michalski -- Date: 2025-11-25 -- Version: 3.1.0 - List-Based Edition -- -- USAGE: -- 1. Edit package list below (add/remove packages as needed) -- 2. Include in your install/rollback script: @@track_package_versions.sql -- =================================================================== SET SERVEROUTPUT ON; DECLARE TYPE t_package_rec IS RECORD ( owner VARCHAR2(50), package_name VARCHAR2(50), version VARCHAR2(50) ); TYPE t_packages IS TABLE OF t_package_rec; TYPE t_string_array IS TABLE OF VARCHAR2(100); -- =================================================================== -- PACKAGE LIST - Edit this array to specify packages to track -- =================================================================== -- Add or remove entries as needed for your MARS issue -- Format: 'SCHEMA.PACKAGE_NAME' -- =================================================================== vPackageList t_string_array := t_string_array( 'CT_MRDS.FILE_MANAGER', 'ODS.FILE_MANAGER_ODS' ); -- =================================================================== vPackages t_packages := t_packages(); vVersion VARCHAR2(50); vCount NUMBER := 0; vOwner VARCHAR2(50); vPackageName VARCHAR2(50); vDotPos NUMBER; BEGIN DBMS_OUTPUT.PUT_LINE('========================================'); DBMS_OUTPUT.PUT_LINE('Package Version Tracking'); DBMS_OUTPUT.PUT_LINE('========================================'); -- Process each package in the list FOR i IN 1..vPackageList.COUNT LOOP vDotPos := INSTR(vPackageList(i), '.'); IF vDotPos > 0 THEN vOwner := SUBSTR(vPackageList(i), 1, vDotPos - 1); vPackageName := SUBSTR(vPackageList(i), vDotPos + 1); -- Get package version BEGIN EXECUTE IMMEDIATE 'SELECT ' || vOwner || '.' || vPackageName || '.GET_VERSION() FROM DUAL' INTO vVersion; vPackages.EXTEND; vPackages(vPackages.COUNT).owner := vOwner; vPackages(vPackages.COUNT).package_name := vPackageName; vPackages(vPackages.COUNT).version := vVersion; -- Track in ENV_MANAGER BEGIN CT_MRDS.ENV_MANAGER.TRACK_PACKAGE_VERSION( pPackageOwner => vOwner, pPackageName => vPackageName, pPackageVersion => vVersion, pPackageBuildDate => TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'), pPackageAuthor => 'Grzegorz Michalski' ); vCount := vCount + 1; EXCEPTION WHEN OTHERS THEN NULL; -- Continue even if tracking fails END; EXCEPTION WHEN OTHERS THEN NULL; -- Skip packages that fail END; END IF; END LOOP; -- Display results IF vPackages.COUNT > 0 THEN DBMS_OUTPUT.PUT_LINE('Packages tracked: ' || vCount || ' of ' || vPackages.COUNT); DBMS_OUTPUT.PUT_LINE(''); FOR i IN 1..vPackages.COUNT LOOP DBMS_OUTPUT.PUT_LINE(vPackages(i).owner || '.' || vPackages(i).package_name || ' = ' || vPackages(i).version); END LOOP; ELSE DBMS_OUTPUT.PUT_LINE('No packages found in list'); END IF; DBMS_OUTPUT.PUT_LINE('========================================'); END; /