2010-05-11 2 views
5

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

ответ

6

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

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

Прерывание CLOB использует различные биты функциональности DBMS_LOB. Процедура объявляет временную переменную lob, добавляет к ней части массива UTL_HTTP и затем, наконец, вставляет ее в таблицу. Find out more about 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 в список контроля доступа, в противном случае запрос будет заблокирован. Find out more about ACLs.

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> 
+0

Это было очень тщательно мой друг. Я очень ценю помощь. – JDS

+0

Я еще не смог проверить код, но решение выглядит очень многообещающим. – migu

Смежные вопросы