Utl_file функция fseek, выдающая ошибку с большим абсолютным смещением? - PullRequest
3 голосов
/ 03 декабря 2010

Мне нужно создать программу, которая будет использовать fseek для чтения данных из позы желудочков.я должен читать данные построчно, а в кружочковой линии я должен использовать fseek для чтения данных.Но когда я использую fseek и absolute_offset имеет большой размер (немного меньше размера файла), он выдает эту ошибку

ORA-29284: file read error
ORA-06512: at "SYS.UTL_FILE", line 219
ORA-06512: at "SYS.UTL_FILE", line 1145
ORA-06512: at line 15"

, но с небольшим значением absolute_offset, например, диапазон 4000 работает правильно и выбирает данные.Строка № 15, где я использую fseek, выдавая ошибку.

DECLARE
  lv_utl UTL_FILE.FILE_TYPE;
  v_buff VARCHAR2(2000);
  l_exists boolean;
  l_block VARCHAR2(2000);
  l_file_length number;
  v_line varchar2(5000);
BEGIN
  UTL_FILE.fgetattr('/d04/data/edi/inbound','POO0001.dat',l_exists,l_file_length,l_block);
  lv_utl := UTL_FILE.FOPEN('/d04/data/edi/inbound','POO0001.dat','R');
  --utl_file.get_line(lv_utl,v_line,50);
  --dbms_output.put_line(v_line);
  --l_file_length:=length();
  dbms_output.put_line(l_file_length);
  utl_file.fseek(lv_utl,1261061);
  utl_file.get_line(lv_utl,v_buff,100);
  dbms_output.put_line(v_buff);
  --lv_msg_txt := 'empno ename job manager hiredate commission salary department_no';
  --UTL_FILE.PUT_LINE(lv_utl,lv_msg_txt);
  --UTL_FILE.PUT_LINE(lv_utl,'------------------------------------------------------------------------------------');
  --UTL_FILE.PUT_LINE(lv_utl,' ');
  --UTL_FILE.FCLOSE(lv_utl);
END;

Ответы [ 2 ]

1 голос
/ 26 января 2011

Я запустил это в своей среде, а также это всплывающее окно.Как ни странно, если я указываю максимальную длину строки на FOPEN, она, кажется, работает правильно.

lv_utl := UTL_FILE.FOPEN('/d04/data/edi/inbound','POO0001.dat','R');

не работает, но

lv_utl := UTL_FILE.FOPEN('/d04/data/edi/inbound','POO0001.dat','R',5000);

работает отлично.У меня нет никаких оснований для этого, но это похоже на ошибку.

В качестве обходного пути вы можете попробовать пакет DBMS_LOB, используя вместо этого BFILE s.

0 голосов
/ 20 декабря 2013

Я сталкивался с этим в прошлом.

Максимальный размер строки равен 1024, если это не указано в вызове FOPEN (как вы сделали это во втором примере выше (с 5000).

Таким образом, Oracle будет утверждать - это ожидаемое поведение, а не ошибка. http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/u_file.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...