Регистрация Забыли пароль?
Логин
Пароль
Запомнить меня
Вход через ВКонтакте
Главная > Статьи > ORA-01461 один из путей исправления

ORA-01461 один из способов исправления

Сегодня я словил ошибку ORA-01461. Для повторения используйте следующий код


create table table1 (

 field1 varchar2(4000 byte)

);

 

declare

  -- максимальний размер для

  -- varchar2 в PL/SQL

  l_txt1 varchar2(32767) :=

      lpad('*', 32767, '*');

  -- максимальний размер для 

  -- varchar2 в SQL

  l_txt2 varchar2(4000) :=

    substr(l_txt1, 1, 4000);

begin

  -- на етой коменде получаем ORA-01461

  -- стреляет как как длина переменной больше 

  -- чем длина поля field1 (обяснение ниже)

  insert into table1(field1)

  values(substr(l_txt1, 1, 4000));

 

  -- но при использовании переменной с правильно

  -- длинной все будет нормально

  insert into table1(field1)

  values(substr(l_txt1, 1, 4000));

end;

/

 

drop table table1;

Когда я увидел сообщение об ошибке то первім делом глянул на структуру таблицы, но не увидел там ни единого LONG поля. Было несколько varchar2(4000 byte) полей. Подозревая проблему в превишении длины поля я попробовал заменить substr на substrb но безрезультатно, после етого я попытался спользовать локальную переменную и проблема исчезла.

Но в чем была проблема? Немного погуглив я нашел обяснение на Oracle Forum. Насколько я понял из обяснений: когда Oracle связывает пременные, то не выполняет функцию substr перед вычислением длинны переменной, в результате "думает" что длина переменной 32767 но такака ето превишает максимальную длину для SQL в 4000 то Oracle решает использовать LONG тип, что и призводит к ошибке. При использовании локальной переменной связывание происходит правильно и используеться переменная типа varchar2 вместо long.

Надеюсь комуто поможет
Удачи
Сергей

Вы можете добавить коментарий на етой странице или на странице форума тут.Постов 6.

Последний комментарий

09.07.2016
If your artelcis are always this helpful, "I'll be back."
Игорь
31.03.2016
Спасибо, помогло разобраться.
Владимир
26.11.2014
спасибо!

Имя*E-mail
Код*