2015-03-16 6 views
5

W T-SQL, następujące polecenie zwróci nazwę prąd biegu procedury przechowywanej:PL/SQL Kim jestem funkcjonować podobnie do OBJECT_NAME T-SQL jest (@@ PROCID)

OBJECT_NAME(@@PROCID) 

w PL/SQL, po umieszczeniu następującego kodu na procedurze przechowywanej pakietu, zwraca nazwę pakietu nadrzędnego zamiast wykonywania procedury składowanej.

$$PLSQL_UNIT 

Czy istnieje sposób na uzyskanie nazwy procedury wykonawczej w języku PL/SQL?

+0

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 ... –

+0

Oracle Database 11g Enterprise Edition \t 11.2.0.3.0 \t 64bit Produkcja, ale wkrótce będziemy na 12c – ChadD

+0

Widziałeś http://stackoverflow.com/questions/286549/find-out-name-of-pl-sql-procedure? – marcus

Odpowiedz

0

wystarczy zdefiniować stałą nazwą procedury w sekcji DECLARE

whoami CONSTANT VARCHAR2(100) := 'MY_PROCEDURE'; 
+0

po zgłoszeniu się proszę zostawić komentarz; btw. to rozwiązanie ma lepszą wydajność niż wywoływanie funkcji; użyliśmy tego rozwiązania z Oracle 6 ... –

2

Tak, to jest niemożliwe w wersjach przed 12. Jednakże można spróbować hacki.

  1. 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.

  1. 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.

  1. 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.
Powiązane problemy