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:
SQL> alter session set plscope_settings='IDENTIFIERS:ALL';
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!