Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка при работе с типом Clob 
V
    Опции темы
AleksandraN
Дата 9.9.2010, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 11.8.2009
Где: Пермь

Репутация: нет
Всего: нет



Доброго времени суток!
Проблема такая: читаю данные из поля таблицы в БД типа Clob построчно следующим образом:
Код


FUNCTION READ_DATA
RETURN INTEGER
is
  vBuffer      VARCHAR2 (1);
  l_amount     number := 1;
  l_pos        number := 1;
  srcClob      clob;
  l_clob_len   number;
begin

 select pat_xml, dbms_lob.GETLENGTH(pat_xml)
   into srcClob, l_clob_len
 from job
 where job_id= 742;

 WHILE l_pos < l_clob_len loop
      l_amount := DBMS_LOB.INSTR ( srcClob, End_Str, l_pos, 1);

      dbms_lob.read(srcClob, l_amount, l_pos, vBuffer);

      -- utl_file.putf(out_file,vBuffer);
       l_pos := l_amount+1;
 end loop;

 RETURN 1;
END READ_DATA;



End_Str constant varchar2(2) :=chr(13)||chr(10);  

Возникает ошибка: OracleError #21560 in the target program.
В чем дело понять не могу... заранее спасибо за помощь.
PM MAIL   Вверх
Zloxa
Дата 9.9.2010, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата

OCI-21560:
argument string is null, invalid, or out of range
Cause:  The argument is expecting a non-null, valid value but the argument value passed in is null, invalid, or out of range. Examples include when the LOB/FILE positional or size argument has a value outside the range 1 through (4GB - 1), or when an invalid open mode is used to open a file, etc.
Action:  Check your program and correct the caller of the routine to not pass a null, invalid or out-of-range argument value.

Переводить надо?

Цитата(AleksandraN @  9.9.2010,  13:25 Найти цитируемый пост)
l_amount := DBMS_LOB.INSTR ( srcClob, End_Str, l_pos, 1);

что, по Вашему, должно происходить, если искомая подстрока вдруг не найдена?
Цитата(AleksandraN @  9.9.2010,  13:25 Найти цитируемый пост)
End_Str constant varchar2(2) :=chr(13)||chr(10);  

замените просто на chr(10)


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
blednykhap
Дата 10.9.2010, 06:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 23.8.2010

Репутация: нет
Всего: нет



Если не поможет предыдущий пост предлагаю попробовать, в случае если
Код
 l_amount := DBMS_LOB.INSTR ( srcClob, End_Str, l_pos, 1); 

больше 32000, читать 
Код
 dbms_lob.read(srcClob, l_amount, l_pos, vBuffer); 

не за один раз, а с разбивкой в цикле с шагом меньше 32000.
      

      

Это сообщение отредактировал(а) blednykhap - 10.9.2010, 06:33
PM MAIL   Вверх
AleksandraN
Дата 10.9.2010, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 11.8.2009
Где: Пермь

Репутация: нет
Всего: нет



Описание ошибки я прочитать догадалась) 
От этого мне стало ещё более непонятно... пыталась отловить ошибку дебаггером, l_amount нормально присваивается, то есть конец строки находится...на первом шаге цикла это число равно l_amount = 46, что гораздо меньше 32000... 
l_pos = 1, srcClob тоже заполнен...

Добавлено через 4 минуты и 45 секунд
Посимвольно считывает... а по нескольку не хочет :(
PM MAIL   Вверх
Zloxa
Дата 10.9.2010, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



AleksandraN, я повторяю свой вопрос. Что должно происходить, когда искомая подстрока не найдена?
Цитата(AleksandraN @  10.9.2010,  08:37 Найти цитируемый пост)
на первом шаге цикла

А на последнем? Ёшкин кот!
или Вы уверены что у вас все клобы заканчиваются перводом строки?

И еще. Обратите внимание на размер заданного Вами буфера.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Zloxa
Дата 10.9.2010, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(AleksandraN @  9.9.2010,  13:25 Найти цитируемый пост)
l_pos := l_amount+1;

еще вот тут ошибка
Код

SQL> declare
  2    srcClob clob := 'Первая строка'||chr(10)||'Вторая строка';
  3    vBuffer      VARCHAR2 (2048);
  4    l_amount     number;
  5    l_pos        number := 1;
  6    l_clob_len   number := dbms_lob.getlength(srcClob);
  7  begin
  8     loop
  9        l_amount := DBMS_LOB.INSTR ( srcClob, chr(10), l_pos, 1)-l_pos;
 10        if l_amount <= 0
 11        then
 12          l_amount := l_clob_len - l_pos + 1;
 13        end if;
 14        exit when l_amount <= 0;
 15        if l_amount > 2048
 16        then
 17          raise_application_error(-20001,'Строка слишком длинна и не помещается в буфере');
 18        end if;
 19        dbms_lob.read(srcClob, l_amount, l_pos, vBuffer);
 20        dbms_output.put_line(vBuffer);
 21        l_pos := l_pos + l_amount +1;
 22     end loop;
 23  end;
 24  /
 
Первая строка
Вторая строка
 
PL/SQL procedure successfully completed



Это сообщение отредактировал(а) Zloxa - 10.9.2010, 09:56


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
AleksandraN
Дата 10.9.2010, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 11.8.2009
Где: Пермь

Репутация: нет
Всего: нет



спасибо))

вообще ошибка возникала из-за того, что у меня  vBuffer VARCHAR2 (1),  ну и l_pos...
в общем ещё раз спасибо))
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0781 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.