2013-12-09 27 views
2

那麼有可能獲得當前的代碼行嗎?Oracle pl/sql代碼行(行)到變量

1,2,3,4 v_variable :=(get_line or something???) and in variable are value 4? 
5,6,7,8,9 v_variable :=(get_line or something???) and in variable are value 9? 

我只是想找到捉蟲子 感謝最簡單的方法。

1,2,3,4, code lines... 
+0

'找到趕上bugs'您需要更詳細地說明一點點自己的情況最簡單的方法。你想要捕捉什麼樣的錯誤以及在什麼情況下。如果你不隱藏引發異常的行號,通過在調用'raise'或'raise_application_error()'函數的異常部分重新提升它,oracle會爲你提供確切的行號。 –

+0

當其他人raise_application_error(-20001,l_cur_cl || SQLERRM)那就是這樣,因爲不是所有時候oracle提供的行號...... – user2879235

回答

7

所以是有可能得到當前代碼行?

是的,這是可能的。從Oracle 10g中$$PLSQL_LINE查詢指令開始可用於代碼返回行數,其中出現$$PLSQL_LINE

SQL> declare 
    2 l_cur_cl pls_integer; 
    3 begin 
    4 l_cur_cl := $$PLSQL_LINE; 
    5 dbms_output.put_line('Line #: '|| to_char(l_cur_cl) || chr(13) 
    6       || 'Current line #: '|| to_char($$PLSQL_LINE)); 
    7 end; 
    8/

輸出:

Line #: 4 
Current line #: 6 
PL/SQL procedure successfully completed 
+0

這不需要他在每一行後面打印/存儲行號以便幫助他跟蹤錯誤? – Adarsh

+0

不是所有行,但是在很多地方都是...... thx – user2879235

+0

@Adarsh爲了能夠稍後使用該行號,是的,它需要將指令的結果存儲在變量中。但是這種方法對異常跟蹤來說不是一個好的選擇(如果這是OP的最終目標)。您必須在可能在同一行或前一行中引發異常的語句之前放置「$$ PLSQL_LINE」。 –

2

神諭異常處理系統可以幫助你做什麼你需要。您可以不用手動獲取行號,而是引發和處理用戶定義的異常或系統異常,並在異常塊中使用以下代碼來獲取發生錯誤的lin編號。

DBMS_UTILITY.FORMAT_ERROR_BACKTRACE

閱讀這篇文章,以獲取更多信息和示例。

http://www.oracle.com/technetwork/issue-archive/2005/05-mar/o25plsql-093886.html

+0

是的,當涉及到追蹤異常時,毫無疑問,這是一個可行的方法。不過,這個小小的改正。如果我們需要在PL/SQL塊的異常部分中得到一個產生異常的行號,調用'DBMS_UTILITY.FORMAT_ERROR_BACKTRACE'將是一個更好的選擇。 –

+0

@NicholasKrasnov謝謝你指出。我提供了DBMS_UTILITY.FORMAT_ERROR_BACKTRACE的鏈接,並在DBMS_UTILITY.FORMAT_ERROR_STACK中鍵入。 – Adarsh