Uploaded image for project: 'MariaDB Server'
  1. MariaDB Server
  2. MDEV-10849

issue with converting stored procedure from Oracle to MariaDB

    XMLWordPrintable

Details

    • Bug
    • Status: Closed (View Workflow)
    • Critical
    • Resolution: Not a Bug
    • 10.1.17
    • N/A
    • OTHER
    • DEV, TEST, Prod

    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;

      Attachments

        Activity

          People

            Unassigned Unassigned
            anilvidhani Anil
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Git Integration

                Error rendering 'com.xiplink.jira.git.jira_git_plugin:git-issue-webpanel'. Please contact your Jira administrators.