XTR_AU_MIRROR_DDA_LIMIT_ROW_T
AFTER UPDATE on XTR_MIRROR_DDA_LIMIT_ROW FOR EACH ROW
--
Type
AFTER EACH ROW
Event
UPDATE
Column
When
Referencing
REFERENCING NEW AS NEW OLD AS OLD
Body
declare
l_country VARCHAR2(100);
l_party VARCHAR2(7);
l_grp_party VARCHAR2(7);
l_dealer VARCHAR2(10);
l_dtype VARCHAR2(7);
l_product VARCHAR2(10);
l_dmmy NUMBER;
l_lim_type VARCHAR2(7);
l_lim_code VARCHAR2(7);
l_home_ccy VARCHAR2(50);
l_company VARCHAR2(7);
--
cursor GET_HOMECCY is
select param_value
from XTR_PRO_PARAM
where param_name = 'SYSTEM_FUNCTIONAL_CCY';
--
cursor GET_COUNTRY is
select COUNTRY_CODE
from XTR_PARTIES_V
where PARTY_CODE = l_party;
--
cursor GET_GROUP_DET is
select nvl(CROSS_REF_TO_OTHER_PARTY,l_party) GROUP_PARTY
from XTR_PARTIES_V
where PARTY_CODE = l_party;
--
cursor GET_TYPE is
select LIMIT_TYPE
from XTR_COMPANY_LIMITS
where LIMIT_CODE = l_lim_code;
--
cursor GET_FX_INVEST_FUND_TYPE is
select fx_invest_fund_type
from XTR_LIMIT_TYPES
where limit_type=l_lim_type;
--
cursor c_ok_to_do (pc3_param_name VARCHAR2) is
select nvl(param_value,'Y')
from XTR_PRO_PARAM
where param_name = pc3_param_name;
v_ok_to_do VARCHAR2(2);
l_rowid varchar2(30);
cursor CHK_LOCK_MASTER_CURRENCIES(C_CURRENCY varchar2) is
select rowid
from XTR_MASTER_CURRENCIES
where CURRENCY = C_CURRENCY
for update of UTILISED_AMOUNT NOWAIT;
cursor CHK_LOCK_MASTER_CURRENCIES_1(C_CURRENCY varchar2) is
select rowid
from XTR_MASTER_CURRENCIES
where CURRENCY = substrb(C_CURRENCY,1,instrb(C_CURRENCY,'/')-lengthb('/'))
for update of UTILISED_AMOUNT NOWAIT;
cursor CHK_LOCK_MASTER_CURRENCIES_2(C_CURRENCY varchar2) is
select rowid
from XTR_MASTER_CURRENCIES
where CURRENCY = substrb(C_CURRENCY,instrb(C_CURRENCY,'/')+lengthb('/'),lengthb(C_CURRENCY))
for update of UTILISED_AMOUNT NOWAIT;
/*
--* bug#2920529, rravunny
cursor CHK_LOCK_MASTER_CURRENCIES_1(C_CURRENCY varchar2) is
select rowid
from XTR_MASTER_CURRENCIES
where CURRENCY = substr(C_CURRENCY,1,3)
-- and CURRENCY <> l_home_ccy
for update of UTILISED_AMOUNT NOWAIT;
cursor CHK_LOCK_MASTER_CURRENCIES_2(C_CURRENCY varchar2) is
select rowid
from XTR_MASTER_CURRENCIES
where CURRENCY = substr(C_CURRENCY,5,3)
-- and CURRENCY <> l_home_ccy
for update of UTILISED_AMOUNT NOWAIT;
*/
cursor CHK_LOCK_COUNTRY_LIMITS(C_COMPANY_CODE varchar2) is
select rowid
from XTR_COUNTRY_COMPANY_LIMITS
where COMPANY_CODE=C_COMPANY_CODE
and COUNTRY_CODE=l_country
for update of UTILISED_AMOUNT NOWAIT;
cursor CHK_LOCK_COMPANY_LIMITS(C_COMPANY_CODE varchar2,
C_LIMIT_CODE varchar2) is
select rowid
from XTR_COMPANY_LIMITS
where COMPANY_CODE = C_COMPANY_CODE
and LIMIT_CODE = C_LIMIT_CODE
for update of UTILISED_AMOUNT NOWAIT;
cursor CHK_LOCK_COUNTERPARTY_LIMITS(C_COMPANY_CODE varchar2,
C_LIMIT_PARTY varchar2,
C_LIMIT_CODE varchar2) is
select rowid
from XTR_COUNTERPARTY_LIMITS
where COMPANY_CODE = C_COMPANY_CODE
and CPARTY_CODE = C_LIMIT_PARTY
and LIMIT_CODE = C_LIMIT_CODE
for update of UTILISED_AMOUNT NOWAIT;
cursor CHK_LOCK_GROUP_LIMITS(C_COMPANY_CODE varchar2) is
select 1
from XTR_GROUP_LIMITS
where COMPANY_CODE = C_COMPANY_CODE
and (LIMIT_TYPE = nvl(l_lim_type,'X')
or (LIMIT_TYPE='XI' and nvl(l_lim_type,'X') in('X','I')))
and CPARTY_CODE = l_grp_party
for update of UTILISED_AMOUNT NOWAIT;
begin
xtr_debug_pkg.debug('Before XTR_AU_XTR_MIRROR_DDA_LIMIT_ROW_T on:'||
to_char(sysdate,'MM:DD:HH24:MI:SS'));
--------------------------
-- Country Limits
--------------------------
if :OLD.COMPANY_CODE <> :NEW.COMPANY_CODE
or :OLD.LIMIT_PARTY <> :NEW.LIMIT_PARTY
or :OLD.HCE_UTILISED_AMOUNT <> :NEW.HCE_UTILISED_AMOUNT then
open c_ok_to_do('LIMIT_CHECK_SOVRN');
fetch c_ok_to_do into v_ok_to_do;
if c_ok_to_do%NOTFOUND then
v_ok_to_do := 'Y';
end if;
close c_ok_to_do;
--
if v_ok_to_do = 'Y' then
-- Reversal
if :OLD.LIMIT_CODE is NOT NULL then
l_party := :OLD.LIMIT_PARTY;
open GET_COUNTRY;
fetch GET_COUNTRY INTO l_country;
if GET_COUNTRY%FOUND then
close GET_COUNTRY;
open CHK_LOCK_COUNTRY_LIMITS(:OLD.COMPANY_CODE);
fetch CHK_LOCK_COUNTRY_LIMITS into l_rowid;
if CHK_LOCK_COUNTRY_LIMITS%FOUND then
close CHK_LOCK_COUNTRY_LIMITS;
update XTR_COUNTRY_COMPANY_LIMITS
set UTILISED_AMOUNT = nvl(UTILISED_AMOUNT,0) - -- Bug 2229236 should be '-' not '+'
nvl(:OLD.HCE_UTILISED_AMOUNT,0)
where rowid=l_rowid;
else
close CHK_LOCK_COUNTRY_LIMITS;
end if;
else
close GET_COUNTRY;
end if;
end if;
-- New details
if :NEW.LIMIT_CODE is NOT NULL then
l_party := :NEW.LIMIT_PARTY;
open GET_COUNTRY;
fetch GET_COUNTRY INTO l_country;
if GET_COUNTRY%FOUND then
close GET_COUNTRY;
open CHK_LOCK_COUNTRY_LIMITS(:NEW.COMPANY_CODE);
fetch CHK_LOCK_COUNTRY_LIMITS into l_rowid;
if CHK_LOCK_COUNTRY_LIMITS%FOUND then
close CHK_LOCK_COUNTRY_LIMITS;
update XTR_COUNTRY_COMPANY_LIMITS
set UTILISED_AMOUNT = nvl(UTILISED_AMOUNT,0) +
nvl(:NEW.HCE_UTILISED_AMOUNT,0)
where rowid=l_rowid;
else
close CHK_LOCK_COUNTRY_LIMITS;
end if;
else
close GET_COUNTRY;
end if;
end if;
end if;
end if;
--------------------------
-- Global Limits
--------------------------
if :OLD.LIMIT_CODE <> :NEW.LIMIT_CODE
or :OLD.COMPANY_CODE <> :NEW.COMPANY_CODE
or :OLD.HCE_UTILISED_AMOUNT <> :NEW.HCE_UTILISED_AMOUNT then
open c_ok_to_do('LIMIT_CHECK_GLOBAL');
fetch c_ok_to_do into v_ok_to_do;
if c_ok_to_do%NOTFOUND then
v_ok_to_do := 'Y';
end if;
close c_ok_to_do;
--
if v_ok_to_do = 'Y' then
-- Reversal
if :OLD.LIMIT_CODE is NOT NULL then
open CHK_LOCK_COMPANY_LIMITS(:OLD.COMPANY_CODE,:OLD.LIMIT_CODE);
fetch CHK_LOCK_COMPANY_LIMITS into l_rowid;
if CHK_LOCK_COMPANY_LIMITS%FOUND then
close CHK_LOCK_COMPANY_LIMITS;
update XTR_COMPANY_LIMITS
set UTILISED_AMOUNT = nvl(UTILISED_AMOUNT,0) - -- Bug 2229236 should be '-' not '+'
nvl(:OLD.HCE_UTILISED_AMOUNT,0)
where rowid=l_rowid;
else
close CHK_LOCK_COMPANY_LIMITS;
end if;
end if;
-- New Details
if :NEW.LIMIT_CODE is NOT NULL then
open CHK_LOCK_COMPANY_LIMITS(:NEW.COMPANY_CODE,:NEW.LIMIT_CODE);
fetch CHK_LOCK_COMPANY_LIMITS into l_rowid;
if CHK_LOCK_COMPANY_LIMITS%FOUND then
close CHK_LOCK_COMPANY_LIMITS;
update XTR_COMPANY_LIMITS
set UTILISED_AMOUNT = nvl(UTILISED_AMOUNT,0) +
nvl(:NEW.HCE_UTILISED_AMOUNT,0)
where rowid=l_rowid;
else
close CHK_LOCK_COMPANY_LIMITS;
end if;
end if;
end if;
end if;
--------------------------
-- Counterparty Limits
--------------------------
if :OLD.LIMIT_CODE <> :NEW.LIMIT_CODE
or :OLD.COMPANY_CODE <> :NEW.COMPANY_CODE
or :OLD.HCE_UTILISED_AMOUNT <> :NEW.HCE_UTILISED_AMOUNT
or :OLD.LIMIT_PARTY <> :NEW.LIMIT_PARTY then
open c_ok_to_do('LIMIT_CHECK_CPARTY');
fetch c_ok_to_do into v_ok_to_do;
if c_ok_to_do%NOTFOUND then
v_ok_to_do := 'Y';
end if;
close c_ok_to_do;
--
if v_ok_to_do = 'Y' then
if :OLD.LIMIT_CODE is NOT NULL then
-- Reversal
open CHK_LOCK_COUNTERPARTY_LIMITS(:OLD.COMPANY_CODE,
:OLD.LIMIT_PARTY,
:OLD.LIMIT_CODE);
fetch CHK_LOCK_COUNTERPARTY_LIMITS into l_rowid;
if CHK_LOCK_COUNTERPARTY_LIMITS%FOUND then
close CHK_LOCK_COUNTERPARTY_LIMITS;
update XTR_COUNTERPARTY_LIMITS
set UTILISED_AMOUNT = nvl(UTILISED_AMOUNT,0) -
nvl(:OLD.HCE_UTILISED_AMOUNT,0)
where rowid=l_rowid;
else
close CHK_LOCK_COUNTERPARTY_LIMITS;
end if;
end if;
-- New Details
if :NEW.LIMIT_CODE is NOT NULL then
open CHK_LOCK_COUNTERPARTY_LIMITS(:NEW.COMPANY_CODE,
:NEW.LIMIT_PARTY,
:NEW.LIMIT_CODE);
fetch CHK_LOCK_COUNTERPARTY_LIMITS into l_rowid;
if CHK_LOCK_COUNTERPARTY_LIMITS%FOUND then
close CHK_LOCK_COUNTERPARTY_LIMITS;
update XTR_COUNTERPARTY_LIMITS
set UTILISED_AMOUNT = nvl(UTILISED_AMOUNT,0) +
nvl(:NEW.HCE_UTILISED_AMOUNT,0)
where rowid=l_rowid;
else
close CHK_LOCK_COUNTERPARTY_LIMITS;
end if;
end if;
end if;
end if;
--------------------------
-- Currency Limits
--------------------------
if nvl(:OLD.CURRENCY,'@#@') <>nvl(:NEW.CURRENCY,'@#@')
or :OLD.HCE_UTILISED_AMOUNT <> :NEW.HCE_UTILISED_AMOUNT
or nvl(:OLD.CURRENCY_COMBINATION,'@#@') <>nvl(:NEW.CURRENCY_COMBINATION,'@#@')
then
open c_ok_to_do('LIMIT_CHECK_CCY');
fetch c_ok_to_do into v_ok_to_do;
if c_ok_to_do%NOTFOUND then
v_ok_to_do := 'Y';
end if;
close c_ok_to_do;
--
if v_ok_to_do = 'Y' then
if :OLD.LIMIT_CODE is NOT NULL then
-- Reversal
l_company := :OLD.COMPANY_CODE;
open GET_HOMECCY;
fetch GET_HOMECCY INTO l_home_ccy;
close GET_HOMECCY;
if :OLD.CURRENCY_COMBINATION is NOT NULL then
open CHK_LOCK_MASTER_CURRENCIES_1(:OLD.CURRENCY_COMBINATION);
fetch CHK_LOCK_MASTER_CURRENCIES_1 into l_rowid;
if CHK_LOCK_MASTER_CURRENCIES_1%FOUND then
close CHK_LOCK_MASTER_CURRENCIES_1;
update XTR_MASTER_CURRENCIES
set UTILISED_AMOUNT = nvl(UTILISED_AMOUNT,0) - -- Bug 2229236 should be '-' not '+'
nvl(:OLD.HCE_UTILISED_AMOUNT,0)
where rowid=l_rowid;
else
close CHK_LOCK_MASTER_CURRENCIES_1;
end if;
open CHK_LOCK_MASTER_CURRENCIES_2(:OLD.CURRENCY_COMBINATION);
fetch CHK_LOCK_MASTER_CURRENCIES_2 into l_rowid;
if CHK_LOCK_MASTER_CURRENCIES_2%FOUND then
close CHK_LOCK_MASTER_CURRENCIES_2;
update XTR_MASTER_CURRENCIES
set UTILISED_AMOUNT = nvl(UTILISED_AMOUNT,0) - -- Bug 2229236 should be '-' not '+'
nvl(:OLD.HCE_UTILISED_AMOUNT,0)
where rowid=l_rowid;
else
close CHK_LOCK_MASTER_CURRENCIES_2;
end if;
--* bug#2920529, rravunny end if;
else --* bug#2920529, rravunny
-- bug 1289530 elsif :OLD.CURRENCY <> l_home_ccy then
open CHK_LOCK_MASTER_CURRENCIES(:OLD.CURRENCY);
fetch CHK_LOCK_MASTER_CURRENCIES into l_rowid;
if CHK_LOCK_MASTER_CURRENCIES%FOUND then
close CHK_LOCK_MASTER_CURRENCIES;
update XTR_MASTER_CURRENCIES
set UTILISED_AMOUNT = nvl(UTILISED_AMOUNT,0) - -- Bug 2229236 should be '-' not '+'
nvl(:OLD.HCE_UTILISED_AMOUNT,0)
where rowid = l_rowid;
else
close CHK_LOCK_MASTER_CURRENCIES;
end if;
-- bug 1289530 end if;
end if; --* bug#2920529, rravunny
end if;
-- New Details
if :NEW.LIMIT_CODE is NOT NULL then
l_company := :NEW.COMPANY_CODE;
open GET_HOMECCY;
fetch GET_HOMECCY INTO l_home_ccy;
close GET_HOMECCY;
if :NEW.CURRENCY_COMBINATION is NOT NULL then
open CHK_LOCK_MASTER_CURRENCIES_1(:NEW.CURRENCY_COMBINATION);
fetch CHK_LOCK_MASTER_CURRENCIES_1 into l_rowid;
if CHK_LOCK_MASTER_CURRENCIES_1%FOUND then
close CHK_LOCK_MASTER_CURRENCIES_1;
update XTR_MASTER_CURRENCIES
set UTILISED_AMOUNT = nvl(UTILISED_AMOUNT,0) +
nvl(:NEW.HCE_UTILISED_AMOUNT,0)
where rowid=l_rowid;
else
close CHK_LOCK_MASTER_CURRENCIES_1;
end if;
open CHK_LOCK_MASTER_CURRENCIES_2(:NEW.CURRENCY_COMBINATION);
fetch CHK_LOCK_MASTER_CURRENCIES_2 into l_rowid;
if CHK_LOCK_MASTER_CURRENCIES_2%FOUND then
close CHK_LOCK_MASTER_CURRENCIES_2;
update XTR_MASTER_CURRENCIES
set UTILISED_AMOUNT = nvl(UTILISED_AMOUNT,0) +
nvl(:NEW.HCE_UTILISED_AMOUNT,0)
where rowid=l_rowid;
else
close CHK_LOCK_MASTER_CURRENCIES_2;
end if;
-- bug 1289530 elsif :NEW.CURRENCY <> l_home_ccy then
else --* bug#2920529, rravunny
--* bug#2920529, rravunny end if;
open CHK_LOCK_MASTER_CURRENCIES(:NEW.CURRENCY);
fetch CHK_LOCK_MASTER_CURRENCIES into l_rowid;
if CHK_LOCK_MASTER_CURRENCIES%FOUND then
close CHK_LOCK_MASTER_CURRENCIES;
update XTR_MASTER_CURRENCIES
set UTILISED_AMOUNT = nvl(UTILISED_AMOUNT,0) +
nvl(:NEW.HCE_UTILISED_AMOUNT,0)
where rowid = l_rowid;
else
close CHK_LOCK_MASTER_CURRENCIES;
-- bug 1289530 end if;
end if; --* bug#2920529, rravunny
end if;
end if;
end if;
end if;
--------------------------
-- Group Limits
--------------------------
if :OLD.COMPANY_CODE <> :NEW.COMPANY_CODE
or :OLD.LIMIT_PARTY <> :NEW.LIMIT_PARTY
or :OLD.HCE_UTILISED_AMOUNT <> :NEW.HCE_UTILISED_AMOUNT
or :OLD.AMOUNT <> :NEW.AMOUNT then
open c_ok_to_do('LIMIT_CHECK_GROUP');
fetch c_ok_to_do into v_ok_to_do;
if c_ok_to_do%NOTFOUND then
v_ok_to_do := 'Y';
end if;
close c_ok_to_do;
--
if v_ok_to_do = 'Y' then
-- Reversal
if :OLD.LIMIT_CODE is NOT NULL then
l_lim_code := :OLD.LIMIT_CODE;
if :OLD.LIMIT_TYPE is NULL then
open GET_TYPE;
fetch GET_TYPE INTO l_lim_type;
close GET_TYPE;
else
l_lim_type := :OLD.LIMIT_TYPE;
end if;
open GET_FX_INVEST_FUND_TYPE;
fetch GET_FX_INVEST_FUND_TYPE into l_lim_type;
close GET_FX_INVEST_FUND_TYPE;
l_party := :OLD.LIMIT_PARTY;
open GET_GROUP_DET;
fetch GET_GROUP_DET INTO l_grp_party;
close GET_GROUP_DET;
open CHK_LOCK_GROUP_LIMITS(:OLD.COMPANY_CODE);
fetch CHK_LOCK_GROUP_LIMITS into l_dmmy;
if CHK_LOCK_GROUP_LIMITS%FOUND then
close CHK_LOCK_GROUP_LIMITS;
update XTR_GROUP_LIMITS
set UTILISED_AMOUNT = nvl(UTILISED_AMOUNT,0) - -- Bug 2229236 should be '-' not '+'
nvl(:OLD.HCE_UTILISED_AMOUNT,0)
where COMPANY_CODE = :OLD.COMPANY_CODE
and (LIMIT_TYPE = nvl(l_lim_type,'X')
or (LIMIT_TYPE='XI' and nvl(l_lim_type,'X') in('X','I')))
and CPARTY_CODE = l_grp_party;
else
close CHK_LOCK_GROUP_LIMITS;
end if;
end if;
-- New details
if :NEW.LIMIT_CODE is NOT NULL then
l_lim_code := :NEW.LIMIT_CODE;
if :NEW.LIMIT_TYPE is NULL then
open GET_TYPE;
fetch GET_TYPE INTO l_lim_type;
close GET_TYPE;
else
l_lim_type := :NEW.LIMIT_TYPE;
end if;
open GET_FX_INVEST_FUND_TYPE;
fetch GET_FX_INVEST_FUND_TYPE into l_lim_type;
close GET_FX_INVEST_FUND_TYPE;
l_party := :NEW.LIMIT_PARTY;
open GET_GROUP_DET;
fetch GET_GROUP_DET INTO l_grp_party;
close GET_GROUP_DET;
open CHK_LOCK_GROUP_LIMITS(:NEW.COMPANY_CODE);
fetch CHK_LOCK_GROUP_LIMITS into l_dmmy;
if CHK_LOCK_GROUP_LIMITS%FOUND then
close CHK_LOCK_GROUP_LIMITS;
update XTR_GROUP_LIMITS
set UTILISED_AMOUNT = nvl(UTILISED_AMOUNT,0) +
nvl(:NEW.HCE_UTILISED_AMOUNT,0)
where COMPANY_CODE = :NEW.COMPANY_CODE
and (LIMIT_TYPE = nvl(l_lim_type,'X')
or (LIMIT_TYPE='XI' and nvl(l_lim_type,'X') in('X','I')))
and CPARTY_CODE = l_grp_party;
else
close CHK_LOCK_GROUP_LIMITS;
end if;
end if;
end if;
end if;
xtr_debug_pkg.debug('After XTR_AU_XTR_MIRROR_DDA_LIMIT_ROW_T on:'||
to_char(sysdate,'MM:DD:HH24:MI:SS'));
--
exception
when app_exceptions.RECORD_LOCK_EXCEPTION then
if CHK_LOCK_MASTER_CURRENCIES%ISOPEN then
close CHK_LOCK_MASTER_CURRENCIES;
end if;
if CHK_LOCK_MASTER_CURRENCIES_1%ISOPEN then
close CHK_LOCK_MASTER_CURRENCIES_1;
end if;
if CHK_LOCK_MASTER_CURRENCIES_2%ISOPEN then
close CHK_LOCK_MASTER_CURRENCIES_2;
end if;
if CHK_LOCK_COUNTRY_LIMITS%ISOPEN then
close CHK_LOCK_COUNTRY_LIMITS;
end if;
if CHK_LOCK_COMPANY_LIMITS%ISOPEN then
close CHK_LOCK_COMPANY_LIMITS;
end if;
if CHK_LOCK_COUNTERPARTY_LIMITS%ISOPEN then
close CHK_LOCK_COUNTERPARTY_LIMITS;
end if;
if CHK_LOCK_GROUP_LIMITS%ISOPEN then
close CHK_LOCK_GROUP_LIMITS;
end if;
raise app_exceptions.RECORD_LOCK_EXCEPTION;
--
end;