Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Как поймать запрос, если поймать его невозможно или "суслика видишь? а он есть!"?  [new]
Apex
Member

Откуда: Made in USSR
Сообщений: 3909
Столкнулись с интересным поведением трассировки (event 10046), а именно: если запрос синтаксически верен, но содержит семантически неверное выражение, то он не попадает в трейс.
Пример
alter session set sql_trace=true;
declare
  sql_text varchar2(1024);
begin
  sql_text := 'select 1/0 from dual';
  execute immediate sql_text;
  exception
    when others then
      null;
end;
/
--смотрим в трейс
................................
=====================
PARSING IN CURSOR #3 len=158 dep=0 uid=203 oct=47 lid=203 tim=1159426504975703 hv=1484905177 ad='5535a85c'
declare
  sql_text varchar2(1024);
begin
  sql_text := 'select 1/0 from dual';
  execute immediate sql_text;
  exception
    when others then
      null;
end;
END OF STMT
PARSE #3:c=0,e=28,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=1159426504975696
=====================
PARSING IN CURSOR #5 len=20 dep=1 uid=203 oct=3 lid=203 tim=1159426504976043 hv=2483580536 ad='56ce9a10'
select 1/0 from dual
END OF STMT
PARSE #5:c=0,e=19,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=1,tim=1159426504976038
EXEC #5:c=0,e=33,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=1,tim=1159426504976183
EXEC #3:c=0,e=310,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=1,tim=1159426504976247
STAT #5 id=1 cnt=0 pid=0 pos=1 obj=0 op='FAST DUAL  (cr=0 pr=0 pw=0 time=4 us)'
=====================
................................

-- все отлично
-- теперь попробуем с функцией
declare
  sql_text varchar2(1024);
begin
  sql_text := 'select to_number(''A'') from dual';
  execute immediate sql_text;
  exception
    when others then
      null;
end;
/
-- смотрим в трейс
................................
=====================
PARSING IN CURSOR #3 len=171 dep=0 uid=203 oct=47 lid=203 tim=1159426504981444 hv=2434254466 ad='55a98654'
declare
  sql_text varchar2(1024);
begin
  sql_text := 'select to_number(''A'') from dual';
  execute immediate sql_text;
  exception
    when others then
      null;
end;
END OF STMT
PARSE #3:c=0,e=22,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=1159426504981437
=====================
PARSING IN CURSOR #5 len=31 dep=1 uid=203 oct=3 lid=203 tim=1159426504981774 hv=2538851690 ad='567f6f30'
select to_number('A') from dual
END OF STMT
PARSE #5:c=0,e=17,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=1,tim=1159426504981768
EXEC #5:c=0,e=20,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=1,tim=1159426504981899
EXEC #3:c=0,e=247,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=1,tim=1159426504981959
STAT #5 id=1 cnt=0 pid=0 pos=1 obj=0 op='FAST DUAL  (cr=0 pr=0 pw=0 time=3 us)'
=====================
................................
-- тоже хорошо
-- а вот теперь вызовем процедуру
declare
  sql_text varchar2(1024);
begin
  sql_text := 'declare i integer; begin i := dbms_sql.execute; end;';
  execute immediate sql_text;
exception
  when others then
    null;
end;
/
-- а что в трейсе?
................................
=====================
PARSING IN CURSOR #5 len=171 dep=0 uid=203 oct=47 lid=203 tim=1159426504984308 hv=3749315387 ad='566d3950'
declare
  sql_text varchar2(1024);
begin
  sql_text := 'select dbms_sql.execute from dual';
  execute immediate sql_text;
  exception
    when others then
      null;
end;
END OF STMT
PARSE #5:c=0,e=23,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=1159426504984302
EXEC #5:c=0,e=863,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=1,tim=1159426504985404
=====================
................................
--и все...
Вот так.

А теперь собственно проблема. Есть некий уродский приклад, который генерит вот такого рода SQL. И пытается его выпонять. Естественно оно у него не получается, что подтверждается ростом статистики parse count (failures). Ошибку, которая должна возникать при этом, чудо-разработчки предпочли игнорировать: ни на консоль, ни в свои логи она не попадает.
Как поймать суслика?:) Может есть какой-нибудь специальный event срабатывающий на событие парсинга, или наоборот - невозможность парсинга?

P.S. А может я не прав? И никакого кривого SQL нет, а статистики parse count (failures) и hard parses растут совсем по другой причине?
-------------------------------------------------------
Автор благодарит алфавит за любезно предоставленные ему буквы.
16 авг 07, 14:50    [4535247]     Ответить | Цитировать Сообщить модератору
 Re: Как поймать запрос, если поймать его невозможно или "суслика видишь? а он есть!"?  [new]
Apex
Member

