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

http://www.oracle-base.com/dba/Script.php?category=miscellaneous&file=ftp.pkb

там процедура

-- --------------------------------------------------------------------------
PROCEDURE list (p_conn  IN OUT NOCOPY  UTL_TCP.connection,
                p_dir   IN             VARCHAR2,
                p_list  OUT            t_string_table) AS
-- --------------------------------------------------------------------------
  l_conn        UTL_TCP.connection;
  l_list        t_string_table := t_string_table();
  l_reply_code  VARCHAR2(3) := NULL;
BEGIN
  l_conn := get_passive(p_conn);
  send_command(p_conn, 'LIST ' || p_dir, TRUE);

  BEGIN
    LOOP
      l_list.extend;
      l_list(l_list.last) := UTL_TCP.get_line(l_conn, TRUE);
      debug(l_list(l_list.last));
      IF l_reply_code IS NULL THEN
        l_reply_code := SUBSTR(l_list(l_list.last), 1, 3);
      END IF;
      IF SUBSTR(l_reply_code, 1, 1) IN ('4', '5') THEN
        RAISE_APPLICATION_ERROR(-20000, l_list(l_list.last));
      ELSIF (SUBSTR(g_reply(g_reply.last), 1, 3) = l_reply_code AND
             SUBSTR(g_reply(g_reply.last), 4, 1) = ' ') THEN
        EXIT;
      END IF;
    END LOOP;
  EXCEPTION
    WHEN UTL_TCP.END_OF_INPUT THEN
      NULL;
  END;
  
  l_list.delete(l_list.last);
  p_list := l_list;
  
  utl_tcp.close_connection(l_conn);
  get_reply (p_conn);
END;                  
-- --------------------------------------------------------------------------

хотелось бы разобраться как это работает

например - зачем написано вот это

IF SUBSTR(l_reply_code, 1, 1) IN ('4', '5') THEN

если имя файла начинается с символа '4' или '5' - выдать ошибку ?
(на это я и напоролся)
4 май 09, 15:19    [7143073]     Ответить | Цитировать Сообщить модератору
 Re: FTP from PL-Sql  [new]
miksoft
Member

Откуда:
Сообщений: 38632
анонимус
IF SUBSTR(l_reply_code, 1, 1) IN ('4', '5') THEN

если имя файла начинается с символа '4' или '5' - выдать ошибку ?
(на это я и напоролся)
а почему вы думаете, что l_reply_code - это имя файла???
4 май 09, 15:23    [7143100]     Ответить | Цитировать Сообщить модератору
 Re: FTP from PL-Sql  [new]
miksoft
Member

Откуда:
Сообщений: 38632
сходите на ftp-сервер обычным консольным клиентом и посмотрите своими глазами что там реально передается.
4 май 09, 15:26    [7143124]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: FTP from PL-Sql  [new]
sworn
Member

Откуда: Point of no return
Сообщений: 127
Добрый вечер!
Видимо с вопросом этим надо было в сисадминские ареалы подаваться. Но в итоге из Окасла надо выйти на FTP( на данный момент хотя бы список файлов получить), делаю так:
+

declare
l_conn utl_tcp.connection := UTL_TCP.OPEN_CONNECTION(remote_host => '192.168.0.5', 
                                                                                     remote_port => 21,
                                                                                     tx_timeout => null) ;
l_data varchar2(2000);
l_res pls_integer;
procedure p(p_str varchar2) is begin dbms_output.put_line (p_str); end;
begin
    
   l_res := UTL_TCP.WRITE_LINE(l_conn, 'USER ftp');
   l_res := UTL_TCP.WRITE_LINE(l_conn, 'PASS ftp');
   l_res := UTL_TCP.write_line(l_conn, 'type a');
   l_res := UTL_TCP.write_line(l_conn, 'pasv');
   l_res := UTL_TCP.write_line(l_conn, 'list'); 
    
   l_res := utl_tcp.read_text(l_conn, l_data, 2000);
   p(l_data);
   utl_tcp.close_connection(l_conn);
    
    exception when others then 
       utl_tcp.close_connection(l_conn);
       raise;
end;


ответ FTP сервака:
220 (vsFTPd 2.0.5)
331 Please specify the password.
230 Login successful.
200 Switching to ASCII mode.
227 Entering Passive Mode (192,168,0,5,160,253)


, все идет по плану, но на команде list вешается в ожидание и ответ от сервера не доходит.
Сознаюсь, с винды с telnet-а лучшего результата не добился(получаю ответ 425), но с любого ftp клиента все без проблем. Следовательно, и из БД та же история:(
С сетями туго, посему прошу совета.
15 дек 11, 18:52    [11774167]     Ответить | Цитировать Сообщить модератору
 Re: FTP from PL-Sql  [new]
sworn
Member

Откуда: Point of no return
Сообщений: 127
sworn
из Окасла
о бл.., в общем с него
15 дек 11, 18:54    [11774171]     Ответить | Цитировать Сообщить модератору
 Re: FTP from PL-Sql  [new]
MazoHist
Guest
Особенность работы FTP в пассивном режиме в том, что данные он будет отдавать на другом порту. вот логи телнета
+ сессия 1

220 Welcome to private FTP service.
user anonymous
331 Please specify the password.
pass wc@
230 Login successful.
pasv
227 Entering Passive Mode (x,x,x,x,217,44).
list
150 Here comes the directory listing.
226 Directory send OK.

+ сессия 2

drwxrws-wt 2 65534 65534 4096 Dec 14 14:16 in
drwxr-xr-x 12 0 65534 4096 Dec 09 22:29 pub

После команды PASV нужно открыть вторую сессию на тот же адрес, на определенный порт. В ответе команды последние 2 числа обозначают порт, на который нужно соединяться за данными. Для его определения нужно первое число умножить на 256 и прибавить второе. После завершения команды соединение на втором порту закрывается. Это если интересно как работает. А так можно посмотреть тынц
15 дек 11, 19:05    [11774211]     Ответить | Цитировать Сообщить модератору
 Re: FTP from PL-Sql  [new]
miksoft
Member

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

В FTP-протоколе передача файлов и результатов команды list проивзодится в отдельном TCP-коннекте, который инициируется или сервером (активный режим), или клиентом (пассивный режим).
См. http://ru.wikipedia.org/wiki/FTP
15 дек 11, 19:06    [11774220]     Ответить | Цитировать Сообщить модератору
 Re: FTP from PL-Sql  [new]
sworn
Member

Откуда: Point of no return
Сообщений: 127
miksoft,MazoHist , огромное спасибо ! более чем доходчиво
15 дек 11, 19:36    [11774416]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить