вторник, 22 сентября 2015 г.

Write parse failures to alert log file (ORA-10035)

Если нужно временно найти какой-то запрос который выбрасывает ошибку парсинга в приложении, можно воспользоваться следующим event'ом что бы увидеть текст:

oerr ora 10035
10035, 00000, "Write parse failures to alert log file"

Пробуем:

SQL> alter system set events '10035 trace name context forever, level 1';

System altered.

SQL> select 1 form dual;
select 1 form dual
              *
ERROR at line 1:
ORA-00923: FROM keyword not found where expected

SQL> select owner,object_name,count(1) from dba_objects where owner='SYS' group by owner order by 3 desc;
select owner,object_name,count(1) from dba_objects where owner='SYS' group by owner order by 3 desc
             *
ERROR at line 1:
ORA-00979: not a GROUP BY expression

SQL>  alter system set events '10035 trace name context forever, off';

Проверяем наш alert.log:

OS Pid: 9040 executed alter system set events '10035 trace name context forever, level 1'
Tue Sep 22 19:57:01 2015
PARSE ERROR: ospid=9040, error=923 for statement:
Tue Sep 22 19:57:01 2015
select 1 form dual
Additional information: hd=0x150fc6bc8 phd=0x15227b9e0 flg=0x28 cisid=0 sid=0 ciuid=0 uid=0
PARSE ERROR: ospid=9040, error=979 for statement:
Tue Sep 22 19:57:05 2015
select owner,object_name,count(1) from dba_objects where owner='SYS' group by owner order by 3 desc
Additional information: hd=0x15083b580 phd=0x1508160f0 flg=0x20 cisid=0 sid=0 ciuid=0 uid=0
Tue Sep 22 19:58:37 2015
OS Pid: 9040 executed alter system set events '10035 trace name context forever, off'

понедельник, 7 сентября 2015 г.

ORA-01866: the datetime class is invalid

Небольшой пример того как можно получить ORA-01866 при вызове удаленного модуля через database link.
Все действия производим под пользователем test(create session,create database link,create procedure).
Создадим тестовую процедуру с выходным параметром:
SQL> create or replace procedure  test.testproc(vvv out timestamp)
  2  as
  3  begin
  4  null;
  5  return;
  6  end;
  7  /

Procedure created.

Далее создадим database link, для демонстрации, просто на самого себя:
SQL> create database link testlink using '(description=(address_list=(address=(protocol=tcp)(host=localhost)(port=1521)))(connect_data=(server=dedicated)(sid=orcl)))';

Database link created.

И выполним небольшой блок для того что бы получить ошибку:
SQL> declare
  2  myts timestamp;
  3  begin
  4  test.testproc@testlink(myts);
  5  end;
  6  /
declare
*
ERROR at line 1:
ORA-01866: the datetime class is invalid
ORA-06512: at line 4
Конечно, мы специально не присваивали переменной vvv в теле процедуры никаких значений, что и повлекло подобную ошибку при обращении через dblink.
При этом, без dblink'а все работает хорошо:
SQL> declare
  2  myts timestamp;
  3  begin
  4  test.testproc(myts);
  5  end;
  6  /

PL/SQL procedure successfully completed.
Поправим процедуру:
SQL> create or replace procedure  test.testproc(vvv out timestamp)
  2  as
  3  begin
  4  vvv:=null;
  5  return;
  6  end;
  7  /

Procedure created.
И повторим эксперимент:
SQL> declare
  2  myts timestamp;
  3  begin
  4  test.testproc@testlink(myts);
  5  end;
  6  /

PL/SQL procedure successfully completed.
Ошибка больше не возникает.