Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 pl/sql FTP Скачка файла  [new]
dMazay82
Member

Откуда: Тверь
Сообщений: 339
Всем доброго дня.

Недавно начал осваивать сетевые протоколы в Оракле, с помощью UTL_TCP. При работе с FTP столкнулся с проблемой, При заливке файла на сервер все проходит хорошо, но при считывании
файл скачивается не до конца. Может кто то сталкивался с такой проблемой?

Вот примерный код:
declare  
........
  aconn utl_tcp.connection;
  pconn utl_tcp.connection;
  
  p_list      cm_ftp.t_string_table;
  l_amount  PLS_INTEGER;
  l_buffer  VARCHAR2(32767);

BEGIN

        ServerName :='11.111.111.1'; 
        ServerPort :=21; 
        UserName :='user'; 
        Passwrd :='12345';
        ServerFolder :='/iout';
                           
        BEGIN
            aconn := cm_ftp.login(ServerName, ServerPort, UserName, Passwrd);
        EXCEPTION
          WHEN OTHERS THEN
            Cl_Log:=Cl_Log||SQLERRM||';';
            ROLLBACK;
            RETURN;
        END;
        BEGIN
             cm_ftp.nlst(aconn, ServerFolder, p_list);
              EXCEPTION
                WHEN OTHERS THEN
                  Cl_Log:=Cl_Log||SQLERRM||';';
                  cm_ftp.logout(aconn);
                  ROLLBACK;                  
                  RETURN ;
        END;
        
      IF  (p_list.COUNT > 0) THEN
         FOR i IN p_list.FIRST..p_list.LAST LOOP
           l_s_FileNameFtp:=TRIM(SUBSTR(p_list(i),-1*(length(p_list(i))-instr(p_list(i),' ',-1))));
             if ((l_s_FileNameFtp <> '.') AND (l_s_FileNameFtp <> '..')) THEN
              DBMS_OUTPUT.PUT_LINE(i||'='||l_s_FileNameFtp);
              DBMS_LOB.createtemporary (lob_loc => c_result,
                                        cache   => TRUE,
                                        dur     => DBMS_LOB.call);

              pconn := cm_ftp.get_passive(aconn);
              l_result := UTL_TCP.write_line(aconn, 'RETR ' || ServerFolder||'/'||l_s_FileNameFtp);
                           
              BEGIN
                LOOP
                  l_amount := UTL_TCP.read_text (pconn, l_buffer, 1024);
                   dbms_output.put_line(l_buffer);
                  DBMS_LOB.writeappend(c_result, l_amount, l_buffer);
                END LOOP;
              EXCEPTION
                WHEN UTL_TCP.END_OF_INPUT THEN
                  NULL;
                WHEN OTHERS THEN
                  NULL;
              END;
      UTL_TCP.close_connection(pconn);
     END LOOP; 
    END IF;
  END;  
15 сен 10, 09:39    [9440503]     Ответить | Цитировать Сообщить модератору
 Re: pl/sql FTP Скачка файла  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
dMazay82
но при считывании файл скачивается не до конца.
...
              EXCEPTION
                WHEN UTL_TCP.END_OF_INPUT THEN
                  NULL;
                WHEN OTHERS THEN
                  NULL;
              END;
Случайно это не следствие вышеописанной кончтрукции?

15 сен 10, 09:43    [9440525]     Ответить | Цитировать Сообщить модератору
 Re: pl/sql FTP Скачка файла  [new]
dMazay82
Member

Откуда: Тверь
Сообщений: 339
Я так думаю что данный эксепшн должен сработать когда файл полностью считается, и UTL_TCP.read_text вернет NULL.

Или я не прав в случае UTL_TCP??
15 сен 10, 10:07    [9440716]     Ответить | Цитировать Сообщить модератору
 Re: pl/sql FTP Скачка файла  [new]
Быдлокод
Guest
dMazay82
                WHEN OTHERS THEN
                  NULL;
15 сен 10, 10:18    [9440820]     Ответить | Цитировать Сообщить модератору
 Re: pl/sql FTP Скачка файла  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18483
И исключение рождается в dbms_output.put_line(l_buffer) по превышению размера внутреннего буфера или размера строки
15 сен 10, 10:22    [9440848]     Ответить | Цитировать Сообщить модератору
 Re: pl/sql FTP Скачка файла  [new]
dMazay82
Member

Откуда: Тверь
Сообщений: 339
Быдлокод
dMazay82
                WHEN OTHERS THEN
                  NULL;

согласен, лишнее, но туда никогда не попадаем, убрал из кода.
Непомогло
15 сен 10, 10:27    [9440894]     Ответить | Цитировать Сообщить модератору
 Re: pl/sql FTP Скачка файла  [new]
dMazay82
Member

Откуда: Тверь
Сообщений: 339
Вячеслав Любомудров
И исключение рождается в dbms_output.put_line(l_buffer) по превышению размера внутреннего буфера или размера строки


убрал, эффект тот же, считываем меньше, чем размер файла.
15 сен 10, 10:32    [9440934]     Ответить | Цитировать Сообщить модератору
 Re: pl/sql FTP Скачка файла  [new]
Cile
Guest
Уверены что передаете текстовый файл?
Почему бы не воспользоваться готовым решением ftp.pks, ftp.pkb.
15 сен 10, 10:51    [9441110]     Ответить | Цитировать Сообщить модератору
 Re: pl/sql FTP Скачка файла  [new]
dMazay82
Member

Откуда: Тверь
Сообщений: 339
Cile,

Да уверен, качаю xml с данными.
)))) Вот как раз его я и использую, в частности функцию
FUNCTION get_remote_ascii_data (p_conn IN OUT NOCOPY UTL_TCP.connection,
p_file IN VARCHAR2)

Просто всю начинку функции вытащил к себе в процедуру, для чистоты эксперимента
15 сен 10, 11:05    [9441260]     Ответить | Цитировать Сообщить модератору
 Re: pl/sql FTP Скачка файла  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10755
dMazay82
Да уверен, качаю xml с данными.
С "винды на линукс" или как?
15 сен 10, 16:19    [9444489]     Ответить | Цитировать Сообщить модератору
 Re: pl/sql FTP Скачка файла  [new]
dMazay82
Member

Откуда: Тверь
Сообщений: 339
Basil A. Sidorov,
Да с Винды на линукс
15 сен 10, 17:18    [9445150]     Ответить | Цитировать Сообщить модератору
 Re: pl/sql FTP Скачка файла  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10755
dMazay82
Да с Винды на линукс
Ну тогда вычтите из размера число строк.
CRLF -> LF
15 сен 10, 18:53    [9445910]     Ответить | Цитировать Сообщить модератору
 Re: pl/sql FTP Скачка файла  [new]
Андрей Панфилов
Member

Откуда: Москва > Melbourne
Сообщений: 3778
dMazay82,

ппц, используйте жаву, не имейте мозг ни себе ни окружающим
15 сен 10, 20:25    [9446371]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить