Как отыскать ошибку при трассировке ?

KSN
Дата: 08.06.2006 22:55:11
Сильно не пинайте за такой вопрос, но все же. Есть приклад который работает с базой, окошечки и все такое. Вообщем вылетает ошибка ORA-..... мол не верны поля таблицы.Но не могу найти, что за запрос не верен. В Тоде включаю трассировку этой сессии (кнопочка зеленая). Запускаю приклад, он вываливется с ошибкой ORA-.. Останавливаю трассировку. Натравливаю на файл трассировки tkprof (как тут http://www.sql.ru/faq/faq_topic.aspx?fid=389 )

Но кроме статистики ничего не вижу. Какие-то левые селекты. Может они конечно не левые, но не похожи на тот селект на котором вылетает приклад (по моим предположениям). Возможно ли сделать трассировку сесси так, что бы я мог увидить, что шли такие-то селекты у этой сессии, и на таком-то селекте появилась такая-то ошибка ????
andrey_anonymous
Дата: 08.06.2006 23:08:28
KSN
Натравливаю на файл трассировки tkprof (как тут http://www.sql.ru/faq/faq_topic.aspx?fid=389 )
Но кроме статистики ничего не вижу. Какие-то левые селекты.

Зачем Вам tkprof?
Ошибку ищите по неформатированной трассе.
С неверными колонками вообще все просто:
SQL> create table ane_test(a number);

Table created

SQL> alter session set events='10046 trace name context forever, level 4';

Session altered

SQL> select * from ane_test where b=1;

select * from ane_test where b=1

ORA-00904: "B": invalid identifier

SQL> select x from ane_test where a=1;

select x from ane_test where a=1

ORA-00904: "X": invalid identifier

SQL> logoff
Ищем в трассе слово "ERROR":

....
=====================
PARSE ERROR #6:len=35 dep=0 uid=179 oct=3 lid=179 tim=11857352557311 err=904
select x from ane_test where a=1
=====================
....
=====================
PARSE ERROR #6:len=35 dep=0 uid=179 oct=3 lid=179 tim=11857352557311 err=904
select x from ane_test where a=1
=====================
....
KSN
Дата: 08.06.2006 23:10:52
аааа.. так вот как :)) Вообщем надо искать PARSE ERROR . Это и будет какая-нибуть ошибка ORA- у сессии. Я правильно понял ?
andrey_anonymous
Дата: 08.06.2006 23:14:17
KSN
аааа.. так вот как :)) Вообщем надо искать PARSE ERROR . Это и будет какая-нибуть ошибка ORA- у сессии. Я правильно понял ?

Если у Вас именно синтаксическая ошибка - то да.

Я, кстати, дважды одно и то же скопипастил. Естественно, было два разных запроса, и первый звучал как
=====================
PARSE ERROR #6:len=35 dep=0 uid=179 oct=3 lid=179 tim=11857340404923 err=904
select * from ane_test where b=1
=====================
KSN
Дата: 08.06.2006 23:19:58
Про второй запрос я понял ). А вот тогда если будет какая-нибуть другая ORA- (или еще какие-то проблемы у сесии). Как тогда вычислять? Потому как везде пишут, мол трассируйте сессию и там все видно :) Ну я вот смотрю туда и мало что вижу, а мануалах в Инете везде все одно и то же, как включить как выключить.
andrey_anonymous
Дата: 08.06.2006 23:22:00
KSN
какая-нибуть ошибка ORA- у сессии.

Обратите, кстати, внимание на забавное совпадение:

select x from ane_test where a=1

ORA-00904: "X": invalid identifier
и в трассе:
PARSE ERROR #6:len=35 dep=0 uid=179 oct=3 lid=179 tim=11857352557311 err=904
KSN
Дата: 08.06.2006 23:26:07
ДА, в самом деле странное совпадение Спасибо огромное за подсказки !!! Но все же что с вопросом " А вот тогда если будет какая-нибуть другая ORA- (или еще какие-то проблемы у сесии). Как тогда вычислять?" Просто из ваших слов что видна будет синтаксическая ошибка. А если будет другая ошибка-проблема какие тогда будут коды, ну или как это видно будет при трассировке. Где про это почитать ????
andrey_anonymous
Дата: 08.06.2006 23:31:54
SQL> var x number;
SQL> exec :x:=1;

PL/SQL procedure successfully completed
x
---------
1

SQL> select * from dual where 1/:x>0;

DUMMY
-----
X
x
---------
1

SQL> exec :x:=0;

PL/SQL procedure successfully completed
x
---------
0

SQL> select * from dual where 1/:x>0;

select * from dual where 1/:x>0

ORA-01476: divisor is equal to zero
x
---------
0

SQL> 

Трасса level 4:

=====================
(4) PARSING IN CURSOR #6 len=33 dep=0 uid=179 oct=3 lid=179 tim=11858808465418 hv=1833570660 ad='47dcdea8'
select * from dual where 1/:x>0 -- Вот он наш запрос.
END OF STMT
PARSE #6:c=0,e=247,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=3,tim=11858808465408
(3) BINDS #6:
 bind 0: dty=2 mxl=22(22) mal=00 scl=00 pre=00 oacflg=01 oacfl2=0 size=24 offset=0
   bfp=ffffffff7ce34978 bln=22 avl=01 flg=05
   value=0 -->нашли бинд. Ищем назад PARSING IN CURSOR #6
(2) EXEC #6:c=0,e=180,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=3,tim=11858808466146 --> нашли. Вот тут оно рвануло. Ищем назад BINDS #6
(1) ==>ERROR #6:err=1476 tim=1214341986 --> ищем назад подстроку #6
=====================
KSN
Дата: 08.06.2006 23:39:05
Отлично, теперь на много стало понятней !!!!Один только вопросик, как это вы так быстро такой красивый пример и привели. И офрмлен потрясающе. Неужели слету, вот так. Или заранее дока была какая-нибуть ?
andrey_anonymous
Дата: 08.06.2006 23:42:13
KSN
Отлично, теперь на много стало понятней !!!!Один только вопросик, как это вы так быстро такой красивый пример и привели. И офрмлен потрясающе. Неужели слету, вот так. Или заранее дока была какая-нибуть ?

Не понял вопроса.
Оформление - стандартный копипаст из sql*plus и из файла трассировки + мои комментарии.
Тривиальные тесткейсы делаются "на коленке" за пару минут.