[MDEV-10849] issue with converting stored procedure from Oracle to MariaDB Created: 2016-09-21  Updated: 2016-09-21  Resolved: 2016-09-21

Status: Closed
Project: MariaDB Server
Component/s: OTHER
Affects Version/s: 10.1.17
Fix Version/s: N/A

Type: Bug Priority: Critical
Reporter: Anil Assignee: Unassigned
Resolution: Not a Bug Votes: 0
Labels: innodb
Environment:

DEV, TEST, Prod


Attachments: Text File dbs03_out.sql    

 Description   

Hi All,

I want immediate help to convert below stored procedure from oracle to Maria DB .
please help me out.

what is equivalent solution in Maria DB to achieve (start with .... connect by) and (start with ...connect by prior) recursive queries.

Below is the Procedure I want to run in Maria DB.

delimiter //
create PROCEDURE SP_Recon_Limit(IN p_le_short_name varchar(4000),
IN p_br_short_name varchar(4000)
)
BEGIN
DECLARE v_txn_exists INT default 1;
DECLARE v_parent_facility INT;
DECLARE v_facility_nt facility_nt;
declare c_facility cursor for
select distinct a.ADV_FACI_ID,
a.CURRENCY_ID,
a.OBLIGOR_ID,
a.ADV_FACI_AMOUNT,
a.ADV_FACI_NAME,
case (select 1 from m_obligor where obligor_id = a.obligor_id and reference_id like 'H%') when 1 then 'Y' else 'N' end as IS_DUMMY,
(case when exists(select 1 from t_advance_facility where parent_advf_id = a.ADV_FACI_ID) then 'Y' else 'N' end) as IS_MULTIENTITY
from t_advance_facility a
where a.valid_flag = 'T'
and a.parent_advf_id is null
and a.LEGAL_ENTITY_BRANCH_ID in (select sk_legal_entity_branch_id from r_legal_entity_branch
where LEGAL_ENTITY_ID = (select sk_legal_entity_id from m_legal_entity where legal_entity_shortname = p_le_short_name)
and BRANCH_ID = (select branch_id from m_branch where branch_shortname = p_br_short_name))
and (a.ADV_FACI_STATUS in (6,21,16,26,27,30,43)
or (a.ADV_FACI_STATUS in (9, 8, 11, 7, 24, 25) and a.ADV_FACI_AMOUNT > 0)) prior
a.adv_faci_id = a.parent_advf_id;
cursor c_sub_facility(f_id in number) is
select ADV_FACI_ID,
CURRENCY_ID,
OBLIGOR_ID,
ADV_FACI_AMOUNT,
ADV_FACI_NAME
from t_advance_facility
where parent_advf_id = f_id;
begin
delete from dbs_recon_limit;
declare v_facility cursor for c_facility LOOP
BEGIN
SAVEPOINT start_transaction;
select ADV_FACI_ID bulk collect into v_facility_nt from t_advance_facility
start with ADV_FACI_ID = v_facility.ADV_FACI_ID
connect by prior adv_faci_id = parent_advf_id;
select count into v_parent_facility from t_advance_facility
where adv_faci_id = v_facility.ADV_FACI_ID
and PARENT_ADVF_ID is null;
if (v_parent_facility > 0)
then
SP_FACILITY_HEADER(v_facility.ADV_FACI_ID,
v_facility.CURRENCY_ID,
v_facility.OBLIGOR_ID,
v_facility.ADV_FACI_AMOUNT,
v_facility.ADV_FACI_NAME,
v_facility_nt);
end if;
insert into dbs_recon_limit
SELECT (select reference_id from m_obligor where obligor_id = (select obligor_id from t_advance_facility
where parent_advf_id is null
start with adv_faci_id = v_facility.ADV_FACI_ID
connect by adv_faci_id = prior parent_advf_id) and valid_flag = 'T'),
v_facility.ADV_FACI_ID,
(select ADV_FACI_NAME from t_advance_facility
where parent_advf_id is null
start with adv_faci_id = v_facility.ADV_FACI_ID
connect by adv_faci_id = prior parent_advf_id),
(select currency_short_name from m_currency where sk_currency_id = v_facility.CURRENCY_ID and valid_flag = 'T'),
coalesce(
(case when f.cred_instr_shortname = 'LOAN' THEN
(select j.limit_amt
from r_adv_faci_cred_instr j
join m_loan_type i on j.loan_type_id = i.sk_loan_type_id
join h_cred lo on lo.loan_type_id = i.sk_loan_type_id
where j.available_flag = 'T'
and i.valid_flag = 'T'
and j.adv_faci_id = (select adv_faci_id from t_advance_facility
where parent_advf_id is null
start with adv_faci_id = h.adv_faci_id
connect by prior parent_advf_id = adv_faci_id)
and lo.sk_trans_hist_id = a.cred_txn_id
)
when f.cred_instr_shortname = 'CLOI' THEN
(select k.limit_amt
from r_adv_faci_cred_instr k
join M_LOI_TYPE l on k.LOI_TYPE_ID = l.SK_ID
join h_cred lto on lto.loi_type_id = l.SK_ID
where k.available_flag = 'T'
and l.valid_flag = 'T'
and k.adv_faci_id = (select adv_faci_id from t_advance_facility
where parent_advf_id is null
start with adv_faci_id = h.adv_faci_id
connect by prior parent_advf_id = adv_faci_id)
and lto.sk_trans_hist_id = a.cred_txn_id
)
when f.cred_instr_shortname = 'SBG' THEN
(select m.limit_amt
from r_adv_faci_cred_instr m
join M_guarantee n on m.guarantee_ID = n.guarantee_ID
join h_cred o on o.guarantee_type = m.guarantee_ID
where m.available_flag = 'T'
and n.valid_flag = 'T'
and m.adv_faci_id = (select adv_faci_id from t_advance_facility
where parent_advf_id is null
start with adv_faci_id = h.adv_faci_id
connect by prior parent_advf_id = adv_faci_id)
and o.sk_trans_hist_id = a.cred_txn_id
)
else
(select q.limit_amt
from r_adv_faci_cred_instr q
join h_cred r on r.CRED_INSTR_TYPE_ID = q.CRED_INSTR_TYPE_ID
where q.adv_faci_id = (select adv_faci_id from t_advance_facility
where parent_advf_id is null
start with adv_faci_id = h.adv_faci_id
connect by prior parent_advf_id = adv_faci_id)
and r.sk_trans_hist_id = a.cred_txn_id
)
end)
, 0)
,
coalesce(a.exp_value, 0),
(CASE
WHEN f.cred_instr_shortname = 'LOAN' THEN
(select LOAN_TYPE_SHORTNAME from m_loan_type mlt, h_cred
where mlt.sk_loan_type_id = loan_type_id
and SK_TRANS_HIST_ID = a.CRED_TXN_ID
and mlt.valid_flag = 'T'
)
WHEN f.cred_instr_shortname = 'CLOI' THEN
(select SHORT_NAME from m_loi_type mloit, h_cred
where mloit.SK_ID = loi_type_id
and SK_TRANS_HIST_ID = a.CRED_TXN_ID
and mloit.valid_flag = 'T'
)
WHEN f.cred_instr_shortname = 'SBG' THEN
(select GUARANTEE_SHORTNAME from m_guarantee mg, h_cred
where mg.guarantee_id = guarantee_type
and SK_TRANS_HIST_ID = a.CRED_TXN_ID
and mg.valid_flag = 'T'
)
ELSE f.cred_instr_shortname
END),
(CASE
WHEN a.exp_status = 1 THEN 'Y'
ELSE 'N'
END),
null,
null
FROM t_eod_rslt_exposure a join h_advance_facility p on a.advance_facility_id = p.SK_ADV_FACI_HIST_ID
join m_cred_instr_type f on a.cit_id = f.cred_instr_type_id
join r_adv_faci_cred_instr h on f.cred_instr_type_id = h.cred_instr_type_id and h.ADV_FACI_ID = p.original_id
WHERE h.available_flag = 'T'
and a.cit_id in (select b1.CRED_INSTR_TYPE_ID from m_Cred_instr_grp a1, m_cred_instr_type b1
where a1.sk_cred_instr_grp_id = b1.cred_instr_grp_id
and a1.cred_instr_grp_shortname in ('DC', 'BG', 'FL')
and a1.valid_flag = 'T'
and b1.valid_flag = 'T')
AND a.batch_id IN (SELECT distinct first_value(D.SK_EOD_PROC_HIST_ID) over(partition by D.ADVF_ID order by D.VALUE_DATE desc,D.LAST_UPDATED desc)
FROM t_eod_proc_hist D
WHERE D.advf_id in (select column_value from table(v_facility_nt))
AND D.mtm_successful_flag = 'T'
AND D.curd_successful_flag = 'T'
AND D.EPH_TYPE not in (4,6));
if (FOUND_ROWS() = 0)
then
insert into dbs_recon_limit
select (select reference_id from m_obligor where obligor_id = (select obligor_id from t_advance_facility
where parent_advf_id is null
start with adv_faci_id = v_facility.ADV_FACI_ID
connect by adv_faci_id = prior parent_advf_id) and valid_flag = 'T'),
c.afi,
(select ADV_FACI_NAME from t_advance_facility
where parent_advf_id is null
start with adv_faci_id = v_facility.ADV_FACI_ID
connect by adv_faci_id = prior parent_advf_id),
(select currency_short_name from m_currency where sk_currency_id = v_facility.CURRENCY_ID and valid_flag = 'T'),
c.la,
0,
c.cis,
'Y',
null,
null
from (select a.afi,
a.la,
(case when a.typ = 'LOI'
then (select SHORT_NAME from m_loi_type mloit
where mloit.SK_ID = a.loi_type_id)
when a.typ = 'GID'
then (select GUARANTEE_SHORTNAME from m_guarantee mg
where mg.guarantee_id = a.guarantee_id)
when a.typ = 'LOAN'
then (select LOAN_TYPE_SHORTNAME from m_loan_type mlt
where mlt.sk_loan_type_id = a.loan_type_id)
when a.typ = 'CIT'
then (select cred_instr_shortname from m_cred_instr_type
where cred_instr_type_id = a.cred_instr_type_id)
else 'Not Found' end) as cis
from (select adv_faci_id as afi,
(select ADV_FACI_NAME from t_advance_facility
where adv_faci_id = v_facility.ADV_FACI_ID) as afn,
limit_amt as la,
loi_type_id,
guarantee_id,
loan_type_id,
cred_instr_type_id,
coalesce(cred_instr_group_id,cred_instr_type_id,guarantee_id,loi_type_id,loan_type_id) as id,
(case when cred_instr_group_id is not null
then 'CIG'
when cred_instr_type_id is not null
then 'CIT'
when guarantee_id is not null
then 'GID'
when loi_type_id is not null
then 'LOI'
when loan_type_id is not null
then 'LOAN'
else 'Not Found' end) as typ
from r_adv_faci_cred_instr
where adv_faci_id = v_facility.ADV_FACI_ID
and available_flag = 'T'
and valid_flag = 'T') a
where a.typ in ('LOAN')) c
where not exists (select 1 from dbs_recon_limit
where facility_id = c.afi
and product_type = c.cis
and liability = 'Y')
order by c.cis;
end if;
SP_LOAN_LIABILITY(v_facility.ADV_FACI_ID,
v_facility.CURRENCY_ID,
v_facility.OBLIGOR_ID,
v_facility.ADV_FACI_NAME,
v_facility.IS_DUMMY,
v_facility.IS_MULTIENTITY);
if (v_facility.IS_DUMMY = 'Y' AND v_facility.IS_MULTIENTITY = 'Y')
then
declare v_sub_facility cursor for c_sub_facility(v_facility.ADV_FACI_ID) LOOP
select ADV_FACI_ID bulk collect into v_facility_nt from t_advance_facility
start with ADV_FACI_ID = v_sub_facility.ADV_FACI_ID
connect by prior adv_faci_id = parent_advf_id;
SP_FACILITY_HEADER(v_sub_facility.ADV_FACI_ID,
v_sub_facility.CURRENCY_ID,
v_sub_facility.OBLIGOR_ID,
v_sub_facility.ADV_FACI_AMOUNT,
v_sub_facility.ADV_FACI_NAME,
v_facility_nt);
insert into dbs_recon_limit
SELECT (select reference_id from m_obligor where obligor_id = v_sub_facility.OBLIGOR_ID and valid_flag = 'T'),
v_sub_facility.ADV_FACI_ID,
v_sub_facility.ADV_FACI_NAME,
(select currency_short_name from m_currency where sk_currency_id = v_sub_facility.CURRENCY_ID and valid_flag = 'T'),
coalesce(
(case when f.cred_instr_shortname = 'LOAN' THEN
(select j.limit_amt
from r_adv_faci_cred_instr j
join m_loan_type i on j.loan_type_id = i.sk_loan_type_id
join h_cred lo on lo.loan_type_id = i.sk_loan_type_id
where j.available_flag = 'T'
and i.valid_flag = 'T'
and j.adv_faci_id = v_sub_facility.ADV_FACI_ID
and lo.sk_trans_hist_id = a.cred_txn_id
)
when f.cred_instr_shortname = 'CLOI' THEN
(select k.limit_amt
from r_adv_faci_cred_instr k
join M_LOI_TYPE l on k.LOI_TYPE_ID = l.SK_ID
join h_cred lto on lto.loi_type_id = l.SK_ID
where k.available_flag = 'T'
and l.valid_flag = 'T'
and k.adv_faci_id = v_sub_facility.ADV_FACI_ID
and lto.sk_trans_hist_id = a.cred_txn_id
)
when f.cred_instr_shortname = 'SBG' THEN
(select m.limit_amt
from r_adv_faci_cred_instr m
join M_guarantee n on m.guarantee_ID = n.guarantee_ID
join h_cred o on o.guarantee_type = m.guarantee_ID
where m.available_flag = 'T'
and n.valid_flag = 'T'
and m.adv_faci_id = v_sub_facility.ADV_FACI_ID
and o.sk_trans_hist_id = a.cred_txn_id
)
else
(select q.limit_amt
from r_adv_faci_cred_instr q
join h_cred r on r.CRED_INSTR_TYPE_ID = q.CRED_INSTR_TYPE_ID
where q.adv_faci_id = v_sub_facility.ADV_FACI_ID
and r.sk_trans_hist_id = a.cred_txn_id
)
end)
, 0)
,
coalesce(a.exp_value, 0),
(CASE
WHEN f.cred_instr_shortname = 'LOAN' THEN
(select LOAN_TYPE_SHORTNAME from m_loan_type mlt, h_cred
where mlt.sk_loan_type_id = loan_type_id
and SK_TRANS_HIST_ID = a.CRED_TXN_ID
and mlt.valid_flag = 'T'
)
WHEN f.cred_instr_shortname = 'CLOI' THEN
(select SHORT_NAME from m_loi_type mloit, h_cred
where mloit.SK_ID = loi_type_id
and SK_TRANS_HIST_ID = a.CRED_TXN_ID
and mloit.valid_flag = 'T'
)
WHEN f.cred_instr_shortname = 'SBG' THEN
(select GUARANTEE_SHORTNAME from m_guarantee mg, h_cred
where mg.guarantee_id = guarantee_type
and SK_TRANS_HIST_ID = a.CRED_TXN_ID
and mg.valid_flag = 'T'
)
ELSE f.cred_instr_shortname
END),
(CASE
WHEN a.exp_status = 1 THEN 'Y'
ELSE 'N'
END),
null,
null
FROM t_eod_rslt_exposure a join h_advance_facility p on a.advance_facility_id = p.SK_ADV_FACI_HIST_ID
join m_cred_instr_type f on a.cit_id = f.cred_instr_type_id
join r_adv_faci_cred_instr h on f.cred_instr_type_id = h.cred_instr_type_id and h.ADV_FACI_ID = p.original_id
WHERE h.available_flag = 'T'
and a.cit_id in (select b1.CRED_INSTR_TYPE_ID from m_Cred_instr_grp a1, m_cred_instr_type b1
where a1.sk_cred_instr_grp_id = b1.cred_instr_grp_id
and a1.cred_instr_grp_shortname in ('DC', 'BG', 'FL')
and a1.valid_flag = 'T'
and b1.valid_flag = 'T')
AND a.batch_id IN (SELECT distinct first_value(D.SK_EOD_PROC_HIST_ID) over(partition by D.ADVF_ID order by D.VALUE_DATE desc,D.LAST_UPDATED desc)
FROM t_eod_proc_hist D
WHERE D.advf_id in (select column_value from table(v_facility_nt))
AND D.mtm_successful_flag = 'T'
AND D.curd_successful_flag = 'T'
AND D.EPH_TYPE not in (4,6));
if (FOUND_ROWS() = 0)
then
insert into dbs_recon_limit
select (select reference_id from m_obligor where obligor_id = v_sub_facility.OBLIGOR_ID and valid_flag = 'T'),
c.afi,
v_sub_facility.ADV_FACI_NAME,
(select currency_short_name from m_currency where sk_currency_id = v_sub_facility.CURRENCY_ID and valid_flag = 'T'),
c.la,
0,
c.cis,
'Y',
null,
null
from (select a.afi,
a.la,
(case when a.typ = 'LOI'
then (select SHORT_NAME from m_loi_type mloit
where mloit.SK_ID = a.loi_type_id)
when a.typ = 'GID'
then (select GUARANTEE_SHORTNAME from m_guarantee mg
where mg.guarantee_id = a.guarantee_id)
when a.typ = 'LOAN'
then (select LOAN_TYPE_SHORTNAME from m_loan_type mlt
where mlt.sk_loan_type_id = a.loan_type_id)
when a.typ = 'CIT'
then (select cred_instr_shortname from m_cred_instr_type
where cred_instr_type_id = a.cred_instr_type_id)
else 'Not Found' end) as cis
from (select adv_faci_id as afi,
(select ADV_FACI_NAME from t_advance_facility
where adv_faci_id = v_sub_facility.ADV_FACI_ID) as afn,
limit_amt as la,
loi_type_id,
guarantee_id,
loan_type_id,
cred_instr_type_id,
coalesce(cred_instr_group_id,cred_instr_type_id,guarantee_id,loi_type_id,loan_type_id) as id,
(case when cred_instr_group_id is not null
then 'CIG'
when cred_instr_type_id is not null
then 'CIT'
when guarantee_id is not null
then 'GID'
when loi_type_id is not null
then 'LOI'
when loan_type_id is not null
then 'LOAN'
else 'Not Found' end) as typ
from r_adv_faci_cred_instr
where adv_faci_id = v_sub_facility.ADV_FACI_ID
and available_flag = 'T'
and valid_flag = 'T') a
where a.typ in ('LOAN')) c
where not exists (select 1 from dbs_recon_limit
where facility_id = c.afi
and product_type = c.cis
and liability = 'Y')
order by c.cis;
end if;
SP_LOAN_LIABILITY(v_sub_facility.ADV_FACI_ID,
v_sub_facility.CURRENCY_ID,
v_sub_facility.OBLIGOR_ID,
v_sub_facility.ADV_FACI_NAME,
v_facility.IS_DUMMY,
v_facility.IS_MULTIENTITY);
FETCH INTO;
END WHILE;
CLOSE ;
end if;
declare exit handler for sqlexception begin
rollback to start_transaction;
put_line(concat(ifnull(sqlerrm, '') , ' - ' , IFNULL(v_facility.ADV_FACI_ID, '')));
end;
fetch into;
end;
close;
END LOOP;
update dbs_recon_limit
set syndicated_limit_value = (select SYND_PERC * coalesce(activated_limit_value,0) from t_fro_result
where batch_id = (SELECT distinct first_value(D.SK_EOD_PROC_HIST_ID) over(partition by D.ADVF_ID order by D.VALUE_DATE desc,D.LAST_UPDATED desc)
FROM t_eod_proc_hist D
WHERE D.advf_id = facility_id
AND D.mtm_successful_flag = 'T'
AND D.curd_successful_flag = 'T'
AND D.EPH_TYPE not in (4,6))
and rownum = 1)
, syndicated_perc = (select SYND_PERC from t_fro_result
where batch_id = (SELECT distinct first_value(D.SK_EOD_PROC_HIST_ID) over(partition by D.ADVF_ID order by D.VALUE_DATE desc,D.LAST_UPDATED desc)
FROM t_eod_proc_hist D
WHERE D.advf_id = facility_id
AND D.mtm_successful_flag = 'T'
AND D.curd_successful_flag = 'T'
AND D.EPH_TYPE not in (4,6))
and rownum = 1)
where syndicated_perc is null or
syndicated_limit_value is null;
commit;
open rc_recon_limit for select CIF_NUMBER,
FACILITY_NAME,
LIMIT_CURRENCY,
max(ACTIVATED_LIMIT_VALUE) as ACTIVATED_LIMIT_VALUE,
syndicated_perc,
max(syndicated_limit_value) as syndicated_limit_value,
sum(UTILIZED_VALUE) as UTILIZED_VALUE,
PRODUCT_TYPE,
LIABILITY
from dbs_recon_limit
group by CIF_NUMBER,
FACILITY_ID,
FACILITY_NAME,
LIMIT_CURRENCY,
syndicated_perc,
PRODUCT_TYPE,
LIABILITY
order by CIF_NUMBER,
FACILITY_ID,
FACILITY_NAME,
LIMIT_CURRENCY,
syndicated_perc,
PRODUCT_TYPE NULLS FIRST;
end SP_Recon_Limit;
//
delimiter;



 Comments   
Comment by Elena Stepanova [ 2016-09-21 ]

anilvidhani,

If there is a MariaDB bug in there somewhere, please identify clearly what exactly, from your point of view, isn't working properly.
If you are trying to make a feature request, please also specify it.
If you just need help with implementing something, JIRA is not the right place for seeking it, try mailing lists instead; or, you might want to get a MariaDB support contract (https://mariadb.com/services/support).

Generated at Thu Feb 08 07:45:24 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.