Natura funkcji prywatnych polega na tym, że są prywatne. Nie ma widoków słowników danych, które domyślnie je uwidaczniają. USER_PROCEDURES i USER_ARGUMENTS pokazują tylko informacje dotyczące procedur publicznych (tych zdefiniowanych w specyfikacji pakietu 0).
Możemy jednak uzyskać informacje o nich za pomocą PL/SCOPE, ale wymaga to trochę dodatkowego wysiłku:
SQL> alter session set plscope_settings='IDENTIFIERS:ALL';
SQL> alter package your_package compile body;
Teraz możesz znaleźć swoje prywatne jednostki programu za pomocą tego zapytania:
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
);
Aby uzyskać argumenty procedury prywatnej, podłącz USAGE_ID z poprzedniego zapytania do tego zapytania:
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
/
To musi być lewe dołączenie, ponieważ user_identifiers
zawiera wpisy typu danych dla skalarnych typów danych (znak, liczba, data, klob), ale nie złożone typy danych (xmltype, typy zdefiniowane przez użytkownika).
Możemy uzyskać wiele informacji o procedurach z PL/SCOPE, mimo że nie jest to tak proste jak odpytywanie USER_PROCEDURES lub USER_ARGUMENTS (w rzeczywistości jest to zaskakująco niezgrabne). Dowiedz się więcej. Należy pamiętać, że dane PL/SCOPE są przechowywane w przestrzeni tabel SYSAUX, więc nie wchodź do gorącej wody z DBA!