2012-09-04 15 views
5

Potrzebuję uogólnionej metody, aby uzyskać listę parametrów wykonawczych (wartości) podczas wywoływania procedury. Potrzebuję czegoś podobnego do $$ PLSQL_UNIT, która zwraca nazwę uruchomionej procedury. (Oracle 10g plsql)oracle plsql: pobieranie wartości parametrów środowiska wykonawczego podczas wywoływania procedury

E.g. spojrzeć na tą procedurą próbkowania: (to po prostu drukuje własną nazwę i parametry)

CREATE OR REPLACE PROCEDURE MY_PROC(ow in varchar2, tn IN varchar2) 
IS 

BEGIN 
    dbms_output.put_line('proc_name: '||$$PLSQL_UNIT||' parameters: '|| ow||' '||tn ); 

    EXCEPTION 
    WHEN OTHERS THEN 
     DBMS_OUTPUT.PUT_LINE('ERRORE: ' ||SQLERRM); 

END MY_PROC; 
/

procedurę bieganie daje następujące wyjście:

SQL> 
    1 BEGIN 
    2  IBAD_OWN.MY_PROC('first_par', 'second_par'); 
    3 END; 
    4/

proc_name: MY_PROC parameters: first_par second_par 

PL/SQL procedure successfully completed. 

Ja nie spełniają, bo nie można kopiować i wklej do wszystkich moich procedur, ponieważ muszę mocno zakodować każdą procedurę, aby ustawić odpowiednie zmienne parametrów.

Z góry dziękujemy za pomoc.

+1

możliwy duplikat adresu http://stackoverflow.com/questions/12160928/get-a-parameters-name/? – tbone

+0

tak, myślę, że to to samo pytanie. Oba bez odpowiedzi :(Myślę, że nie ma sposobu na uzyskanie wartości parametrów :( – tortugone

+1

Nie wydaje mi się, że jest to to samo pytanie: Pytasz o _wartości parametru bez znajomości jego nazwy. w a, teraz usunięta, odpowiedź iw połączonym pytaniu znalezienie nazwy parametru jest łatwe, ale nie wartość tego parametru – Ben

Odpowiedz

2

Nie jest możliwe dynamiczne pobieranie wartości parametrów przekazanych do procedury w Oracle PL/SQL. Język po prostu nie jest przeznaczony do obsługi tego rodzaju operacji.

Nawiasem mówiąc, w procedurze znajdującej się w pakiecie, $$PLSQL_UNIT zwróci tylko nazwę pakietu. Uważam, że lepiej jest zdefiniować stałą o stałej nazwie w każdej procedurze, która zawiera nazwę procedury.

1

Gdy potrzebowałem tej samej funkcjonalności co Twoja, nie znalazłem dobrego wbudowanego rozwiązania.

Co zrobiłem: napisałem wyzwalacz poziomu DB, który modyfikuje oryginalne ciało funkcji/procedury/paczki. Ten wyzwalacz dodaje natychmiast po "rozpocznij" dynamicznie generowany fragment kodu od "user_arguments".

Plus, po tym włączam do tego wyzwalacza kod, który rejestruje wywołania proców, gdy wystąpi wyjątek.

Ponadto można śledzić wywołania proców i wiele innych interwencji.

Ale to rozwiązanie działa dobrze tylko w przypadku przedprodukcji, ponieważ wydajność dramatycznie spada.

PS. Przepraszam za mój zły angielski.

+0

Czy możesz napisać swój kod? – Jesse

Powiązane problemy