-- SQL Name: Datastore_Configuration_Parser -- Author : Jim Egan (MTGI) -- This PL/SQL block will construct a list of Datastores and the configurations defined within each Datastore. -- It will only report on the first alias defined within the Datastore. Additional code is necessary to report -- on all the aliases. -- This is primarly oriented towards Oracle Datastores but you should at least see the configurations for all databases. -- The output uses the vertical bar as a column separator. Paste the output into Excel and use the Text to Columns -- feature to make it readable. Then sort on the first two columns and adjust all the column widths as needed. -- To get useful output I run this from SQL Developer using the F5 key (Run script). It will also work in SQLPlus. set serveroutput on DECLARE vDataStore_Full NVARCHAR2(32000) := NULL; vCurrentDatastoreName NVARCHAR2(64); vDSConfiguration_BeginPos NUMBER(5); vDSConfiguration_EndPos NUMBER(5); vDSConfiguration_Instance NUMBER(2) := 1; vDSConfiguration_InstanceText NVARCHAR2(4000); vDSConfiguration_Name NVARCHAR2(64); vDSConfiguration_DatabaseType NVARCHAR2(30); vDSConfiguration_AliasName NVARCHAR2(30); vDSConfiguration_AliasValue NVARCHAR2(30); vDSConfiguration_OracleHost NVARCHAR2(30); vDSConfiguration_User NVARCHAR2(30); vDSConfiguration_DefaultFlag NVARCHAR2(5); vDSConfiguration_AliasCounter NUMBER(2); -- Reverse sort on the seqnum so we always end on the first line CURSOR DataStore_Cursor IS SELECT al_lang.name, al_langtext.* FROM al_langtext JOIN al_lang ON (al_lang.object_type = 5 and al_lang.object_key = al_langtext.parent_objid) WHERE version = (select MAX(version) FROM al_lang subq WHERE subq.normname = al_lang.normname AND subq.object_type = 5) ORDER BY al_lang.name, al_langtext.seqnum DESC; -- Inline function so I don't have to create an object FUNCTION GetTagString(pString IN NVARCHAR2, pTagStart IN NVARCHAR2, pTagEnd IN NVARCHAR2) RETURN NVARCHAR2 IS vTagBeginPos NUMBER(4); vTagEndPos NUMBER(4); vTagContents NVARCHAR2(4000) := ''; BEGIN -- Get the string value between the two tags vTagBeginPos := INSTR(pString, pTagStart, 1, 1); -- If the begin tag wasn't found then don't try to find the string within the tags IF (vTagBeginPos > 0) THEN vTagEndPos := INSTR(pString, pTagEnd, vTagBeginPos + LENGTH(pTagStart), 1); vTagContents := SUBSTR(pString, vTagBeginPos + LENGTH(pTagStart), vTagEndPos - (vTagBeginPos + LENGTH(pTagStart))); END IF; RETURN vTagContents; END GetTagString; BEGIN PRAGMA INLINE(GetTagString, 'YES'); -- Write out the headings DBMS_OUTPUT.PUT_LINE('DataStore_Name|' || 'Configuration_Name|' || 'Default|' || 'Database_Type|' || 'Alias_Name|' || 'Alias_Value|' || 'Oracle_Host|' || 'Oracle_User'); FOR DataStore_Rec IN DataStore_Cursor LOOP vDataStore_Full := REPLACE(REPLACE(DataStore_Rec.TEXT_VALUE,CHR(13),''), CHR(10),'') || vDataStore_Full ; -- If the SEQNUM = 1 then this is the first line of the Datastore and we need to process it IF (DataStore_Rec.SEQNUM = 1) THEN -- DBMS_OUTPUT.PUT_LINE(vDataStore_Full); -- Find the first configuration vDSConfiguration_Instance := 1; vDSConfiguration_BeginPos := INSTR(vDataStore_Full,' 0) LOOP -- Find the end of this specific configuration vDSConfiguration_EndPos := INSTR(vDataStore_Full, '', vDSConfiguration_BeginPos, 1); -- Capture the entire string for this specific configuration vDSConfiguration_InstanceText := SUBSTR(vDataStore_Full, vDSConfiguration_BeginPos, vDSConfiguration_EndPos - vDSConfiguration_BeginPos + LENGTH('')); -- Get the name of the configuration vDSConfiguration_Name := GetTagString(vDSConfiguration_InstanceText, 'name="','"'); vDSConfiguration_DefaultFlag := GetTagString(vDSConfiguration_InstanceText, 'default="','"'); -- Convert to Yes/No select DECODE(vDSConfiguration_DefaultFlag,'true','Yes','No') INTO vDSConfiguration_DefaultFlag FROM DUAL; -- Get the database type for the configuration vDSConfiguration_DatabaseType := GetTagString(vDSConfiguration_InstanceText, '',''); vDSConfiguration_OracleHost := GetTagString(vDSConfiguration_InstanceText, '', ''); vDSConfiguration_User := GetTagString(vDSConfiguration_InstanceText, '', ''); vDSConfiguration_AliasCounter := 1; -- Get the name/value for each alias. There may be more than one. vDSConfiguration_AliasName := GetTagString(vDSConfiguration_InstanceText, '', ''); WHILE (LENGTH(vDSConfiguration_AliasName) > 0) LOOP vDSConfiguration_AliasValue := GetTagString(vDSConfiguration_InstanceText, '', ''); DBMS_OUTPUT.PUT_LINE(DataStore_Rec.NAME || '|' || vDSConfiguration_Name || '|' || vDSConfiguration_DefaultFlag || '|' || vDSConfiguration_DatabaseType || '|' || vDSConfiguration_AliasName || '|' || vDSConfiguration_AliasValue || '|' || vDSConfiguration_OracleHost || '|' || vDSConfiguration_User); vDSConfiguration_AliasCounter := vDSConfiguration_AliasCounter + 1; vDSConfiguration_AliasName := GetTagString(vDSConfiguration_InstanceText, '', ''); END LOOP; -- Find the start of the next configuration vDSConfiguration_Instance := vDSConfiguration_Instance + 1; vDSConfiguration_BeginPos := INSTR(vDataStore_Full, '