Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Abrufen einer Liste privater Prozeduren/Funktionen aus einem Paketkörper

Die Natur privater Funktionen ist, dass sie privat sind. Es gibt keine Datenwörterbuchansichten, die sie standardmäßig verfügbar machen. USER_PROCEDURES und USER_ARGUMENTS zeigen nur Informationen für öffentliche Prozeduren (diejenigen, die in einer Paketspezifikation definiert sind.

Wir können jedoch Informationen über sie mit PL/SCOPE erhalten, aber dies erfordert ein wenig zusätzlichen Aufwand:

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

Jetzt können Sie Ihre privaten Programmeinheiten mit dieser Abfrage finden:

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 
);

Um die Argumente einer privaten Prozedur zu erhalten, fügen Sie die USAGE_ID aus der vorherigen Abfrage in diese Abfrage ein:

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
/

Dies muss ein linker Join sein, da user_identifiers hat Datentypeinträge für skalare Datentypen (Zeichen, Zahl, Datum, Clob), aber keine komplexen Datentypen (xmltype, benutzerdefinierte Typen).

Wir können viele Informationen über Prozeduren von PL/SCOPE erhalten, obwohl es nicht so einfach ist wie die Abfrage von USER_PROCEDURES oder USER_ARGUMENTS (tatsächlich ist es überraschend klobig). Finde mehr heraus. Beachten Sie, dass PL/SCOPE-Daten im SYSAUX-Tablespace gespeichert werden, also geraten Sie nicht in heißes Wasser mit Ihrem DBA!