2010-05-11 28 views
5

Dada una url que apunta a un archivo alojado en el servidor web, ¿es posible leer los contenidos de esa url en un clob? Y si es así, ¿cómo?Cargando un archivo en un clob

Respuesta

6

Aquí hay un procedimiento que toma una URL y carga su contenido en una tabla.

El archivo web se recupera utilizando UTL_HTTP.GET_PIECES(). Esto devuelve una matriz de cadenas. Si trabajas detrás de un firewall, deberás declarar tu proxy. Find out more about UTL_HTTP.

La disputa CLOB utiliza varios bits de la funcionalidad DBMS_LOB. El procedimiento declara una variable lob temporal, agrega las piezas de la matriz UTL_HTTP y luego la inserta en una tabla. 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> 

Si, como yo, usted está en 11g tendrá que añadir la URL a una lista de control de acceso, de lo contrario se bloqueará la solicitud. 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> 

Después de añadir la dirección URL de Stackoverflow a mi ACL ahora puedo insertar el archivo en mi mesa:

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

Eso fue muy minucioso mi amigo. Realmente aprecio la ayuda. – JDS

+0

No he podido probar el código todavía, pero la solución parece muy prometedora. – migu

Cuestiones relacionadas