2016-10-25 21 views
0

我通過dbms_errlog.create_error_log爲DML操作錯誤的批量使用錯誤日誌表&將ORA_ERR_MESG $返回給客戶端。不過,我需要忽略錯誤代碼,所以它看起來很人性化。使用REGEXP_SUBSTR提取字符串的一部分

例如: ORA-01400:無法將NULL插入( 「ABC_OWNER」 「ABC_PART」, 「區」。)

這需要更改爲 「無法插入空進區」

我已嘗試REGEXP_SUBSTR搜索「ORA-」模式&做一些提取,但我已經成功了一定程度。 你可以請告知如何做到這一點。

問候。

+0

你試過了什麼?另外:您不僅刪除錯誤代碼,還更改了消息:只顯示不能插入NULL的列,而不顯示模式和表。這會幫助你還是未來證明是一個壞主意? – mathguy

+0

在實際的用例中,我不需要顯示模式或表,因爲用戶正在將數據上傳到表中並且已經知道它。用戶只需要知道上傳過程中是否有錯誤。在我的實現中,我將用戶上傳的數據合併到實際表中,並在錯誤日誌表中記錄任何錯誤,並返回這些錯誤的返回(如果有的話)。我只是想保持簡單和可讀,沒有錯誤代碼,架構名稱等。謝謝 – ppatkar

回答

1

oracle有很多異常,並且有不同的掩碼是你想要對它們全部進行編碼嗎?

您均流的正則表達式可以看起來像:

select regexp_replace('ORA-01400: cannot insert NULL into ("ABC_OWNER"."ABC_PART"."REGION")' 
        ,'^ORA-\d+:\s(.+)\(.+\.\"(.+)\"\)', '\1 \2') from dual 

編輯:。的regexp的「^ ORA- \ d +描述:\ S(+)(+ \「(+)\ 「)」

  1. 「^」 - 開始字符串
  2. 的 「ORA-」 - 簡單的字符串 「ORA-」
  3. 「\ d +」 - 一系列數字
  4. 「:」 - 簡單冒號
  5. 「\ s」 - 空格
  6. 「(。+)」 - 任何字符中最長的字符串。並且()表示將被捕獲爲組(\ 1)。
  7. 「(」 - 左括號
  8. 「+」 - 任何的最長的字串
  9. 。」 「 - 簡單點
  10. \」 - 雙引號
  11. (+) - 中的任何字符最長的字符串和下一組(\ 2)
  12. \」 - 雙引號
  13. )」 - 右括號

正則表達式中的點6,8和11將爲h不尋常的搜索它會嘗試罰款從第一組最長的字符串。這意味着如果在「6」,「8」和「11」的長度之間存在一些變體。 「6」將首先選擇,然後將「8」接下來選擇的項目和「11」項選擇最少。 舉例來說,如果你有串aaaaaa和正則表達式(.+)(.+)第一組將採取aaaaa和第二a

+0

謝謝邁克爾。如果你能解釋一下這個實際的工作原理,會非常感激。 – ppatkar

+0

感謝邁克爾的解釋。如果錯誤是ORA-12899:對於列「ABC_OWNER」,「ABC_PART」,「REGION」(實際:6,最大值:4)而言值太大,我們如何將其更改爲:「對於列REGION」值過大。都可以用相同的正則表達式語句覆蓋。 – ppatkar

+1

我認爲你可能會嘗試類似'regexp_replace('ORA-12899:對於「ABC_OWNER」列的值太大「ABC_PART」。「REGION」(實際:6,最大值:4)' '^ \ s * ORA- \。+「\。(。+)」(。+)\「\)?。*', '\ 1 \ 4')' –

0

如果你只需要刪除錯誤代碼,可與常規instrsubstr,這比普通快完成表達。但這取決於你真正需要做什麼(例如,在這裏我沒有打擾首字母大寫,因爲你的需求可能會在晚些時候被澄清)。

with 
    error_messages (str) as (
     select 'ORA-01400: cannot insert NULL into ("ABC_OWNER"."ABC_PART"."REGION")' 
     from dual 
    ) 
select substr(str, instr(str, ' ') + 1) as modified_err_msg from error_messages 
; 

MODIFIED_ERR_MSG 
---------------- 
cannot insert NULL into ("ABC_OWNER"."ABC_PART"."REGION")