Frage

Wir sehen eine Menge von „ORA-00936: fehlendem Ausdruck“ Fehler in unserem Anwendungsprotokoll. Gibt es eine Möglichkeit in Oracle zu bestimmen, welche Aussage (n) versagen?

Ich habe versucht, v $ sql abfragen, aber diese Aussagen nicht in diese Ansicht eingefügt, da sie die Syntaxprüfung nicht passieren.

Unser C # Anwendung verwendet Linq eine Abfrage zu einer Oracle-Datenbank zu generieren. Dies macht es ein bisschen schwierig, die SQL-Abfrage aus der Anwendung zu bekommen. Ich hatte gehofft, ich es nur von Oracle bekommen könnte einfacher.

War es hilfreich?

Lösung

Sie können einen Trigger in Oracle erstellen, die alle Fehler protokolliert (oder so ziemlich alles - NO_DATA_FOUND ist kein Fehler berücksichtigt). In dem folgenden Beispiel ein Fehler in dem Schema in der TRACK_DETAIL Tabelle aufgezeichnet ist (Fehler in einer Zeile, fehlgeschlagen SQL in der nächsten). Sie können mit einer Sequenznummer, Datum / Uhrzeit usw. es anspruchsvollere machen.

create table track_detail (val varchar2(4000));

create or replace procedure track (p_text IN VARCHAR2) IS
  PRAGMA AUTONOMOUS_TRANSACTION;
begin
  insert into track_detail(val)
  values (p_text);
  commit;
end;
.
/
create or replace TRIGGER log_err after servererror on schema
DECLARE
  v_temp VARCHAR2(2000) := substr(dbms_utility.format_error_stack,1,2000);
  v_num NUMBER;
  v_sql_text ora_name_list_t;
begin
  v_temp := translate(v_temp,'''','"');
  track(v_temp);
  v_num  := ora_sql_txt(v_sql_text);
  v_temp := null;
  BEGIN
    FOR i IN 1..v_num LOOP
      v_temp := v_temp || v_sql_text(i);
    END LOOP;
  EXCEPTION
    WHEN VALUE_ERROR THEN NULL;
  END;
  v_temp := translate(v_temp,''''||chr(0)||chr(10),'"');
  track(v_temp);
end;
/

Denken Sie daran, fallen zu lassen (oder zu deaktivieren), um den Auslöser, wenn Sie mit ihm fertig sind.

Andere Tipps

Wenn Sie irgendwie SQL-Ablaufverfolgung aus dem Anwendungscode aktivieren (alte Sitzung Satz SQL_TRACE = true), die Aussagen in den Trace-Dateien auf der Host-Datenbank angezeigt.

Sie könnten versuchen, so etwas wie Wireshark auf dem Port verwendet, um Oracle zu verbinden, um zu sehen, was SQL-Anweisungen gesendet werden. Vielleicht nicht die beste Antwort sein -. Aber es könnte Sie, wo Sie brauchen, schneller zu gehen

Versuchen Sie SQL-Monitoring-Lösung von Kris Vandermotten Blog .

Sie können auch log umleiten mit Datacontext .log Eigenschaft :

using (NorthwindDataContext context = new NorthwindDataContext())
{
  context.Log = Console.Out;
}

Nutzen Sie alle anderen Debugging-Tools wie Linq to Entities Visualizer ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top