Откуда: Made in USSR
Сообщений: 3909
Да, если вдруг баян, не сочтите за труд придать пинок в нужном направлении:)
-------------------------------------------------------
Автор благодарит алфавит за любезно предоставленные ему буквы.
16 авг 07, 14:56    [4535294]     Ответить | Цитировать Сообщить модератору
 Re: Как поймать запрос, если поймать его невозможно или "суслика видишь? а он есть!"?  [new]
Andrew Max
Member

Откуда:
Сообщений: 1045
Apex

...
...
...
-- а вот теперь вызовем процедуру
declare
  sql_text varchar2(1024);
begin
  sql_text := 'declare i integer; begin i := dbms_sql.execute; end;';
  execute immediate sql_text;
exception
  when others then
    null;
end;
/
-- а что в трейсе?
................................
=====================
PARSING IN CURSOR #5 len=171 dep=0 uid=203 oct=47 lid=203 tim=1159426504984308 hv=3749315387 ad='566d3950'
declare
  sql_text varchar2(1024);
begin
  sql_text := 'select dbms_sql.execute from dual';
  execute immediate sql_text;
  exception
    when others then
      null;
end;
END OF STMT
PARSE #5:c=0,e=23,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=1159426504984302
EXEC #5:c=0,e=863,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=1,tim=1159426504985404
=====================
................................
--и все...
...


Это в какой версии такое наблюдается?
Попробовал в 9.2.0.6.0 - все нормально.
16 авг 07, 15:34    [4535641]     Ответить | Цитировать Сообщить модератору
 Re: Как поймать запрос, если поймать его невозможно или "суслика видишь? а он есть!"?  [new]
Andrew Max
Member

Откуда:
Сообщений: 1045
Apex
...
FAST DUAL
...

Переформулирую вопрос: какая из десяток именно?
16 авг 07, 15:36    [4535652]     Ответить | Цитировать Сообщить модератору
 Re: Как поймать запрос, если поймать его невозможно или "суслика видишь? а он есть!"?  [new]
Apex
Member

Откуда: Made in USSR
Сообщений: 3909
Извините, что сразу не указал
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Prod
PL/SQL Release 10.2.0.2.0 - Production
CORE	10.2.0.2.0	Production

TNS for Linux: Version 10.2.0.2.0 - Production
NLSRTL Version 10.2.0.2.0 - Production
-------------------------------------------------------
Автор благодарит алфавит за любезно предоставленные ему буквы.
16 авг 07, 15:37    [4535661]     Ответить | Цитировать Сообщить модератору
 Re: Как поймать запрос, если поймать его невозможно или "суслика видишь? а он есть!"?  [new]
Сынок
Member

Откуда:
Сообщений: 44
Apex
Ошибку, которая должна возникать при этом, чудо-разработчки предпочли игнорировать: ни на консоль, ни в свои логи она не попадает.
Как поймать суслика?:) Может есть какой-нибудь специальный event срабатывающий на событие парсинга, или наоборот - невозможность парсинга?


SQL> set echo on
SQL>
SQL> column spid new_value spid
SQL>
SQL> select spid from (select sid from v$mystat where rownum = 1) st, v$process ps, v$session sn where st.sid = sn.sid and sn.paddr = ps.addr;

SPID
------------------------------------
26021

SQL> alter session set events '6550 trace name errorstack level 1';

Session altered.

SQL> declare
  2     sql_text   varchar2 (1024);
  3  begin
  4     sql_text := 'declare i integer; begin i := dbms_sql.execute; end;';
  5     execute immediate sql_text;
  6  exception
  7     when others
  8     then
  9        null;
 10  end;
 11  /

PL/SQL procedure successfully completed.

SQL> ! head -n 70 $ORACLE_BASE/admin/crash/udump/crash_ora_"&SPID".trc
/u01/app/oracle/admin/crash/udump/crash_ora_26021.trc
Oracle9i Enterprise Edition Release 9.2.0.8.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.8.0 - Production
ORACLE_HOME = /u01/app/oracle/product/9.2.0
System name:    Linux
Node name:      parus-rpt
Release:        2.6.9-42.0.3.ELsmp
Version:        #1 SMP Mon Sep 25 17:28:02 EDT 2006
Machine:        i686
Instance name: crash
Redo thread mounted by this instance: 1
Oracle process number: 0
26021

ksdxwinit: initialize OSD requested
*** SESSION ID:(35.38115) 2007-08-16 15:34:09.197
*** 2007-08-16 15:34:09.197
ksedmp: internal or fatal error
ORA-06550: line 1, column 40:
PLS-00306: wrong number or types of arguments in call to 'EXECUTE'
Current SQL statement for this session:
declare i integer; begin i := dbms_sql.execute; end;
----- PL/SQL Call Stack -----
  object      line  object
  handle    number  name
