Announcement

Collapse
No announcement yet.

Jegliche Fehler(meldungen) abfangen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Jegliche Fehler(meldungen) abfangen

    Hallo Forum,

    gibt es eine Möglichkeit, jegliche Fehler(meldungen) von Oracle (11g) bei einer Abfrage zu unterdrücken? Also sämtliche ORA-xxxxx Fehlermeldungen (egal welche und warum).

    Beispiel:
    [highlight=SQL]
    SELECT * FROM tabellegibtesnicht;
    oder
    SÄLÄGD *.* VROM C:\;
    oder
    SELECT * FROM DUAL
    (ohne Semikolon)
    oder
    lkj094rkjksf;
    (irgend ein Käse)
    [/highlight]

    Es soll stattdessen nur eine eigene Fehlermeldung ausgegeben und die Abfrage sauber beendet werden.

    Ich hatte mir überlegt, die ganzen Abfragen jeweils in eine BEGIN END; Klausel einzubetten und dann eine EXCEPTION zu werfen. Z.B. so: [highlight=SQL]
    DECLARE TEMP_VAR DUAL%ROWTYPE;
    BEGIN

    SELECT * INTO TEMP_VAR FROM dual;

    EXCEPTION
    WHEN OTHERS THEN
    dbms_output.put_line('Fehler: '||sqlcode);
    dbms_output.put_line('Fehlertext:'||sqlerrm(sqlcod e));
    END;
    [/highlight]
    Obiges ist OK. Wenn man jetzt aber irgendeinen Fehler einbaut (z.B. SELECT * FROM DUAL; also ohne INTO Klausel), kommt trotzdem noch die normale Fehlermeldung:
    Code:
    FEHLER in Zeile 4:
    ORA-06550: Zeile 4, Spalte 3:
    PLS-00428: an INTO clause is expected in this SELECT statement
    Sollte der Fehler jetzt nicht abgefangen werden und statt dessen die eigene Fehlermeldung erscheinen und der Befehl "an sich" (im Ergebnis) erfolgreich sein (da der Fehler abgefangen wurde und der Block danach keine Fehler enthält)?

    Ein anderes Problem dabei ist, dass das schon wieder PL/SQL ist. D.h. wenn jemand eine "normale" SQL Abfrage (wie das erwähnte SELECT * FROM DUAL; ohne INTO) stellt, dann funktioniert das natürlich nicht. Gibt es vielleicht eine "nicht PL/SQL" Möglichkeit, die Fehler abzufangen?

    Grüße,
    Yusuf

  • #2
    SQL (ohne PL/) hat kein Fehlerhandling, damit musst du leben.

    Wenn du "SELECT * FROM DUAL; (ohne INTO)" schreibst ist das kein gültiges PL/SQL. Wenn du in anderen Sprachen schreibst kannst du falschen Code auch nicht kompilieren.

    Eine Möglichkeit wäre dieses hier:

    [highlight=SQL]
    DECLARE TEMP_VAR DUAL%ROWTYPE;
    BEGIN
    EXECUTE IMMEDIATE 'SELECT * FROM dual' INTO TEMP_VAR;
    EXCEPTION
    WHEN OTHERS THEN
    dbms_output.put_line('Fehler: '||sqlcode);
    dbms_output.put_line('Fehlertext:'||sqlerrm(sqlcod e));
    END;
    [/highlight]

    Die Sache wird natürlich sehr viel komplizierter wenn du die Input- und Output- Parameter vorher nicht kennst.

    Nach dem Sinn für das Ganze frage ich jetzt mal nicht.

    Gruss

    Comment

    Working...
    X