Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Непонятно, почему возникает ошибка ORA-01438  [new]
Хэнк
Member

Откуда: Днепропетровск
Сообщений: 115
Доброго времени суток, господа.

Нужна ваша помощь в решении проблемы. Периодически, примерно раз в месяц, вываливается ошибка
ORA-01438: value larger than specified precision allowed for this column
Ошибка проявляется при вставке, в следующей процедуре:
  procedure send_event289(
                          event_type VARCHAR2,
                          event_date date,
                          event_value1 VARCHAR2,
                          event_value2 VARCHAR2,
                          event_value3 VARCHAR2
                         )
  is
    m_type_id             pls_integer;
    m_id                  pls_integer;
  begin

    select hi.message_seq.nextval
    into m_id
    from dual;

    m_type_id := get_message_type_id_by_sysname('EVENT289');

    insert into message(id, type_id)
    values (m_id, m_type_id);
    
    -- Others operators
  end;

Функция get_message_type_id_by_sysname возвращает константу из справочника. При повторном запуске ошибка не проявляется. Код процедуры не меняется и выполняется ежедневно как минимум один раз. Симитировать ошибку я не могу, она появляется непредсказуемо.

Вот таблица message:
CREATE TABLE message(
    id                             NUMBER(10,0) NOT NULL,
    type_id                        NUMBER(10,0) NOT NULL,
    message_id                     NUMBER(10,0),
    modif_time                     DATE,
    result_code                    VARCHAR2(4),
    session_id                     NUMBER(10,0)
)
Версия Oracle:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi

Может, кто-то сталкивался. Это может быть баг Oracle ?
17 ноя 09, 11:48    [7938351]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно, почему возникает ошибка ORA-01438  [new]
SQLap
Member [заблокирован]

Откуда:
Сообщений: 34063
Хэнк

Функция get_message_type_id_by_sysname возвращает константу из справочника.


А тип поля константы из справочника какой?
17 ноя 09, 12:02    [7938494]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно, почему возникает ошибка ORA-01438  [new]
Elic
Member

Откуда:
Сообщений: 29991
Хэнк
Ошибка проявляется при вставке, в следующей процедуре:
На таблице могут быть триггера, т.е. это может быть любой столбец, и даже другая таблица.
17 ноя 09, 12:11    [7938591]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно, почему возникает ошибка ORA-01438  [new]
Хэнк
Member

Откуда: Днепропетровск
Сообщений: 115
Триггер на таблице есть, но это вряд ли он. У меня есть цепочка вызовов, предшествующих ошибке. В процедуре более высокого уровня стоит exception,
который гасит ошибки с их протоколированием, с помощью dbms_utility.format_error_backtrace. Если бы это был триггер - тогда был бы текст

ORA-04088: error during execution of trigger ...

Его нет. Цепочка вызовов обрывается на процедуре, которую я указал в топике

По поводу типа поля константы в справочнике - тот же number(10, 0) :


CREATE TABLE message_type(
     id                             NUMBER(10,0) NOT NULL,
17 ноя 09, 12:50    [7939018]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно, почему возникает ошибка ORA-01438  [new]
Elic
Member

Откуда:
Сообщений: 29991
Хэнк
Если бы это был триггер - тогда был бы текст
Это исключает только другие таблицы. Остаются другие столбцы, в том числе и опосредовано через триггер.
17 ноя 09, 12:55    [7939056]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно, почему возникает ошибка ORA-01438  [new]
Хэнк
Member

Откуда: Днепропетровск
Сообщений: 115
Elic
Хэнк
Если бы это был триггер - тогда был бы текст
Это исключает только другие таблицы. Остаются другие столбцы, в том числе и опосредовано через триггер.

Другие столбцы таблицы триггером не меняются, ни явно, ни опосредовано. В триггере просто идет insert в другую таблицу, где мы храним историю изменений
17 ноя 09, 13:16    [7939239]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно, почему возникает ошибка ORA-01438  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
Sounds like a typical package initialization error. Your session calls package for the first time - package initialization block starts and raises ORA-01438. Next call to package does not cause initialization block to run - therefore no error. For example:

SQL> create package pkg1
  2    is
  3        x pls_integer;
  4  end;
  5  /

Package created.

SQL> create package body pkg1
  2    is
  3    begin
  4        x := 9999999999;
  5  end;
  6  /

Package body created.

SQL> exec dbms_output.put_line(pkg1.x);
BEGIN dbms_output.put_line(pkg1.x); END;

*
ERROR at line 1:
ORA-01426: numeric overflow
ORA-06512: at "SCOTT.PKG1", line 4
ORA-06512: at line 1


SQL> exec dbms_output.put_line(pkg1.x);
0

PL/SQL procedure successfully completed.

SQL> 

So look through package initialization block.

SY.
18 ноя 09, 19:04    [7947194]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно, почему возникает ошибка ORA-01438  [new]
Хэнк
Member

Откуда: Днепропетровск
Сообщений: 115
SY, thanks for the answer. It seems to me, it does not explain my case. In a package in which there is an error, there is no initialization block. Besides, if the problem was in it, I would see it to what returns dbms_utility.format_error_backtrace? In our reports I see

ORA-01438: value larger than specified precision allowed for this column
ORA-06512: at "HI.P_CZ_HOMER_INTERFACE", line 864
...

The line 864 is a line

insert into message (id, type_id)

which I specified above
23 ноя 09, 16:18    [7965656]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно, почему возникает ошибка ORA-01438  [new]
Хэнк
Member

Откуда: Днепропетровск
Сообщений: 115
Я пока сделал так. Буду автоматически снимать трассу при каждом выполнении процедуры, пока опять не поймаю эту ошибку. Процедура выполняется один раз в день, вечером. Может, будет больше информации для анализа
23 ноя 09, 16:22    [7965697]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно, почему возникает ошибка ORA-01438  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18398
Ловить просто: сделайте
    id                             NUMBER NOT NULL,
    type_id                        NUMBER  NOT NULL,
и смотрите, в какой именно атрибут запишется "левое" значение.
А ежели не запишется но снова стрельнет - сталбыть, Elic прав и дело все-таки в триггере
23 ноя 09, 16:25    [7965734]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно, почему возникает ошибка ORA-01438  [new]
Хэнк
Member

Откуда: Днепропетровск
Сообщений: 115
andrey_anonymous
Ловить просто: сделайте
    id                             NUMBER NOT NULL,
    type_id                        NUMBER  NOT NULL,
и смотрите, в какой именно атрибут запишется "левое" значение.
А ежели не запишется но снова стрельнет - сталбыть, Elic прав и дело все-таки в триггере

Вы имеете в виду - анализировать переменные m_id, m_type_id непосредственно перед вставкой ? Тоже вариант.
23 ноя 09, 16:55    [7965984]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно, почему возникает ошибка ORA-01438  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
Хэнк,

чего бы Вам не завернуть Ваш insert в
begin 
  ... 
exception 
  when others then 
    if sqlcode = -1438 then 
      ... 
    end if; 
end;

А там - логируйте значения переменных, проверяйте их...
23 ноя 09, 18:26    [7966519]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Непонятно, почему возникает ошибка ORA-01438  [new]
RodeRebel
Member

Откуда:
Сообщений: 153
ORA-01438: value larger than specified precision allowed for this column
А как внутри хранимой функции определить точное указание ошибки, т.е. с указанием поля или значения вызывающую ошибку?

У меня тоже самая ошибка, а строка возбуждающая этой ошибки, довольно длинная команда ввода.
INSERT INTO TB_DOCMN ( DO_ID, DO_TYPE, DO_USER, DO_NDOC, DO_LSCL, DO_LSCR, DO_COR, DO_MFOC, DO_DZRG, DO_NUMBT, DO_NMCR, DO_NZPL, DO_CNZPL, DO_SUM, DO_DTD, DO_DTV.....

А если я получаю техт команды и запускаю отдельно на Toad, то она выделяет не помещающуюся значение и выделяет.

К сообщению приложен файл. Размер - 27Kb
15 дек 14, 12:34    [16998192]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно, почему возникает ошибка ORA-01438  [new]
yens_gjytk
Member

Откуда: Samara/Saratov
Сообщений: 69
RodeRebel,

'12.12.2014 02:20:19 №100005'


Сие выглядит весьма подозрительно
15 дек 14, 12:38    [16998219]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно, почему возникает ошибка ORA-01438  [new]
Elic
Member

Откуда:
Сообщений: 29991
RodeRebel
А как внутри хранимой функции определить точное указание ошибки, т.е. с указанием поля или значения вызывающую ошибку?
RTFM DBMS_SQL.LAST_ERROR_POSITION (FAQ)
15 дек 14, 13:22    [16998469]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно, почему возникает ошибка ORA-01438  [new]
RodeRebel
Member

Откуда:
Сообщений: 153
yens_gjytk,
-- '12.12.2014 02:20:19 №100005'
-- Сие выглядит весьма подозрительно
Да, в принципе, проблема не в самой ошибке,
а в том, чтобы блок Exception сможет ли указать точную ошибку
т.е.,
не просто вернуть ошибку,
ORA-01438: value larger than specified precision allowed for this column
(строку ошибки тоже легко получит.)
а чтобы указал на значение не отвечающую на ограничение из списка значений
или имя поле на которого идет ошибочное значение
типа, error Value='100005' или error on Field='SomeField'
15 дек 14, 13:38    [16998601]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно, почему возникает ошибка ORA-01438  [new]
RodeRebel
Member

Откуда:
Сообщений: 153
Elic,

спасибо я попробую, потом отпишусь
15 дек 14, 13:40    [16998621]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно, почему возникает ошибка ORA-01438  [new]
RodeRebel
Member

Откуда:
Сообщений: 153
Я опишу подробнее:
создадим таблицу и функцию:
create table vr_test3(id number(1), f1 varchar2(10));

CREATE OR REPLACE FUNCTION f_sometest ( pID number, pF1 varchar2, resStr in out varchar2) RETURN NUMBER IS
BEGIN
resStr :='';
insert into vr_test3 (id, f1) values (pID, pF1);--123456789, '12345678901');
commit;
RETURN 0;
EXCEPTION
WHEN NO_DATA_FOUND THEN NULL;
WHEN OTHERS THEN
RollBack;
resStr := ResStr|| 'f_sometest. Others. '|| Trim(DBMS_UTILITY.format_error_backtrace) ||' '|| substr(SQLERRM,1,1000);
Return sqlcode;-- -999;
END f_sometest;
/

Теперь выполним с функцию не вмещаемыми параметрами:
Сначала с проблемой varchar2 поле
Declare res NUMBER; ret NUMBER; resStr VARCHAR2(4000) ;
begin
ret := 0; res := 1; resStr := '’;
ret := f_sometest(res, '12345678901', resstr);
dbms_output.put_line('Res:'||resstr ||' ret='||to_char(ret));
end;
/
Res:f_sometest. Others. ORA-06512: at "RVB.F_SOMETEST", line 4
ORA-12899: value too large for column "RVB"."VR_TEST3"."F1" (actual: 11, maximum: 10) ret=-12899
Т.е. ошибка показывает поле.

Теперь с проблемой number поле:
Declare res NUMBER; ret NUMBER; resStr VARCHAR2(4000) ;
begin
ret := 10000012; res := 1; resStr := '’;
ret := f_sometest(res, '123456789012', resstr); -- select * from vr_test3
dbms_output.put_line('Res:'||resstr ||' ret='||to_char(ret));
end;
/
Res:f_sometest. Others. ORA-06512: at "RVB.F_SOMETEST", line 4
ORA-01438: value larger than specified precision allowed for this column ret=-1438

Вот тут не возможно определить поле, с какой происходит проблема ввода, если поля с типом Number десятки.
15 дек 14, 14:08    [16998816]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно, почему возникает ошибка ORA-01438  [new]
0_000011
Guest
Люди, можете пояснить пожалуйста как так?
$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.4.0 - Production on Tue Mar 3 20:08:54 2015

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, Data Mining and Real Application Testing options

SQL> DROP TABLE atest;
DROP TABLE atest
           *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> CREATE TABLE atest(a number(2,2));

Table created.

SQL> INSERT INTO atest (a) VALUES(3.1);
INSERT INTO atest (a) VALUES(3.1)
                              *
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column


SQL> DROP TABLE atest;

Table dropped.

SQL> CREATE TABLE atest(a number(4,2));

Table created.

SQL> INSERT INTO atest (a) VALUES(3.1);

1 row created.

SQL> select * from atest;

         A
----------
       3.1

SQL> 
3 мар 15, 17:13    [17338711]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно, почему возникает ошибка ORA-01438  [new]
Elic
Member

Откуда:
Сообщений: 29991
0_000011
Люди, можете пояснить пожалуйста как так?
number(2,2)
Что может быть непонятного в "Две значащих цифры, из них две после запятой"?
3 мар 15, 17:20    [17338772]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно, почему возникает ошибка ORA-01438  [new]
0000)))
Guest
Elic
0_000011
Люди, можете пояснить пожалуйста как так?
number(2,2)
Что может быть непонятного в "Две значащих цифры, из них две после запятой"?