0x1b639404         5  anonymous block
----- Call Stack Trace -----
calling              call     entry                argument values in hex
location             type     point                (? means dubious value)
-------------------- -------- -------------------- ----------------------------
ksedmp()+274         call     ksedst()             0 ? 0 ? 0 ? 0 ? 10000000 ?
                                                   AF62208 ?
ksddoa()+315         call     00000000             1 ? 0 ? 1 ? B48F2C08 ? 0 ?
                                                   B48F2C08 ?
ksdpcg()+467         call     ksddoa()             B48F2BA4 ? AFD728C ?
ksdpec()+196         call     ksdpcg()             1996 ? BFFF8378 ? 1 ?
__PGOSF36_ksfpec()+  call     ksdpec()             1996 ? AF627C0 ? 0 ?
150                                                BFFF83A8 ? 99598ED ?
                                                   AF627C0 ?
kgerbv()+81          call     00000000             AF627C0 ? 1996 ?
kserbc3()+29         call     kgerbv()             AF627C0 ? AFD3F58 ? 1996 ?
                                                   3 ? BFFF83D0 ?
kkxech2()+107        call     kserbc3()            1996 ? 0 ? 1 ? 0 ? 28 ? 1 ?
                                                   42 ? 1B626A4C ?
kkxech()+13          call     kkxech2()            1A51EA68 ? 1 ?
kkxsem()+315         call     kkxech()             1A51EA68 ? 2 ? AFD8A08 ?
                                                   1501A7F4 ? 0 ? 1962CFFC ?
opitca()+6917        call     kkxsem()             1A51EA68 ? 1A51EA68 ?
                                                   1B638710 ? 0 ? B48FBEB4 ? 0 ?
__PGOSF249_kksctca(  call     opitca()             B48FBEB4 ? 1B6370F0 ?
)+16
rpiswu2()+315        call     00000000             BFFF8C6C ? 0 ? 0 ? 0 ?
                                                   BFFF8948 ? BFFF8948 ?
kkslod()+3752        call     rpiswu2()            182CF548 ? 0 ? 1B638740 ? 2 ?
                                                   1B6388B8 ? 0 ? 1B638770 ? 0 ?
                                                   8937144 ? 0 ? BFFF8C6C ? 0 ?
kglobld()+710        call     00000000             AF627C0 ? 1A51EA68 ?
                                                   BFFF92C0 ?
kglobpn()+1477       call     kglobld()            AF627C0 ? 1A51E7F0 ?
                                                   BFFF92C0 ? 196F4B88 ? 0 ?
kglpim()+243         call     kglobpn()            AF627C0 ? 196F4B88 ?
                                                   BFFF92C0 ? 1 ?
kglpin()+970         call     kglpim()             AF627C0 ? BFFF92C0 ?
                                                   196F4B88 ?
kksfbc()+10401       call     kglpin()             AF627C0 ? BFFF92C0 ?
                                                   1978641C ? 1A51EA68 ? 3 ? 0 ?
                                                   B48FBF0C ?
kkspsc0()+885        call     kksfbc()             B48FBEB4 ? 3 ? 108 ?
                                                   AFA7AD4 ? 35 ? 19788C8C ? 0 ?

SQL>

Подойдет?
16 авг 07, 15:38    [4535673]     Ответить | Цитировать Сообщить модератору
 Re: Как поймать запрос, если поймать его невозможно или "суслика видишь? а он есть!"?  [new]
Apex
Member

Откуда: Made in USSR
Сообщений: 3909
Andrew Max
Попробовал в 9.2.0.6.0 - все нормально.

Т.е. в трейсе появляется
PARSE ERROR #...чего-то там
?
-------------------------------------------------------
Автор благодарит алфавит за любезно предоставленные ему буквы.
16 авг 07, 15:38    [4535677]     Ответить | Цитировать Сообщить модератору
 Re: Как поймать запрос, если поймать его невозможно или "суслика видишь? а он есть!"?  [new]
Andrew Max
Member

Откуда:
Сообщений: 1045
Второго релиза под рукой, увы, нет. :(
16 авг 07, 15:39    [4535681]     Ответить | Цитировать Сообщить модератору
 Re: Как поймать запрос, если поймать его невозможно или "суслика видишь? а он есть!"?  [new]
Apex
Member

Откуда: Made in USSR
Сообщений: 3909
Сынок
Подойдет?

Я уже думал над этим, попробовать можно, но нет уверенности, что это именно ORA-6550.
Например
declare
  sql_text varchar2(1024);
begin
  sql_text := 'select dbms_output from dual';
  execute immediate sql_text;
  exception
    when others then
      null;
end;
Приведет к такому же результату, но ошибка уже другая...
-------------------------------------------------------
Автор благодарит алфавит за любезно предоставленные ему буквы.
16 авг 07, 15:43    [4535731]     Ответить | Цитировать Сообщить модератору
 Re: Как поймать запрос, если поймать его невозможно или "суслика видишь? а он есть!"?  [new]
Apex
Member

Откуда: Made in USSR
Сообщений: 3909
Так.. че-то я не то сказал:)
-------------------------------------------------------
Автор благодарит алфавит за любезно предоставленные ему буквы.
16 авг 07, 15:45    [4535752]     Ответить | Цитировать Сообщить модератору
 Re: Как поймать запрос, если поймать его невозможно или "суслика видишь? а он есть!"?  [new]
UK0IAI
Member

Откуда: питер
Сообщений: 13526
Apex
Да, если вдруг баян, не сочтите за труд придать пинок в нужном направлении:)
-------------------------------------------------------
Автор благодарит алфавит за любезно предоставленные ему буквы.


:-)) Кажется Автор выражает благодарность не в той инстанции. Наверно было бы неплохо слегка приподнять уровень, так сказать , соизявления / изявления. Где то у меня адресок вроде как был, люди ботали что сам Ларри иногда освящает это воистину достопочтенейшее местечко. И в самом деле, может так будет лучше?
16 авг 07, 15:45    [4535753]     Ответить | Цитировать Сообщить модератору
 Re: Как поймать запрос, если поймать его невозможно или "суслика видишь? а он есть!"?  [new]
Сынок
Member

Откуда:
Сообщений: 44
Apex
Я уже думал над этим, попробовать можно, но нет уверенности, что это именно ORA-6550.

Придется перебрать все возможные. Другого способа Я не знаю.
16 авг 07, 15:46    [4535768]     Ответить | Цитировать Сообщить модератору
 Re: Как поймать запрос, если поймать его невозможно или "суслика видишь? а он есть!"?  [new]
Andrew Max
Member

Откуда:
Сообщений: 1045
Andrew Max
Попробовал в 9.2.0.6.0 - все нормально.

Сорри, не туда посмотрел.
Ничего нормального и в 9.2.0.6.0.
16 авг 07, 15:48    [4535795]     Ответить | Цитировать Сообщить модератору
 Re: Как поймать запрос, если поймать его невозможно или "суслика видишь? а он есть!"?  [new]
Apex
Member

Откуда: Made in USSR
Сообщений: 3909
Сынок
Apex
Я уже думал над этим, попробовать можно, но нет уверенности, что это именно ORA-6550.

Придется перебрать все возможные. Другого способа Я не знаю.

Да нет, как раз спасибо, по крайней мере, если не поймаем, то будем знать, что это не она:)
16 авг 07, 15:50    [4535817]     Ответить | Цитировать Сообщить модератору
 Re: Как поймать запрос, если поймать его невозможно или "суслика видишь? а он есть!"?  [new]
Apex
Member

Откуда: Made in USSR
Сообщений: 3909
UK0IAI
Apex
Да, если вдруг баян, не сочтите за труд придать пинок в нужном направлении:)
-------------------------------------------------------
Автор благодарит алфавит за любезно предоставленные ему буквы.


:-)) Кажется Автор выражает благодарность не в той инстанции. Наверно было бы неплохо слегка приподнять уровень, так сказать , соизявления / изявления. Где то у меня адресок вроде как был, люди ботали что сам Ларри иногда освящает это воистину достопочтенейшее местечко. И в самом деле, может так будет лучше?

Вы имеете в виду завести SR? Уже:)
Смысл темы был в следующем: поделиться находкой с общественностью, спросить совета в надежде на русскую смекалку:)
16 авг 07, 15:53    [4535842]     Ответить | Цитировать Сообщить модератору
 Re: Как поймать запрос, если поймать его невозможно или "суслика видишь? а он есть!"?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
Apex
А теперь собственно проблема. Есть некий уродский приклад, который генерит вот такого рода SQL.


SQLNET trace?

SY.
16 авг 07, 16:13    [4536013]     Ответить | Цитировать Сообщить модератору
 Re: Как поймать запрос, если поймать его невозможно или "суслика видишь? а он есть!"?  [new]
Elic
Member

Откуда:
Сообщений: 29988
Apex
Смысл темы был в следующем: поделиться находкой с общественностью, спросить совета в надежде на русскую смекалку:)
STFF Информация о пакетах: BTW
16 авг 07, 16:19    [4536074]     Ответить | Цитировать Сообщить модератору
 Re: Как поймать запрос, если поймать его невозможно или "суслика видишь? а он есть!"?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
SY
Apex
А теперь собственно проблема. Есть некий уродский приклад, который генерит вот такого рода SQL.


SQLNET trace?

SY.


Ooops. He в тему ;).

SY.
16 авг 07, 16:25    [4536133]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить