- This probably isn't a good idea on a busy server, as it might block
- Requires PL/PythonU
- Requires an App ID from openexchangerates.org, which is free (US base currency only)
A Function To Make An HTTP Request
create or replace function http_get(url text) returns text strict volatile language plpythonu AS $$
import urllib2;
return urllib2.urlopen(url).read();
$$;
A Function to Return a Monetary Amount in USD
CREATE TABLE exchange_rates_usd
(
counter_currency char(3),
close_date date,
midmarket_rate numeric(19,10) NOT NULL,
PRIMARY KEY (counter_currency, close_date)
);
create function usd(amount numeric(19,4), _counter_currency char(3), _close_date date = current_date) returns numeric(19,4) language plpgsql strict volatile as $$
declare
result numeric(19,4);
response json;
begin
select
midmarket_rate
from exchange_rates_usd
where
counter_currency = _counter_currency
and close_date = _close_date
into result;
if found then return amount / result; end if;
response = http_get( format('https://openexchangerates.org/api/historical/%s.json?app_id=%s', _close_date, current_setting('my.OPENEXCHANGERATES_APP_ID') ) );
insert into exchange_rates_usd (counter_currency, close_date, midmarket_rate)
select
rates.key::char(3)
, _close_date
, rates.value::text::numeric(19,10)
from json_each(response->'rates') rates;
select
midmarket_rate
from exchange_rates_usd
where
counter_currency = _counter_currency
and close_date = _close_date
into result;
return amount / result;
end $$;
The Output
/* you can set this value in postgresql.conf as well: */
set my.OPENEXCHANGERATES_APP_ID = 'whatever your app id is';
select usd(100, 'CAD', '2014-08-14');
91.66
No comments:
Post a Comment