Tak, to jest niemożliwe w wersjach przed 12. Jednakże można spróbować hacki.
V$SESSION
widok ma PLSQL_ENTRY_SUBPROGRAM_ID
i PLSQL_SUBPROGRAM_ID
pól, które mogą prowadzić do obecnie procedury wykonywania.
Bieżąca sesja to:
select PLSQL_ENTRY_OBJECT_ID,
PLSQL_ENTRY_SUBPROGRAM_ID,
PLSQL_OBJECT_ID,
PLSQL_SUBPROGRAM_ID
from V$SESSION
where AUDSID = sys_context('userenv', 'sessionid')
A potem znaleźć nazwę procedury przez odpytywanie widok ALL_PROCEDURES
:
select PROCEDURE_NAME
from ALL_PROCEDURES
where OBJECT_ID = :objectId
and SUBPROGRAM_ID = :subprogramId
Pogląd ten zawiera funkcje i procedury zadeklarowane w pakietach, ale nie zawiera te, które są zadeklarowane w ciałach pakietowych.
dbms_utility.format_call_stack
pokazuje numer wiersza i nazwę źródła. Analizowane dane wyjściowe można uzyskać za pomocą owa_util.who_called_me
. Wyjściowe dane wyjściowe zawierają także object handle
, które umożliwiają dostęp do kodu źródłowego anonimowego bloku.
dbms_utility.format_call_stack
wyjście próbki:
----- PL/SQL Call Stack -----
object line object
handle number name
B87FEF1C 1 anonymous block
A potem:
select SQL_FULLTEXT from V$SQL where CHILD_ADDRESS = 'B87FEF1C'
Kod źródłowy procedury przechowywane mogą być uzyskane z ALL_SOURCE
.
- Gdy masz kod źródłowy wywołanie metody i numer linii w tym kodzie, można analizować je, aby uzyskać nazwę procedury.
Jedyny zły przykład to jednolinijki. Ale to rzadka sytuacja.
procedure outer is procedure inner is begin whoami; end; begin whoami; end;
Masz informacje, że whoami
został wywołany w tym wierszu. Ale nie wiesz, czy to pierwsze, czy drugie. Zatem nawet analizowanie kodu źródłowego nie doprowadzi cię do dokładnego rozwiązania.
Inne sytuacje mogą być przetwarzane przez parsowanie kodu źródłowego. Here - moja próba.Wykorzystanie próbki:
create package APCKG is
procedure PROC;
end;
/
create package body APCKG is
procedure PROC is
procedure "INNER/proc" is
begin
dbms_output.put_line(p_stack.whoAmI);
end;
begin
"INNER/proc";
end;
end;
/
begin
APCKG.PROC;
end;
wyjściowa: Format
5: YOUR_SCHEMA.PACKAGE BODY APCKG.PROCEDURE PROC.PROCEDURE "INNER/proc"
wyjściowa:
Line number + ': ' + Owner + [ '.' + Type + ' ' + Name ]*
Więc to zwraca tylko ostatniego rozmówcy i jego hierarchii. Jedna procedura wewnątrz drugiej, która znajduje się wewnątrz funkcji, która znajduje się w korpusie opakowania.
Użyj utl_call_stack
, jeśli potrzebujesz dokładnego rozwiązania i masz Oracle 12. To rozwiązanie jest dla poprzednich wersji (testowane na 10.2). Zwróci pierwsze wystąpienie dla przykładu z jednym linkiem powyżej.
UPD:
Mam zmodernizowane to rozwiązanie do pakietu w pełnej skali dla kontroli stosu wywołań. zalety:
- Testowane Oracle 9 (separate package version), 10 i 11.
- Naprawdę analizuje źródło (analiza tj słownikowa, atomizacja itd.).
- Czysty PL/SQL.
- Analizuje anonimowe bloki kodu źródłowego (mogą zawierać również wewnętrzne procedury).
- Zawiera metody podobne do
utl_call_stack
.
- Metody
whoAmI
i whoCalledMe
.
- Obsługa nazw podwójnie cytowanych.
- Obsługuje
q
-notacja dla ciągów.
- Pomija komentarze wieloliniowe i jednokreskowe.
- Pomija procedurę i deklaracje funkcji bez definicji.
Source code.
UPD 2:
- Dodano wsparcie dla kompilacji warunkowej.
UPD 3:
- Wprowadzono backportu przez ORACLE 12 pakietu
utl_call_stack
dla wersji 9,10 and 11.
Która wersja Oracle? Możesz być w stanie zrobić coś z [utl_callstack] (http://tkyte.blogspot.co.uk/2013/06/12c-utlcallstack.html) w 12c; inaczej nie, chyba że masz kod źródłowy pakietu i chcesz dowiedzieć się, skąd jesteś, z numeru linii ... –
Oracle Database 11g Enterprise Edition \t 11.2.0.3.0 \t 64bit Produkcja, ale wkrótce będziemy na 12c – ChadD
Widziałeś http://stackoverflow.com/questions/286549/find-out-name-of-pl-sql-procedure? – marcus