2016-10-25 3 views
0

Ich verwende die Fehlerprotokolltabelle über dbms_errlog.create_error_log für DML-Operationsfehler in Bulk & die ORA_ERR_MESG $ zurück an den Client. Allerdings muss ich den Fehlercode ignorieren, so dass es benutzerfreundlich aussieht.Extrahieren Sie Teil der Zeichenfolge mit REGEXP_SUBSTR

Ex: ORA-01400: kann nicht NULL in einfügen ("ABC_OWNER" "ABC_PART" "REGION"..)

dies geändert werden muss, um "Kann nicht NULL in REGION einfügen"

I habe versucht, REGEXP_SUBSTR nach "ORA-" Muster & Suche einige Extraktion, aber ich habe nur in gewissem Umfang gelungen. Können Sie bitte beraten, wie dies zu tun ist.

Grüße.

+0

Was haben Sie versucht?Außerdem: Sie haben nicht nur den Fehlercode entfernt, Sie haben auch die Nachricht geändert: Sie zeigen nur, in welche Spalte Sie NULL nicht einfügen können, nicht das Schema und die Tabelle. Wird dir das helfen oder sich in Zukunft als schlechte Idee erweisen? – mathguy

+0

Im tatsächlichen Anwendungsfall muss ich das Schema oder die Tabelle nicht anzeigen, da der Benutzer Daten in die Tabelle hochlädt und bereits darüber informiert ist. Der Benutzer muss nur wissen, ob beim Hochladen ein Fehler aufgetreten ist. In meiner Implementierung füge ich Benutzer heraufgeladene Daten in tatsächliche Tabelle zusammen und protokolliere irgendeinen Fehler in der Fehlerprotokolltabelle und gebe diese Fehler zurück, wenn überhaupt. Ich möchte es einfach und lesbar halten, ohne Fehlercodes, Schemennamen etc. Danke – ppatkar

Antwort

1

gibt es eine Menge Ausnahme n Oracle und es gibt verschiedene Masken sind Sie wollen alle von ihnen zu kodieren?

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

EDIT:: Beschreibung regexp ‚^ ORA- \ d +:.

Sie Currenct regexp kann ausgesehen werden.. \ S (. +) (+ \" (+) \ „)‘

  1. "^" - Beginn der Zeichenfolge
  2. "ORA-" - einfache Zeichenkette "ORA-"
  3. "\ d +" - Reihe von Ziffern
  4. ":" - einfacher Doppelpunkt
  5. "\ s" - Leerraum
  6. "(. +)" - die längste Zeichenfolge aller Zeichen. Und () bedeutet, dass wird als Gruppe (\ 1) erfasst werden.
  7. "(" - linke Klammer
  8. "+". - die längste Kette von beliebigen Zeichen
  9. .“. "- einfacher Punkt
  10. \" - doppelte Anführungszeichen
  11. (+) -. Der längste Zeichenkette beliebiger Zeichen und nächste Gruppe (\ 2)
  12. \.“- doppelte Anführungszeichen
  13. )‘ - rechte Klammer

Regexp in Punkte 6,8 und 11 wird h ungry Suche wird es versuchen, die längste Zeichenfolge von der ersten Gruppe zu bestrafen. Es bedeutet, wenn es einige Varianten zwischen der Länge von "6", "8" und "11" gibt. "6" wird zuerst wählen und alles nehmen, was es kann "8" wählt als nächstes und "11" am wenigsten. Zum Beispiel, wenn Sie Zeichenfolge aaaaaa und regexp haben (.+)(.+) die erste Gruppe aaaaa und die zweiten a

+0

Danke Michael. Würde mich wirklich freuen, wenn Sie mir ein bisschen erklären könnten, wie das eigentlich funktioniert. – ppatkar

+0

Danke Michael für die Erklärung. Wenn der Fehler ORA-12899 war: Wert zu groß für Spalte "ABC_OWNER". "ABC_PART". "REGION" (aktuell: 6, maximal: 4), wie können wir dies ändern in: "Wert zu groß für Spalte REGION". Beide können in derselben Regexp-Anweisung enthalten sein. – ppatkar

+1

Ich denke, Sie können versuchen, etwas wie 'regexp_replace ('ORA-12899: Wert zu groß für die Spalte" ABC_OWNER "." ABC_PART "." REGION "(tatsächlich: 6, maximal: 4)' '^ \ s * ORA- \ d +: \ s (. +?) \ (? (\ ". + \" \.)? (\ ". \" \.)? "(. +) \" \)?. * ', '\ 1 \ 4') ' –

0

nehmen Wenn Sie nur den Fehlercode entfernen müssen, dass mit regelmäßigen instr und substr erfolgen, die als normalen schnellen Ausdruck. Aber es hängt davon ab, was Sie wirklich tun müssen (zum Beispiel habe ich hier den ersten Buchstaben nicht großgeschrieben, da Ihre Anforderung wahrscheinlich später noch geklärt wird).

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") 
Verwandte Themen