Загрузка файла в clob

Учитывая URL, указывающий на файл, размещенный на веб-сервере, действительно ли возможно считать содержание того URL в clob? И если так, как?

5
задан APC 11 May 2010 в 20:33
поделиться

1 ответ

Вот процедура, которая принимает URL и загружает его содержимое в таблицу.

Веб-файл извлекается с помощью UTL_HTTP.GET_PIECES(). Это возвращает массив строк. Если вы работаете за брандмауэром, вам необходимо объявить свой прокси-сервер. Узнайте больше о UTL_HTTP.

При работе с CLOB используются различные части функциональности DBMS_LOB. Процедура объявляет временную переменную lob, добавляет к ней фрагменты массива UTL_HTTP и, наконец, вставляет их в таблицу. Узнайте больше о DBMS_LOB.

SQL> create or replace procedure pop_file_from_url
  2      (p_url in varchar2)
  3  is
  4      tc clob;
  5      lv_web_page utl_http.html_pieces;
  6  begin
  7
  8      dbms_lob.createtemporary(tc, true);
  9      dbms_lob.open(tc, dbms_lob.lob_readwrite);
 10
 11      lv_web_page := utl_http.request_pieces (p_url);
 12
 13      for i in 1..lv_web_page.count()
 14      loop
 15          dbms_lob.writeappend(tc, length(lv_web_page(i)) ,lv_web_page(i));
 16      end loop;
 17
 18      insert into t23 values (1, tc);
 19
 20      dbms_lob.close(tc);
 21      dbms_lob.freetemporary(tc);
 22
 23  end pop_file_from_url;
 24  /

Procedure created.

SQL> 

Если вы, как и я, работаете на 11g, вам нужно добавить URL в список контроля доступа, иначе запрос будет заблокирован. Узнайте больше об ACL.

SQL> exec pop_file_from_url('stackoverflow.com')
BEGIN pop_file_from_url('stackoverflow.com'); END;

*
ERROR at line 1:
ORA-29273: HTTP request failed
ORA-06512: at "SYS.UTL_HTTP", line 1674
ORA-24247: network access denied by access control list (ACL)
ORA-06512: at "APC.POP_FILE_FROM_URL", line 11
ORA-06512: at line 1


SQL> 

После добавления URL для StackOverflow в мой ACL я могу теперь вставить файл в мою таблицу:

SQL> exec pop_file_from_url('stackoverflow.com')

PL/SQL procedure successfully completed.

SQL> select id, dbms_lob.getlength(txt)
  2  from t23
  3  /

        ID DBMS_LOB.GETLENGTH(TXT)
---------- -----------------------
         1                  208226

SQL>
6
ответ дан 14 December 2019 в 13:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: