2012-09-04 132 views
5

我需要一個通用方法來在調用過程時獲取運行時參數(值)的列表。我需要類似於返回正在運行的過程的名稱的$$ PLSQL_UNIT。 (plsql Oracle 10g)oracle plsql:在調用過程時檢索運行時參數值

E.g.看看這個示例程序: (它只是輸出它自己的名字和參數)

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

運行程序產生下面的輸出:

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. 

我不會滿足,因爲我不能複製和粘貼在我的所有程序中,因爲我必須對每個過程進行硬編碼以設置其正確的參數變量。

在此先感謝您的幫助。

+1

http://stackoverflow.com/questions/12160928/get-a-parameters-name/的可能重複? – tbone

+0

是的,我認爲這是同一個問題。兩者都沒有答案:(我認爲沒有辦法獲得參數的價值:( – tortugone

+1

我不認爲這是同一個問題。你要求_value_參數而不知道它的名字。正如指出的那樣在一個現在被刪除的答案中,並且在鏈接的問題中,發現參數的名稱很容易,但不是該參數的值。 – Ben

回答

2

無法動態檢索傳遞給Oracle PL/SQL中的過程的參數值。這種語言根本不是爲了處理這種操作而設計的。

順便提一下,在位於包中的過程中,$$PLSQL_UNIT只會返回包的名稱。我發現最好在每個包含過程名稱的過程中定義一致命名的常量。

1

當我需要與您的功能相同的功能時,我沒有找到任何好的內置解決方案。

我所做的是:寫了修改函數/過程/包的原始主體的DB級觸發器。 此觸發器在「開始」動態生成的「user_arguments」代碼片段後立即添加。

另外,在此之後,我將這個代碼包含進這個觸發器中,該代碼記錄發生異常時觸發特效的代碼。

另外,你可以跟蹤procs的調用,以及更多的內部事物。

但是,這種解決方案只適用於預生產,因爲性能顯着下降。

PS。對不起,我的英語不好。

+0

你能發佈你的代碼嗎? – Jesse