11 февр. 2011 г.

Получить актуальные курсы валют по HTTP

Нам необходимо реализовать механизм получение актуальных курсов валют национального банка, доступного из нашей базы данных. в нашем примере, это будет НБУ (Национальный банк Украины). НБУ предоставляет источник, актуальных курсов валют в виде XML-документа, доступного по адресу http://bank-ua.com/export/currrate.xml, нам остается загрузить этот документ и распарить его.

XML-документ представляет собой следующую структуру:

<?xml version="1.0" encoding="windows-1251"?> 
<chapter>
<item>
<date>2011-02-11</date>
<code>036</code>
<char3>AUD</char3>
<size>100</size>
<name>австралійських доларів</name>
<rate>797.0465</rate>
<change>-5.3082</change>
</item>
</chapter>

На первом этапе, пытаемся получить данные с сервера по HTTP протоколу, для этого будем использовать стандартный пакет UTL_HTTP. Потом при помощи механизмов работы с XML, парсим полученный ответ и возвращаем результирующий курсор. Вместо курсора, может быть любая друга обработка данных, загрузка в таблицы, рассылка на почтовые адреса и т.д.
Процедура, которая получилась в итоге

CREATE OR REPLACE PROCEDURE GetCurrencyRate (
p_Cursor out sys_refcursor
) IS
v_Result CLOB;
v_Request UTL_HTTP.Req;
v_Response UTL_HTTP.Resp;
v_Block VARCHAR2(6000);
BEGIN
-- устанавливаем ожидание ответа равным 10 секунд
UTL_HTTP.Set_Transfer_Timeout(10);
-- делаем запрос по указанному URL
v_Request := UTL_HTTP.Begin_Request('http://bank-ua.com/export/currrate.xml');
-- устанавливаем соответствующую кодировку ответа
UTL_HTTP.Set_Body_Charset(v_Request, 'windows-1251');
-- получаем ответ
v_Response := UTL_HTTP.Get_Response(v_Request);
-- читаем блоками полученный ответ
begin
loop
v_Result := v_Result || v_Block;
UTL_HTTP.Read_Text(v_Response, v_Block);
end loop;
exception
when UTL_HTTP.End_Of_Body then
null;
end;
-- завершаем запрос и ответ
UTL_HTTP.End_Response(v_Response);
-- получаем ответ в результирующий курсор
open p_Cursor for
select
extract(value(t),'//date/text()').getStringVal() as CurrencyDate
,extract(value(t),'//code/text()').getStringVal() as CurrencyCode
,extract(value(t),'//char3/text()').getStringVal() as CurrencyChar3
,extract(value(t),'//size/text()').getStringVal() as CurrencySize
,extract(value(t),'//name/text()').getStringVal() as CurrencyName
,extract(value(t),'//rate/text()').getStringVal() as CurrencyRate
,extract(value(t),'//change/text()').getStringVal() as CurrencyChange
from table(xmlsequence(xmltype(v_Result).extract('chapter/item'))) t;

END GetCurrencyRate;

1 комментарий:

  1. Анонимный03.02.2022, 20:23

    1xbet korean sports betting, deposit, and withdrawal
    1xbet korean sports betting, deposit, and withdrawal - Find out how to withdraw money, withdraw winnings, best odds on slots, roulette and many other games on 1xbet ставки

    ОтветитьУдалить