Bản chất của các chức năng riêng là chúng mang tính riêng tư. Không có chế độ xem từ điển dữ liệu nào hiển thị chúng theo mặc định. USER_PROCEDURES và USER_ARGUMENTS chỉ hiển thị thông tin cho các thủ tục công khai (những thủ tục được xác định trong thông số gói0.
Tuy nhiên, chúng tôi có thể lấy thông tin về chúng bằng PL / SCOPE, nhưng làm như vậy cần thêm một chút nỗ lực:
-
SQL> alter session set plscope_settings='IDENTIFIERS:ALL';
-
SQL> alter package your_package compile body;
Giờ đây, bạn có thể tìm thấy các đơn vị chương trình riêng của mình bằng truy vấn sau:
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
);
Để nhận các đối số của một thủ tục riêng tư, hãy cắm USAGE_ID từ truy vấn trước đó vào truy vấn này:
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
/
Đây cần phải là liên kết bên trái vì user_identifiers
có các mục nhập kiểu dữ liệu cho các kiểu dữ liệu vô hướng (ký tự, số, ngày tháng, khối) nhưng không phải là các kiểu dữ liệu phức tạp (kiểu xml, các kiểu do người dùng xác định).
Chúng tôi có thể nhận được rất nhiều thông tin về các thủ tục từ PL / SCOPE, mặc dù nó không dễ dàng như truy vấn USER_PROCEDURES hoặc USER_ARGUMENTS (trên thực tế, nó rất khó hiểu). Tìm hiểu thêm. Lưu ý rằng dữ liệu PL / SCOPE được lưu trữ trên không gian bảng SYSAUX, vì vậy, đừng dính vào nước nóng với DBA của bạn!