XTR_BIU_MARKET_PRICES_T
BEFORE INSERT or UPDATE on XTR_MARKET_PRICES
FOR EACH ROW
--
Type
BEFORE EACH ROW
Event
INSERT OR UPDATE
Column
When
Referencing
REFERENCING NEW AS NEW OLD AS OLD
Body
declare
l_hce NUMBER;
l_old_base_hce_rate NUMBER;
l_date DATE := SYSDATE;
l_mid_usd_rate NUMBER;
l_home_ccy VARCHAR2(15);
l_basis VARCHAR2(1);
l_rounding_factor NUMBER;
usd_hce_rate NUMBER;
--
cursor HOME_CCY is
select p.PARAM_VALUE,b.USD_QUOTED_SPOT,b.DIVIDE_OR_MULTIPLY
from XTR_PRO_PARAM p,
XTR_MASTER_CURRENCIES b
where p.PARAM_NAME = 'SYSTEM_FUNCTIONAL_CCY'
and b.CURRENCY = p.PARAM_VALUE;
--
cursor RND_FACTOR (p_currency VARCHAR2) is
select ROUNDING_FACTOR
from XTR_MASTER_CURRENCIES_V
where CURRENCY = p_currency;
--
l_first_ins VARCHAR2(1);
--
l_currency VARCHAR2(15);
--
--
cursor FIRST_INS is
select 'N'
from XTR_SPOT_RATES
where CURRENCY = 'USD';
--
begin
-- Check if No Spot Rates exist for this currency
-- if not found ensure at least one row is inserted before the Archive Freq
-- takes effect
open HOME_CCY;
fetch HOME_CCY INTO l_home_ccy,l_old_base_hce_rate,l_basis;
close HOME_CCY;
if l_home_ccy ='USD' then
l_old_base_hce_rate :=1;
end if;
l_first_ins := NULL;
open FIRST_INS;
fetch FIRST_INS INTO l_first_ins;
if FIRST_INS%NOTFOUND then
l_first_ins := 'Y';
if l_home_ccy='USD' then
update XTR_MASTER_CURRENCIES
set CURRENT_SPOT_RATE = 1,
HCE_RATE = 1,
USD_QUOTED_SPOT =1,
SPOT_DATE = sysdate,
RATE_DATE = sysdate
where CURRENCY = 'USD';
-- Insert USD 'DUMMY' Row ie this is used by USD deals to enable them to pick
-- the HCE RATE.
insert into xtr_spot_rates
(currency,rate_date,bid_rate_against_usd,spread_against_usd,
offer_rate_against_usd,usd_base_curr_bid_rate,usd_base_curr_offer_rate,
hce_rate,unique_period_id)
values
('USD',sysdate,1,0,1,1,1,1,'USD REF ROW');
end if;
end if;
close FIRST_INS;
l_first_ins := nvl(l_first_ins,'N');
/* ================================================== */
/* 1. Prorate Archive Details (Original Trigger Code) */
/* ================================================== */
if (INSERTING ----nvl(l_first_ins,'N') = 'Y'
or ((:NEW.LAST_ARCHIVE_TIME is NULL and :NEW.ARCHIVE_FREQ_TYPE is NOT NULL) or
(:NEW.ARCHIVE_FREQ_TYPE = 'A') or (:NEW.LAST_ARCHIVE_TIME is NOT NULL and
((:NEW.ARCHIVE_FREQ_TYPE = 'S')
and (SYSDATE >= (:NEW.LAST_ARCHIVE_TIME + :NEW.FREQ_ARCHIVE / 60 / 60 / 24))) or
((:NEW.ARCHIVE_FREQ_TYPE = 'M') and (SYSDATE >= (:NEW.LAST_ARCHIVE_TIME
+ :NEW.FREQ_ARCHIVE / 60 / 24))) or ((:NEW.ARCHIVE_FREQ_TYPE = 'H')
and (SYSDATE >= (:NEW.LAST_ARCHIVE_TIME + :NEW.FREQ_ARCHIVE / 24))) or
((:NEW.ARCHIVE_FREQ_TYPE = 'D') and (SYSDATE >= (:NEW.LAST_ARCHIVE_TIME + :NEW.FREQ_ARCHIVE))) or
((:NEW.ARCHIVE_FREQ_TYPE = 'W') and (SYSDATE >= (:NEW.LAST_ARCHIVE_TIME + :NEW.FREQ_ARCHIVE * 7))) or
((:NEW.ARCHIVE_FREQ_TYPE = 'T') and
(:NEW.LAST_ARCHIVE_TIME < to_date(to_char(SYSDATE,'DD/MON/YYYY')||':'||
lpad(to_char(:NEW.FREQ_ARCHIVE),'0',2), 'DD/MON/YYYY:HH24'))
and (SYSDATE >= to_date(to_char(SYSDATE,'DD/MON/YYYY')||':'||
lpad(to_char(:NEW.FREQ_ARCHIVE),'0',2), 'DD/MON/YYYY:HH24')))))) then
:NEW.LAST_ARCHIVE_TIME := SYSDATE;
-- Pulled out the rest of the code and placed it in archive_rates
-- for increased modularity
XTR_MARKET_DATA_INTERFACE_P.archive_rates(TRUE,
:new.ask_price,
:new.bid_price,
:new.currency_a,
:new.currency_b,
:new.nos_of_days,
:new.ric_code,
:new.term_length,
:new.term_type,
:new.term_year,
:new.last_download_time,
:new.day_count_basis);
end if; /* 1 */
end;