18 Mayıs 2009 Pazartesi

PLSQL kullanarak merkez bankası doviz kurlarını internetten alabilir miyim?

Bu makalede belirli bir URL üzerinden
plsql kullanarakdosya transferini
anlatıyorum. Sonraki yazımda merkez bankası döviz
kurlarını bir tabloya insert etme örneğini
gerçekleştireceğiz.

PLSQL ile web uzerinden bir url iceriğinin alınması
için UTL_HTTP paketi kullanılabilir.
Aşağıdaki örnekte merkez bankası günlük döviz
kurları internet üzerinden alınmaktadır.
Bu şekilde herhangibir html,xml vb. tür dosya
alınabilir.

DECLARE
gelen_data_ utl_http.html_pieces;
alinan_sayfa_ NUMBER;
gelen_data_textClob_ CLOB;
--xml parse ile ilgili degiskenler
l_parser dbms_xmlparser.Parser;
l_doc dbms_xmldom.DOMDocument;
l_nl dbms_xmldom.DOMNodeList;
l_n dbms_xmldom.DOMNode;
l_temp VARCHAR2(1000);
TYPE tab_type IS TABLE OF PAR_CURRENCY_RATES%ROWTYPE;
t_tab tab_type := tab_type();
l_nodemap DBMS_XMLDOM.domnamednodemap;
l_attr_node DBMS_XMLDOM.domnode;
--xml parse ile ilgili degiskenler
BEGIN
--http://www.tcmb.gov.tr/kurlar/today.xml den gunluk doviz kurlari aliniyor
--http://www.tcmb.gov.tr/kurlar/today.xml den gunluk doviz kurlari aliniyor
gelen_data_ := utl_http.request_pieces('http://www.tcmb.gov.tr/kurlar/today.xml', 100);
dbms_output.put_line(gelen_data_.count || ' pieces were retrieved.');
dbms_output.put_line('with total length ');
IF gelen_data_.count < 1
THEN dbms_output.put_line('0');
ELSE dbms_output.put_line
((2000 * (gelen_data_.count - 1)) + length(gelen_data_(gelen_data_.count)));
END IF;
--dbms_output.put_line(gelen_data_(1));
alinan_sayfa_ := 1;
gelen_data_textClob_ := NULL;
IF gelen_data_.count > 0 THEN
LOOP
gelen_data_textClob_ := gelen_data_textClob_ || gelen_data_(alinan_sayfa_);
alinan_sayfa_ := alinan_sayfa_ + 1;
--dbms_output.put_line('sayfa : '||alinan_sayfa_);
IF alinan_sayfa_ = gelen_data_.count + 1 THEN
EXIT;
END IF;
END LOOP;
END IF;
dbms_output.put_line(gelen_data_textClob_);
--http://www.tcmb.gov.tr/kurlar/today.xml den gunluk doviz kurlari aliniyor
--http://www.tcmb.gov.tr/kurlar/today.xml den gunluk doviz kurlari aliniyor
END;

Oracle 11g kullanıyorsanız yukarıdaki blok hata verecektir.
ORA-24247: network access denied by access control list (ACL)

Oracle 11g ile gelen ek güvenlik dolayısıyla eğer
11g kullanıyorsanız aşağıdaki kodları çalıştırarak
almak istediğiniz dosya ve url yi ACL içerisine
eklemelisiniz.Burada "DEVELOPER", yetki verilmek
istenilen oracle user dır.

begin
dbms_network_acl_admin.create_acl (
acl => 'today.xml',
description => 'merkez bankasi gunluk doviz kurlari',
principal => 'DEVELOPER',
is_grant => true,
privilege => 'connect',
start_date => null,
end_date => null
);
end;

begin
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(acl => 'today.xml',
principal => 'DEVELOPER',
is_grant => true,
privilege => 'resolve');
end;

begin
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(acl => 'today.xml',
host => 'www.tcmb.gov.tr');
end;

Bu güvenlik sistemi ile ilgili ayrıntılı bilgi için aşağıdaki
linki inceleyebilirsiniz.

http://johanlouwers.blogspot.com/2009/01/ora-24247-network-access-denied-by.html

Eğer başarıyla yetki verdiyseniz aşağıdaki SQL
çalıştığında sonuçlar arasında today.xml yer alacaktır.

select * from dba_network_acl_privileges

Hiç yorum yok:

Yorum Gönder