Trong 12c, tên chương trình con hiện tại chỉ là:
utl_call_stack.subprogram(1)(2);
Gói hiện tại cũng có thể được lấy từ
utl_call_stack.subprogram(1)(1);
nhưng nhìn chung sẽ dễ dàng hơn nếu chỉ sử dụng $$plsql_unit
. Bạn cũng có thể lấy tên đủ điều kiện (package.procedure
) như:
utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(1));
Tuy nhiên , Tôi không thể nghĩ ra bất kỳ tình huống nào mà một thủ tục hoặc hàm (hoặc phương thức đối tượng) lại muốn có tên riêng của nó. Chức năng này chủ yếu hữu ích trong quy trình ghi nhật ký, trong trường hợp đó, 'ai đã gọi cho tôi?' mã phải ở trong trình ghi và không được lặp lại trong mọi thứ gọi nó. Do đó, tôi thực sự khuyên bạn nên tránh bất kỳ 'tôi là ai?' logic trong các thủ tục. Thay vào đó, hãy đặt một cái gì đó như thế này vào trình ghi nhật ký của bạn (yêu cầu 12.1 trở lên):
create or replace procedure logdemo
as
k_calling_package constant varchar2(128) := utl_call_stack.subprogram(2)(1);
k_calling_subprog constant varchar2(128) := utl_call_stack.subprogram(2)(2);
begin
dbms_output.put_line
( $$plsql_unit ||
' called from package '||k_calling_package||', subprogram '||k_calling_subprog );
end logdemo;
Thật không may, nó phức tạp hơn một chút trong 11g vì bạn phải phân tích cú pháp dbms_utility.format_call_stack
và vì điều này chỉ cung cấp cho bạn tên gói và số dòng (trong chuỗi văn bản được phân tách bằng nguồn cấp dữ liệu theo dòng), sau đó bạn phải truy vấn all_source
để tìm tên chương trình con.
Tôi có thể đăng một số mã 11g nếu bạn làm rõ nó để làm gì. Trong trình ghi nhật ký 11g của mình, tôi thấy hữu ích khi nắm bắt dbms_utility.format_error_backtrace
cũng như dbms_utility.format_call_stack
tùy thuộc vào sqlcode
vv, do đó, có một loạt logic cụ thể để ghi nhật ký, bạn có thể không cần đến nếu bạn chỉ muốn nắm bắt tên thủ tục hiện tại vì một số lý do khác.