SQL> DROP TABLE atest;

Table dropped.

SQL> CREATE TABLE atest(a number(2,2));

Table created.

SQL> INSERT INTO atest (a) VALUES(22.22);
INSERT INTO atest (a) VALUES(22.22)
                              *
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column


SQL> 
3 мар 15, 17:26    [17338810]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно, почему возникает ошибка ORA-01438  [new]
Elic
Member

Откуда:
Сообщений: 29991
0000))), ты совсем тупой?
3 мар 15, 17:28    [17338815]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно, почему возникает ошибка ORA-01438  [new]
000_000!
Guest
Elic
0000))), ты совсем тупой?

Elic, пожалуйста ткни в доку.
два знака до запятой, два после...не?
3 мар 15, 17:30    [17338827]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно, почему возникает ошибка ORA-01438  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
000_000!
два знака до запятой, два после...не?

Не. Всего две значащих цифры, обе после запятой. 22,22 не подходит.
3 мар 15, 17:35    [17338858]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно, почему возникает ошибка ORA-01438  [new]
Elic
Member

Откуда:
Сообщений: 29991
000_000!
Elic, пожалуйста ткни в доку.
два знака до запятой, два после...не?
Сперва продемонстрируй способность читать на русском языке:
Elic
"Две значащих цифры, из них две после запятой"
3 мар 15, 17:37    [17338872]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить