Le chargement d'un fichier dans un clob
Question
Etant donnée une URL pointant vers un fichier hébergé sur le serveur Web, est-il possible de lire le contenu de cette URL dans un clob? Et si oui, comment?
La solution
Voici une procédure qui prend une URL et charge son contenu dans une table.
Le fichier Web est récupéré à l'aide UTL_HTTP.GET_PIECES()
. Cela renvoie un tableau de chaînes. Si vous travaillez derrière un pare-feu, vous devrez déclarer votre procuration. En savoir plus sur UTL_HTTP .
Le CLOB tiraillements utilise différents bits de fonctionnalité DBMS_LOB. La procédure déclare une variable lob temporaire, les pièces du joint tableau UTL_HTTP à lui et puis finalement l'insère dans une table. En savoir plus sur 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, comme moi, vous êtes sur 11g, vous devez ajouter l'URL à une liste de contrôle d'accès, sinon sera bloqué la demande. En savoir plus sur 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>
Après avoir ajouté l'URL StackOverflow à mon ACL je peux maintenant insérer le fichier dans ma table:
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>