sql >> Database >  >> RDS >> Oracle

Een lijst met privéprocedures/-functies ophalen uit een pakkettekst

De aard van privéfuncties is dat ze privé zijn. Er zijn geen datadictionary-weergaven die deze standaard weergeven. USER_PROCEDURES en USER_ARGUMENTS tonen alleen informatie voor openbare procedures (degene die zijn gedefinieerd in een pakketspecificatie0.

We kunnen er echter informatie over krijgen met behulp van PL/SCOPE, maar dit vereist een beetje extra inspanning:

  1. SQL> alter session set plscope_settings='IDENTIFIERS:ALL';
  2. SQL> alter package your_package compile body;

Nu kunt u uw privé-programma-eenheden vinden met deze vraag:

select ui.type, ui.name, ui.usage_id
from user_identifiers ui
where ui.object_name = 'YOUR_PACKAGE'
and ui.usage = 'DEFINITION'
and ui.type in ('PROCEDURE', 'FUNCTION')
minus
( select 'PROCEDURE', upr.procedure_name 
  from user_procedures upr
  where upr.object_name = 'YOUR_PACKAGE'
  union
  select 'FUNCTION', uarg.object_name
  from user_arguments uarg
  where uarg.package_name = 'YOUR_PACKAGE'
  and uarg.position = 0 
);

Om de argumenten van een privéprocedure te krijgen, plugt u de USAGE_ID van de vorige query in deze query:

select ui.name
       , ui.type
       , ui.usage_id
       , ui2.type as param_datatype
from user_identifiers ui
     left join user_identifiers ui2
        on ui2.usage_context_id = ui.usage_id 
where ui.object_name = 'YOUR_PACKAGE'
and ui.usage = 'DECLARATION'
and ui.usage_context_id = :private_proc_usage_id
/

Dit moet een left join zijn omdat user_identifiers heeft datatype-items voor scalaire datatypes (karakter, getal, datum, clob) maar geen complexe datatypes (xmltype, door de gebruiker gedefinieerde types).

We kunnen veel informatie over procedures krijgen van PL/SCOPE, hoewel het niet zo eenvoudig is als het opvragen van USER_PROCEDURES of USER_ARGUMENTS (in feite is het verrassend onhandig). Meer te weten komen. Houd er rekening mee dat PL/SCOPE-gegevens worden opgeslagen in de SYSAUX-tabelruimte, dus kom niet in heet water met uw DBA!




  1. 6 manieren om de grootte van een database in SQL Server te controleren met T-SQL

  2. 3 manieren om een ​​getal op te maken tot 2 decimalen in Oracle

  3. SQLAlchemy func.count op booleaanse kolom

  4. PostgreSQL - GROUP BY-clausule