2012-09-04 13 views
5

Ich brauche eine verallgemeinerte Methode, um eine Liste der Laufzeitparameter (Werte) zu erhalten, wenn ich eine Prozedur aufrufen. Ich brauche etwas ähnlich dem $$ PLSQL_UNIT, das den Namen der laufenden Prozedur zurückgibt. (plsql Oracle 10 g)Orakel plsql: abrufen Laufzeitparameterwerte beim Aufruf einer Prozedur

z. Blick auf dieses Beispielverfahren: (es gibt einfach seinen eigenen Namen und Parameter)

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; 
/

Verfahren Laufen erzeugt die folgende Ausgabe:

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. 

Ich bin nicht zufrieden, weil ich nicht kopieren kann und fügen Sie alle meine Prozeduren ein, weil ich jede Prozedur fest codieren muss, um ihre richtigen Parametervariablen zu setzen.

Vielen Dank im Voraus für die Hilfe.

+1

möglich duplicate von http://stackoverflow.com/questions/12160928/get-a-parameters-name/? – tbone

+0

Ja, ich denke, es ist die gleiche Frage. Beide ohne Antwort :(Ich denke, es gibt keinen Weg, Wert von Parametern zu erhalten :( – tortugone

+1

Ich glaube nicht, dass es die gleiche Frage ist. Sie fragen nach dem _value_ eines Parameters, ohne zu wissen, dass es der Name ist. Wie bereits erwähnt in einer, jetzt gelöschte, Antwort und in der verknüpften Frage ist die Suche nach dem Namen eines Parameters einfach, aber nicht der Wert dieses Parameters – Ben

Antwort

2

Es ist nicht möglich, die Werte von Parametern, die an eine Prozedur in Oracle PL/SQL übergeben werden, dynamisch abzurufen. Die Sprache ist einfach nicht für diese Art von Operation ausgelegt.

Im Übrigen wird $$PLSQL_UNIT in einer Prozedur, die sich in einem Paket befindet, nur den Namen des Pakets zurückgeben. Ich finde es besser, eine konsistent benannte Konstante in jeder Prozedur zu definieren, die den Namen der Prozedur enthält.

1

Wenn ich die gleiche Funktionalität wie Ihre wollte, fand ich keine gute integrierte Lösung.

Was ich tat ist: schrieb DB-Level-Trigger, die ursprünglichen Körper der Funktion/Verfahren/Paket verändert. Dieser Trigger fügt unmittelbar nach "begin" dynamisch erzeugten Code aus "user_arguments" hinzu.

Außerdem schließe ich in diesem Trigger den Code ein, der Aufrufe von Procs protokolliert, wenn eine Ausnahme auftritt.

Plus, können Sie Procs Anrufe verfolgen, und viele weitere Dinge zu interistieren.

Diese Lösung funktioniert jedoch nur für die Vorproduktion, da die Leistung drastisch abnimmt.

PS. Entschuldigung für mein schlechtes Englisch.

+0

Können Sie Ihren Code posten? – Jesse

Verwandte Themen