Oracle: есть ли способ получить последние ошибки синтаксиса SQL?

Мы видим много ошибок "ORA-00936: отсутствует выражение" в журнале нашего приложения. Есть ли способ в Oracle, чтобы определить, какие операторы не удается?

Я пытался запросить v$sql, но эти операторы не вставляются в это представление, так как они не проходят проверку синтаксиса.

Наше приложение на C# использует Linq для генерации запроса к базе данных Oracle. Это немного затрудняет получение SQL-запроса из приложения. Я надеялся, что смогу просто получить его от Oracle.

4 ответа

Решение

Вы можете создать триггер в Oracle, который будет регистрировать все ошибки (или почти все - NO_DATA_FOUND не считается ошибкой). В приведенном ниже примере любая ошибка в схеме записывается в таблицу TRACK_DETAIL (ошибка в одной строке, ошибка SQL в следующей). Вы можете сделать его более сложным с помощью порядкового номера, даты / времени и т. Д.

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;
/

Не забудьте сбросить (или отключить) триггер, когда вы закончите с ним.

Если вы можете каким-либо образом включить трассировку sql из кода приложения (измените сеанс set sql_trace=true), операторы будут отображаться в файлах трассировки на хосте базы данных.

Вы можете попробовать использовать что-то вроде Wireshark для порта, используемого для подключения к Oracle, чтобы увидеть, какие операторы SQL отправляются. Возможно, это не самый лучший ответ, но он может привести вас туда, куда вам нужно идти быстрее.

Попробуйте решение для мониторинга SQL из блога Kris Vandermotten.

Также вы можете перенаправить журнал с помощью свойства DataContext.Log:

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

Или используйте любые другие инструменты отладки, такие как LInQ to Entities Visualizer...

Другие вопросы по тегам