Oracle: есть ли способ получить последние ошибки синтаксиса SQL? - PullRequest
5 голосов
/ 12 августа 2010

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

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

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

Ответы [ 4 ]

5 голосов
/ 13 августа 2010

Вы можете создать триггер в 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;
/

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

2 голосов
/ 12 августа 2010

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

1 голос
/ 12 августа 2010

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

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

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

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

1 голос
/ 12 августа 2010

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

...